2012-12-18 110 views
1

這裏SQLite數據庫是我的代碼,似乎沒有被任何錯誤:通過使用Qt

QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE"); 
db.setDatabaseName("thedata.sqlite"); 
db.open(); 

QSqlQuery query; 
query.prepare("SELECT lastname FROM people where firstname='?' "); 
query.bindValue(0, lineEdit->text()); 

bool x = query.exec(); 

if(x){ 
    lineEdit_2->setText(query.value(0).toString()); 
} 

else { 
    QSqlError err; 
    err = query.lastError(); 
    QMessageBox::about(this,"error",err.text() ); 
} 

當程序工作總是它給人的錯誤parameter count mismatch我使用QT 4.8和自身使用sqlite的頭文件。

我會非常感謝任何建議,雖然我在谷歌搜索我看到很多帖子在這個問題上,但沒有什麼幫助我。

謝謝。

+0

你是否驗證過'lineEdit-> text()'實際返回了一些東西,最好是一個字符串? –

+0

@TimoGeusch是的,當然,我輸入他們的名字。 –

回答

2

你準備說法是錯誤的,它應該是:

quary.prepare("SELECT lastname FROM people where firstname=?"); 

注意,有沒有單引號(')周圍的佔位符。如果將引號放在引號中,它將作爲文本傳遞給數據庫,從而爲您提供無參數查詢和傳遞太多參數的代碼。

(改變這種變量名query將是一個很好的接觸過。)

你也需要檢查,如果QSqlQuery::prepare返回值,並打印出/顯示你從收到錯誤消息,如果它失敗–否則QSqlQuery::exec重置當前錯誤,如果在解析準備好的語句時出現問題,您將得到一個非常無意義的錯誤消息。

if(x){ 
    lineEdit_2->setText(quary.value(0).toString()); 
} 

這是不正確的。您需要調用(並檢查返回值)query.next()以將結果集定位到返回的第一行(如果有的話)。在撥打.next()之前,您不能使用.value(X)

+0

現在它沒有給出錯誤,但沒有任何反應。它不顯示lineEdit_2中的姓氏 –

+0

這是一個不同的問題。你需要用'query.next()'將結果集提前到第一行,否則'query'不在一行上。 – Mat

+0

確定接受爲答案。非常感謝你,我從來沒有發現過這種情況,我試圖解決這個問題好幾個小時。再次感謝... :) –