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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
madonzy
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
#1

Vector и Select SQLite - C++

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

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

Есть метод класса:
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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2014, 00:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Vector и Select SQLite (C++):

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

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

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

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

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

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

7
Max Dark
шКодер самоучка
1841 / 1641 / 598
Регистрация: 09.10.2013
Сообщений: 3,664
Записей в блоге: 6
Завершенные тесты: 2
25.05.2014, 02:06 #2
Вам скорее всего нужно копировать данные(вы копируете значение указателя), тк указатели становятся невалидными
А лучше, ИМХО, использовать std::string вместо char*
1
schdub
2952 / 1297 / 239
Регистрация: 19.01.2009
Сообщений: 3,410
Завершенные тесты: 1
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
madonzy
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
schdub
2952 / 1297 / 239
Регистрация: 19.01.2009
Сообщений: 3,410
Завершенные тесты: 1
25.05.2014, 02:36 #5
Цитата Сообщение от madonzy Посмотреть сообщение
как это проверить?
Вам нужно запомнить что вернула sqlite3_close(_db) и добавить к информации исключения для последующего анализа.
0
madonzy
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
25.05.2014, 02:37  [ТС] #6
Цитата Сообщение от schdub Посмотреть сообщение
Вам нужно запомнить что вернула sqlite3_close(_db) и вернуть это с исключением.
ну я имею в виду как закрыть соединение что-бы исключение не возбуждалось?
0
schdub
2952 / 1297 / 239
Регистрация: 19.01.2009
Сообщений: 3,410
Завершенные тесты: 1
25.05.2014, 02:40 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
вы вызываете sqlite3_finalize()?

http://www.sqlite.org/c3ref/stmt.html
1
madonzy
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
25.05.2014, 02:57  [ТС] #8
Цитата Сообщение от schdub Посмотреть сообщение
вы вызываете sqlite3_finalize()?
забыл) спасибо вам обоим огромное!!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2014, 02:57
Привет! Вот еще темы с ответами:

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

Записать числа из файла в двумерный массив или вектор вроде такого vector<vector<int>> - C++
Добрый день, подскажите пожалуйста как лучше и проще считывать файл. в файле записаны числа, разделенные пробелами и запятыми: 1, 2, 3,...

При include<vector> не включает и не видит vector - C++
Не видит vector: //--ClassNeuron.h #ifndef NEURON_H #define NEURON_H #include &lt;cstdlib&gt; #include...

Записать vector<vector<wchar_t>> в текстовый файл - C++
Подскажите пожалуйста, как записать vector&lt;vector&lt;wchar_t&gt;&gt; в файл. Файл необходимо открывать через _wfopen. Пробую так, не получается....


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
25.05.2014, 02:57
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru