2012-11-19 84 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