2012-11-09 42 views
4

以下代碼在QSqlQuery::exec()上失敗。當我運行沒有準備好的聲明參數查詢,它返回正確的結果,可作爲一個期望通過QSqlQuery::next()QSqlQuery準備SELECT語句在exec()上失敗

executedQuery()報道說":username"實際上不是由參數所取代,但有?(是否應該,因爲查詢沒有成功執行?)。

db_是一個QSqlDatabase類變量和isOpen()報告true。 Qt框架版本是4.7.3。

DBSql::userInfo(const QString &username, 
       QString &passwd, 
       QString &name, 
       UserPriv priv) 
{ 
    QSqlQuery userQuery(db_); 
    const QString userStr("SELECT u.id, u.fullname, u.password, p.description \ 
         FROM users u INNER JOIN privilege p ON u.privilege_id = p.id \ 
         WHERE u.username = :username"); 
    userQuery.bindValue(":username", username); 

    if (!userQuery.prepare(userStr)) 
    std::cout << "prepare failed" << std::endl; 

    if (userQuery.exec()) { 
    while (userQuery.next()) { 
     userId = userQuery.value(0).toInt(); 
     name = userQuery.value(1).toString(); 
     passwd = userQuery.value(2).toString(); 
     const QString privilegeDesc = userQuery.value(3).toString(); 
    } 
    } 
} 
+3

嘗試結合價值 – Furkan

+0

你泄露你的QSqlQuery資源之前調用準備方法。你應該使用一個簡單的自動變量:'QSqlQuery userQuery(db _);'編輯 – octal

+0

,謝謝。它最初不是用堆分配編寫的,但我試圖將它看作是一種絕望的最後手段,以查看行爲是否改變。 –

回答

6

你必須調用userQuery->prepare(userStr)userQuery->bindValue(":username", username)

+0

你是對的,先生。證實。 :)我如何upvote你的答案?它說我需要15點聲望才能這樣做。 –

+0

只是它作爲答案,如果它解決了你的問題。 – JustMaximumPower