在我的 c++ 页面中,我有一个准备声明
sqlite3_stmt *sqlstmt;
当它通过 int 传递数据时返回 SQLITE_OK
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(包括 3.6.23.1)的所有版本,在 sqlite3_step() 返回除 SQLITE_ROW 之外的任何内容之后,在任何后续调用 sqlite3_step() 之前都需要调用 sqlite3_reset()。未能使用 sqlite3_reset() 重置准备好的语句将导致从 sqlite3_step() 返回 SQLITE_MISUSE。但是在 3.6.23.1 版本之后,sqlite3_step() 开始在这种情况下自动调用 sqlite3_reset() 而不是返回 SQLITE_MISUSE。这不被视为兼容性中断,因为任何收到 SQLITE_MISUSE 错误的应用程序都被定义为中断。SQLITE_OMIT_AUTORESET 编译时选项可用于恢复旧行为。
实际代码功能
向量 cDataInterpretor::getWorkingSet(int userID){ 向量 t_val; 向量 retVal; sqlite3 *db; 国际协调委员会;rc = sqlite3_open(databasePath.c_str(), &db); if(rc != SQLITE_OK){ sqlite3_close(db); 返回 t_val;} string query = "select * from insp_Assets;"; char* 错误消息;
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;
}