Форум программистов, компьютерный форум CyberForum.ru

Vector и Select SQLite - C++

Восстановить пароль Регистрация
 
madonzy
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
25.05.2014, 00:21     Vector и Select SQLite #1
Здравствуйте.
Столкнулся с двумя проблемами и не знаю в чём дело.

Есть метод класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 std::vector< std::vector<char*> > preSelect() {
 
            try {
 
                sqlite3_stmt *stmt;
                const char *query = "SELECT id, title FROM films";
                
                if(sqlite3_prepare(_db, query, -1, &stmt, 0 ) == SQLITE_OK) {
 
                    int colQ = sqlite3_column_count(stmt);
                    int execCode = 0;
 
                    std::vector< std::vector<char*> > data(20, std::vector<char*>(colQ));
 
                    int i = 0;
                    while (true) {
                        
                        execCode = sqlite3_step(stmt);
                        
                        if(execCode == SQLITE_ROW)
                            for (int j = 0; j < colQ; j++)
                                data[i][j] = (char*)sqlite3_column_text(stmt, j);
                        else
                            if(execCode == SQLITE_DONE) return data;
                            else if(execCode == SQLITE_ERROR) throw new LogException("Can't select data.", __LINE__, __FILE__);
                                 else throw new LogException("Unknown error in select statement.", __LINE__, __FILE__);
                        ++i;
                    }
 
                }else throw new LogException("Can't prepare select query.", __LINE__, __FILE__);
 
            }catch(LogException* log) {
                log->write();
 
                std::vector< std::vector<char*> > EmptySet(0, std::vector<char*>(0));
                return EmptySet;
            }
                    
        }
Первая проблема:
Когда я пытаюсь в main вывести:
C++
1
cout << test->preSelect()[0][0];
то получаю вот что: "X%N" (последний символ всегда меняется)
Когда:
C++
1
cout << test->preSelect()[0][1];
то получаю : "X§j" (последний символ всегда меняется)
А когда пытаюсь печатать в цикле for (прямо внутри метода) содержимое data[i][j] то всё прекрасно печатается.
Но опять же таки, стоит напечатать вне цикла for cout << data[0][0] тоже выдает те кракозяблы.

Вторая проблема в что в деструкторе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
~DB() {
            try {
                
                if(sqlite3Err) sqlite3_free(sqlite3Err);
                if(_isOpenDB)
                    if(sqlite3_close(_db) != SQLITE_OK)
                        throw new LogException("Can't close database.", __LINE__, __FILE__);
 
                if(!deleteInstance())
                    throw new LogException("Can't remove singleton variable.", __LINE__, __FILE__);
 
            }catch(LogException* log) {
                log->write();
            }
        }
при вызове метода preSelect возбуждается исключение что не может зарыть файл.
Помогите пожалуйста, уже вожусь с этим 3й час...
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
25.05.2014, 02:06     Vector и Select SQLite #2
Вам скорее всего нужно копировать данные(вы копируете значение указателя), тк указатели становятся невалидными
А лучше, ИМХО, использовать std::string вместо char*
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,215
Завершенные тесты: 1
25.05.2014, 02:11     Vector и Select SQLite #3
Цитата Сообщение от madonzy Посмотреть сообщение
Вторая проблема в что в деструкторе при вызове метода preSelect возбуждается исключение что не может зарыть файл.
Цитата Сообщение от madonzy Посмотреть сообщение
sqlite3_close(_db) != SQLITE_OK
в случае ошибки SQLITE API возвращает код ошибки, анализируя который, многие вопросы отпадут: могу предположить что она возвращает SQLITE_BUSY, потому что:

Цитата Сообщение от SQLite C Interface Closing A Database Connection
Applications must finalize all prepared statements and close all BLOB handles associated with the sqlite3 object prior to attempting to close the object. If sqlite3_close() is called on a database connection that still has outstanding prepared statements or BLOB handles, then it returns SQLITE_BUSY.
madonzy
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
25.05.2014, 02:27  [ТС]     Vector и Select SQLite #4
Цитата Сообщение от Cra3y Посмотреть сообщение
Вам скорее всего нужно копировать данные(вы копируете значение указателя), тк указатели становятся невалидными
А лучше, ИМХО, использовать std::string вместо char*
невероятно!! получилось!! спасибо Вам большое!!!! (а можно как-то без string)?? Может strcpy?
Цитата Сообщение от schdub Посмотреть сообщение
в случае ошибки SQLITE API возвращает код ошибки, анализируя который, многие вопросы отпадут: могу предположить что она возвращает SQLITE_BUSY, потому что:
как это проверить?
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,215
Завершенные тесты: 1
25.05.2014, 02:36     Vector и Select SQLite #5
Цитата Сообщение от madonzy Посмотреть сообщение
как это проверить?
Вам нужно запомнить что вернула sqlite3_close(_db) и добавить к информации исключения для последующего анализа.
madonzy
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
25.05.2014, 02:37  [ТС]     Vector и Select SQLite #6
Цитата Сообщение от schdub Посмотреть сообщение
Вам нужно запомнить что вернула sqlite3_close(_db) и вернуть это с исключением.
ну я имею в виду как закрыть соединение что-бы исключение не возбуждалось?
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,215
Завершенные тесты: 1
25.05.2014, 02:40     Vector и Select SQLite #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
вы вызываете sqlite3_finalize()?

http://www.sqlite.org/c3ref/stmt.html
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2014, 02:57     Vector и Select SQLite
Еще ссылки по теме:

Как корректно скопировать vector в vector внутри класса C++
Vector allocator SQLite C++
Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
madonzy
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
25.05.2014, 02:57  [ТС]     Vector и Select SQLite #8
Цитата Сообщение от schdub Посмотреть сообщение
вы вызываете sqlite3_finalize()?
забыл) спасибо вам обоим огромное!!
Yandex
Объявления
25.05.2014, 02:57     Vector и Select SQLite
Ответ Создать тему
Опции темы

Текущее время: 17:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru