LINUX.ORG.RU

c++ sqlite

 ,


0

1

Доброго всем времени суток.

Пытаюсь из с++ под самосборным линуксом работать с sqlite, но не понятно поведение следующей функции

void execQuery(string cQuery)
{
    char *cTmp=(char*)cQuery.c_str();
    int iRetCode=0;
    if (bOpened) {
        sqlite3_reset(pRow);    //сбрасываем подготовленный раннее запрос
        sqlite3_finalize(pRow); //сбрасываем подготовленный раннее запрос
        iRetCode=sqlite3_prepare(conn,cTmp, -1, &pRow, 0);
        cout << "Ошибка " << sqlite3_errmsg(conn) <<  " при выполнении запроса в БД" << endl;

        cout << "cQuery=" << cQuery << endl;
        cout << "iRetCode=" << iRetCode << endl;
        //запись в базу, если update или insert
        if ((*cQuery.c_str() == 'U')||(*cQuery.c_str() == 'u')||(*cQuery.c_str() == 'I')||(*cQuery.c_str() == 'i')||(*cQuery.c_str() == 'B')||(*cQuery.c_str() == 'b')) sqlite3_step(pRow);
        if (iRetCode == SQLITE_OK) iNumCols=sqlite3_column_count(pRow);
        else cout << "Ошибка " << sqlite3_errmsg(conn) <<  " при выполнении запроса в БД" << endl;
        cout << "Ошибка " << sqlite3_errmsg(conn) <<  " при выполнении запроса в БД" << endl;
    }
    else cout << "Нет открытой базы данных" << endl;
}

на этапе подготовки запроса, а именно в функции sqlite3_prepare происходит какая-то ошибка и программа завершается, т.е. функция sqlite3_errmsg(conn) уже не выполняется. Если поменять sqlite3_prepare на sqlite3_prepare16, то вероятно не подойдёт кодировка и вывод sqlite3_errmsg(conn) будет примерно такой

Ошибка near "义䕓呒䤠呎⁏潌⁧琨浩ⱥ獭⥧嘠䱁䕕⁓∨〲㜰ㄭ㠭〠㐺㨳㤱Ⱒ∠铐뗐말臑苑닐룐近›∰㬩": syntax error при выполнении запроса в БД
как поменять кодировку через iconv не могу понять, ибо вот это не срабатывает. Пишет что Преобразованно 4294967295, при запросе INSERT INTO Log (time,msg) VALUES («2007-1-8 1:20:32», «Действия: 0»);
 size_t fl, tl;
 iconv_t d;
 fl=tl=strlen((char*)cQuery.c_str());
 d=iconv_open("UTF-16","UTF-8");
 char *from=(char*)cQuery.c_str();
 char *to;
 cout << "cQuery=" << cQuery << endl;
 cout << "Преобразованно " << iconv(d,&from, &fl,&to, &tl) << endl;;
 cout << "to=" << strlen(to) << endl;
 iconv_close(d);
почему не работает sqlite3_prepare тоже не ясно. Подскажите что я не так делаю



Последнее исправление: beastie (всего исправлений: 1)

Мне страшно

anonymous
()

c iconv вроде разобрался, но теперь поведение sqlite3_prepare и sqlite3_prepare16 идентично - программа прерывается без вывода ошибок

seijuurou
() автор топика

при запросе INSERT INTO Log (time,msg) VALUES («2007-1-8 1:20:32», «Действия: 0»);

Во-первых, строки должны быть в одинарных кавычках, а не двойных. Прочитай первые два абзаца вот здесь.

Во-вторых, использовать строки прямо в запросе плохо с точки зрения безопасности: слишком легко забыть экранировать строку. Лучше использовать связываение параметров (sqlite3_bind_*)

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.