2012-11-09 44 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