Доброго всем времени суток.
Пытаюсь из с++ под самосборным линуксом работать с 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 при выполнении запроса в БД
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);