2011-07-06 95 views
1

我決定爲我的Qt應用程序測試sqlite數據庫。qt sqlite選擇語句

我已經創建了正確的語句(創建表等,並插入一些數據行)的SQLite數據庫文件。 我的問題是,當我執行select語句時,我沒有得到任何記錄。

這是我使用的代碼:

qq.sprintf("SELECT * from descriptors WHERE descriptors.id=%d ",idx); 
query.exec(qq); 
if(query.isSelect()){ 
    while (query.next()){ 

    int fff = query.value(0).toInt(); 

}}

的問題是,我從來沒有while循環中獲得。 query.next()似乎不起作用。

任何提示? 在此先感謝, Thodoris

p.s.我忘了寫我的配置如此:Qt 4.7.3,Windows 7,Visual Studio 2008

+1

你不應該這樣構造你的查詢。 [改爲使用綁定](http://www.sqlite.org/c3ref/bind_blob.html),否則[Little Bobby Tables](http://xkcd.com/327/)將再次出現。 – 2011-07-06 14:02:11

+0

感謝您的回答和漫畫。我用mysql的這種查詢構造並且工作正常。我會嘗試使用綁定來看看會發生什麼,我會更新 – theosem

+0

當然,它會正常工作。直到鮑比表出現。僅僅因爲它工作正常並不意味着它沒問題。這就像運行STOP標誌。它有效直到有人死亡。 –

回答

2

除了發佈錯誤hexa,query.isSelect()將始終返回true,即使查詢失敗。你需要檢查exec()的結果:

QSqlQuery query; 
query.prepare("SELECT * FROM descriptors WHERE id = ?"); 
query.bindValue(0, idx); // assuming idx is an integer/long/QVariant value 

if(!query.exec()) 
{ 
    // Error Handling, check query.lastError(), probably return 
} 

// Note: if you don't return in case of an error, put this into the else{} part 
while(query.next()) 
{ 
    int fff = query.value(0).toInt(); 
} 
+0

感謝您的回答,但這也沒有奏效。我想這不是語法的東西,但別的東西... 我會讓你全部更新我的結果。 再次感謝 – theosem

+0

好的感謝解決了。有一些問題的組合。首先是綁定,然後是沒有正確構造的數據庫文件(保存爲字符串的int)。再次感謝幫助解決這個問題 – theosem

0

在我的情況下,QSqlQueries的反向迭代工作。我認爲這可能是QSQLite驅動程序實現中某處的錯誤。

QSqlQuery q = db.exec("SELECT * FROM Table"); 
if (q.last()) { 
    do { 
     // Do something with row... 
    } while (q.previous()); 
}