2012-07-18 29 views
1

我想減少我的對象中的重複的sqlite代碼。要做到這一點,我想要一個有sqlite交互的方法,只需返回一個sqlite3_stmt。我的問題是,sqlite3_stmt指針始終爲空。我的問題是,我做錯了什麼或者不能用sqlite完成?使用C++可以從方法返回sqlite3_stmt嗎?

用法:

SqliteIO sqldb; 
string GET_CONFIG = "select* from config; "; 
sqlite3_stmt *statement; 
assert(sqldb.sqlForResults(GET_CONFIG, statement)); 
assert(statement != NULL); //this fails 

方法:

bool SqliteIO::sqlForResults(string pSql, sqlite3_stmt *statement){ 
bool lbRetVal=false; 

if(mDB == NULL){ 
    cerr << "No database to query"; 
    Logger::error("SqlliteIO::getAllScheuled() null database handle"); 
} else { 
    sqlite3_busy_timeout(mDB, 2000); 
    if(sqlite3_prepare_v2(mDB, pSql.c_str(), -1, &statement, 0) == SQLITE_OK) { 
     lbRetVal = true; 
    } 
    string error = sqlite3_errmsg(mDB); 
    if(error != "not an error"){ 
     cerr << pSql << " " << error << endl; 
     Logger::error("SqlliteIO::sqlForResults() "+ error + " " +pSql ); 
    } 
} 
return lbRetVal; 

回答

1
sqlite3_stmt *statement; // this never gets initialized 
assert(sqldb.sqlForResults(GET_CONFIG, statement)); 
assert(statement != NULL); //this fails 

中的代碼永遠不會被初始化(你要傳遞一份給sqlForResults()),該塊聲明變量。

坦率地說,你是幸運的,斷言失敗,因爲聲明可以有任何價值的垃圾(我猜的變量在調試模式下的零初始化爲你的編譯)

+0

這真的不回答這個問題。即使它被初始化爲null,我仍然沒有從該方法得到結果集。 – Jim 2012-07-18 17:49:51

+0

怎麼樣?聲明從不設置任何東西!在sqlForResults裏面,參數'statement'被設置爲某個值,但是不會影響另一個棧幀中的變量'statement'。你需要通過引用或指針來傳遞。 – Bwmat 2012-07-20 01:33:35

0

SqliteIO的語句參數:: sqlForResults()需要有sqlite3_stmt**類型,而不是sqlite3_stmt*。所以通話網站現在看起來像:

SqliteIO sqldb; 
string GET_CONFIG = "select* from config; "; 
sqlite3_stmt *statement = NULL; 
assert(sqldb.sqlForResults(GET_CONFIG, &statement)); 

如果沒有運營商&參考/地址的語句之前(如在原來的問題),你會的statement被傳遞給sqlForResults,這是NULL或0在這種情況下。在sqlForResults相關的變化是:

bool SqliteIO::sqlForResults(string pSql, sqlite3_stmt **statement){ 
bool lbRetVal=false; 

if(mDB == NULL){ 
    // ... 
} else { 
    // ... 
    if(sqlite3_prepare_v2(mDB, pSql.c_str(), -1, statement, 0) == SQLITE_OK) { 
     // ... 
    } 
    // ... 
} 
return lbRetVal; 

參數列表現在接受sqlite_stmt**阿根廷,我們通過直接向sqlite3_prepare_v2。在原始問題中,sqlForResults通過了&statementsqlite3_prepare_v2 - 這是SqliteIO::sqlForResults方法調用的statement參數的地址 - 這不是您想要的。

我知道這是一個老問題,但我希望這有助於。

編輯:爲了清楚,並逃避一些更多的代碼從sqlForResults

相關問題