0

在我的 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;
}
4

1 回答 1

2

你打错电话了sqlite3_prepare_v2()。从文档中:

如果 nByte 参数小于零,则读取 zSql 直到第一个零终止符。如果 nByte 为非负数,则它是从 zSql 读取的最大字节数。当 nByte 为非负数时,zSql 字符串以第一个 '\000' 或 '\u0000' 字符或第 nByte 字节结束,以先到者为准。

因此,您的准备语句应如下所示(至少是最简单的更改):

int rc = sqlite3_prepare_v2(
   db,
   query.c_str(),
   -1,   // instructs SQLITE to read the entire statement up to the \0 terminator
   &stmt,
   0);
于 2012-11-19T21:21:28.920 回答