2012-11-19 48 views
0

在我的C++页面中,我有一个preparement声明获取尝试通过statemetn

sqlite3_stmt *sqlstmt; 

当它通过INT

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

功能传递的数据返回SQLITE_OK到sqlite3_step时SQL_MISUSE错误。

然后开始下一行。

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。或者在同一时刻两个或更多线程正在使用相同的数据库连接。

对于直到并包括3.6.23.1,调用sqlite3_reset SQLite的所有版本()是sqlite3_step后需要()返回比SQLITE_ROW其他任何sqlite3_step的任何后续调用之前()。未能使用sqlite3_reset()重置准备好的语句将导致sqlite3_step()返回SQLITE_MISUSE。但是在版本3.6.23.1之后,sqlite3_step()在这种情况下自动调用sqlite3_reset()而不是返回SQLITE_MISUSE。这不被视为兼容性中断,因为任何曾接收到SQLITE_MISUSE错误的应用程序都按定义中断。 SQLITE_OMIT_AUTORESET编译时选项可用于恢复传统行为。

实际代码功能

矢量cDataInterpretor :: getWorkingSet(INT用户ID){ 矢量t_val; vector retVal; sqlite3 * db; int rc; rc = sqlite3_open(databasePath.c_str(),& db);如果(rc!= SQLITE_OK){sql_3_close(db); return 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; 
} 
+1

的'sqlite3_prepare_vb'功能不存在。请正确复制并粘贴失败的代码。另外,请包括您编译的查询。 – cdhowie

+0

是的,错误的。 v2 * – Fallenreaper

+0

好的,太好了。和查询? – cdhowie

回答

2

您错误地致电sqlite3_prepare_v2()。从documentation

如果nbyte参数小于零,则ZSQL被读取到 第一0终结。如果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); 
+0

谁是救命者?这家伙。 ^^^ – Fallenreaper