Получите ошибку SQL_MISUSE при попытке выполнить sqlite3_step через statemetn

На моей странице C ++ у меня есть заявление о подготовке

sqlite3_stmt *sqlstmt;

который возвращает SQLITE_OK при передаче данных через int

string query;
query = "select * from A;"int rc = sqlite3_prepare_v2(db,query.c_str(),0,&stmt,0);
if (SQLITE_OK != rc ){ return; }

функция.

Затем начните следующую строку.

int rc;
rc = sqlite3_step(sqlstmt);
//rc = 21 here.

Исключение из документации SQLITE3. Моя текущая версия 3.07.14.01, я верю.

http://www.sqlite.org/c3ref/step.html

SQLITE_MISUSE означает, что эта подпрограмма была вызвана неправильно. Возможно, он вызывался для подготовленного оператора, который уже был завершен, или для оператора, который ранее возвратил SQLITE_ERROR или SQLITE_DONE. Или это может быть случай, когда одно и то же соединение с базой данных используется двумя или более потоками в один и тот же момент времени.

Для всех версий SQLite до 3.6.23.1 включительно, вызов sqlite3_reset () был необходим после того, как sqlite3_step () возвратил что-либо кроме SQLITE_ROW перед любым последующим вызовом sqlite3_step (). Сбой сброса подготовленного оператора с помощью sqlite3_reset () приведет к возврату SQLITE_MISUSE из sqlite3_step (). Но после версии 3.6.23.1 sqlite3_step () начал автоматически вызывать sqlite3_reset () в этом случае, а не возвращать SQLITE_MISUSE. Это не считается нарушением совместимости, поскольку любое приложение, которое когда-либо получало ошибку SQLITE_MISUSE, по определению нарушается. Параметр времени компиляции SQLITE_OMIT_AUTORESET можно использовать для восстановления устаревшего поведения.

фактическая функция кода

vector cDataInterpretor :: getWorkingSet (int userID) {
вектор t_val;
векторное возвращение;
sqlite3 * дБ;
int rc;
rc = sqlite3_open (databasePath.c_str (), &дБ);
if (rc! = SQLITE_OK) {
sqlite3_close (дБ);
возврат t_val;
}
string query = «select * from insp_Assets;»;
char * errorMessage;

sqlite3_stmt *sqlstmt;
//rc = sqlite3_exec(db, query.c_str(), 0, 0, &errorMessage);

cout << "preparing statement"<<endl;
rc = sqlite3_prepare_v2(db, query.c_str(), 0, &sqlstmt, 0);
cout << "prepare code: "<<rc << endl;
if(rc != SQLITE_OK){
sqlite3_close(db);
return t_val;
}
cout << "Resetting call." <<endl;
rc = sqlite3_reset(sqlstmt);

cout << "about to start while"<<endl;
rc =sqlite3_step(sqlstmt);
cout << rc<<"|" << SQLITE_ROW <<"|" << SQLITE_OK <<"|"<<SQLITE_DONE<< endl;
while(rc == SQLITE_ROW){
//sset retVal (id,name,code,typeId,reportTypeId,parentAsset);
int id,typeID, reportTypeId;
id = sqlite3_column_int(sqlstmt, 0);
string name(reinterpret_cast<char const *>(sqlite3_column_text(sqlstmt, 1)));
string code(reinterpret_cast<char const *>(sqlite3_column_text(sqlstmt, 2)));
typeID = sqlite3_column_int(sqlstmt, 3);
reportTypeId = sqlite3_column_int(sqlstmt, 4);
string parentAsset(reinterpret_cast<const char *>(sqlite3_column_text(sqlstmt, 5)));
cout <<"Fetched Asset Data: "<< id <<"|"<<name<<"|"<<code<<"|"<<typeID<<"|"<<reportTypeId<<"|"<<parentAsset << endl;
Asset a (id, name, code, typeID, reportTypeId, parentAsset);
retVal.push_back(a);
rc = sqlite3_step(sqlstmt);
}
cout << "while ended, about to return."<<endl;
sqlite3_close(db);
return retVal;
}

0

Решение

Вы неправильно звоните sqlite3_prepare_v2(), От документация:

Если аргумент nByte меньше нуля, то zSql считывается до
Первый нулевой терминатор. Если nByte неотрицателен, то это
максимальное количество байтов, прочитанных из zSql. Когда nByte неотрицательный,
строка zSql заканчивается первым символом «\ 000» или «\ u0000»
или n-байтовый байт, в зависимости от того, что наступит раньше.

Итак, ваше подготовительное заявление должно выглядеть так (самое простое изменение, по крайней мере):

int rc = sqlite3_prepare_v2(
db,
query.c_str(),
-1,   // instructs SQLITE to read the entire statement up to the \0 terminator
&stmt,
0);
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector