Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
1

Vector и Select SQLite

25.05.2014, 00:21. Показов 1907. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Столкнулся с двумя проблемами и не знаю в чём дело.

Есть метод класса:
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й час...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.05.2014, 00:21
Ответы с готовыми решениями:

Vector allocator SQLite
Гуру, помогите новичку! Столкнулся с проблемой, и даже не понимаю в чем она... Надо: сделать...

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt;...

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>)
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало...

vector<Struct2{int,vector<struct1>}> или множественное наследование ...
Здравствуйте! Помогите, пожалуйста. Есть такие данные: typedef struct { int x; ...

7
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
25.05.2014, 02:06 2
Вам скорее всего нужно копировать данные(вы копируете значение указателя), тк указатели становятся невалидными
А лучше, ИМХО, использовать std::string вместо char*
1
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
25.05.2014, 02:11 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.
0
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
25.05.2014, 02:27  [ТС] 4
Цитата Сообщение от Cra3y Посмотреть сообщение
Вам скорее всего нужно копировать данные(вы копируете значение указателя), тк указатели становятся невалидными
А лучше, ИМХО, использовать std::string вместо char*
невероятно!! получилось!! спасибо Вам большое!!!! (а можно как-то без string)?? Может strcpy?
Цитата Сообщение от schdub Посмотреть сообщение
в случае ошибки SQLITE API возвращает код ошибки, анализируя который, многие вопросы отпадут: могу предположить что она возвращает SQLITE_BUSY, потому что:
как это проверить?
0
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
25.05.2014, 02:36 5
Цитата Сообщение от madonzy Посмотреть сообщение
как это проверить?
Вам нужно запомнить что вернула sqlite3_close(_db) и добавить к информации исключения для последующего анализа.
0
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
25.05.2014, 02:37  [ТС] 6
Цитата Сообщение от schdub Посмотреть сообщение
Вам нужно запомнить что вернула sqlite3_close(_db) и вернуть это с исключением.
ну я имею в виду как закрыть соединение что-бы исключение не возбуждалось?
0
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
25.05.2014, 02:40 7
Лучший ответ Сообщение было отмечено madonzy как решение

Решение

вы вызываете sqlite3_finalize()?

http://www.sqlite.org/c3ref/stmt.html
1
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
25.05.2014, 02:57  [ТС] 8
Цитата Сообщение от schdub Посмотреть сообщение
вы вызываете sqlite3_finalize()?
забыл) спасибо вам обоим огромное!!
0
25.05.2014, 02:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2014, 02:57
Помогаю со студенческими работами здесь

Ошибка [Linker error] undefined reference to `Vector::Vector(int)'
Добрый день. Делал по методички, и почему-то валятся ошибки... файл lab9_main.cpp #include...

Указатель на объект вектор в векторе vector < vector<int>* >*
Дело касается вот чего, есть такая вот незатейлевая вещь. #include &lt;vector&gt; #include &lt;iostream&gt; ...

Как сложить два vector и записать в третий vector ?
Не получается сложить два вектора по элементно и записать в третий . Складываю уже переведенные...

Как корректно скопировать vector в vector внутри класса
Есть класс принимающий в конструкторе vector: class test { test(std::vector&lt;std::string&gt;...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru