【问题标题】:Got stuck on using prepare() and bindvalue() in c++ Qt在 c++ Qt 中使用 prepare() 和 bindvalue()
【发布时间】:2011-01-06 00:29:19
【问题描述】:

我已经编写了一个基于 Qt 助手的 SQL 查询,它说您可以使用 prepare() 方法而不是 exec() 然后您可以通过两个名为的方法传递您的参数:
@987654323 @和addbindvalue()

这是我的问题的 sn-p 代码:

Query->prepare("SELECT ID , Row , Col FROM sometable WHERE Row = :row AND Col = :col");
Query->bindValue(":row" , __Row);
Query->bindValue(":col" ,__Col);
Query->exec();
qDebug("%s" , Query->executedQuery().toStdString().c_str());

输出:

SELECT ID , Row , Col FROM sometable WHERE Row = ? AND Col = ?

而且我还使用了另一种建议的方式:

Query->prepare("SELECT ID , Row , Col FROM sometable WHERE Row = :row AND Col = :col");
Query->addBindValue(0 , __Row);
Query->addBindValue(1 ,__Col);
Query->exec();
qDebug("%s" , Query->executedQuery().toStdString().c_str());

输出:

SELECT ID , Row , Col FROM sometable WHERE Row = ? AND Col = ?

但是当我使用exec() 时,它通常可以完美运行,并且会替换相应的值而不是“?”。

对此有什么解释吗?还是应该使用普通的 exec()?

【问题讨论】:

  • 无关紧要的小评论,代替qDebug("%s",str.toStdString().c_str()),做qDebug() << str

标签: c++ qt qtsql


【解决方案1】:

exec() 调用失败了吗? 因为您所看到的可能没问题,因为取决于您使用的 sql 服务器,绑定可以由服务器(例如 Oracle)完成。 根据 Qt 文档,executedQuery:“在大多数情况下,此函数返回与 lastQuery() 相同的字符串。如果在不支持它的 DBMS 上执行带有占位符的准备好的查询,则准备此查询被模拟”。因此,我想,如果服务器支持绑定值,则不会模拟准备工作,因此您只会看到查询,而占位符不会被实际值替换。

【讨论】:

    【解决方案2】:

    这只是一个猜测,但我从http://qt.nokia.com/doc/4.6/qsqlquery.html 读到以下内容:

    警告:在创建 QSqlQuery 之前,您必须加载 SQL 驱动程序并打开连接。此外,查询存在时连接必须保持打开状态;否则,QSqlQuery 的行为是未定义的。

    在您的情况下连接是否打开?

    【讨论】:

      【解决方案3】:

      如果您想了解如何使用准备好的语句构造查询,可以尝试这样做:

      qDebug("%s" , Query.lastQuery().toStdString().c_str());
      

      【讨论】:

        猜你喜欢
        • 2019-04-09
        • 2015-01-22
        • 2013-03-31
        • 2016-02-18
        • 1970-01-01
        • 2014-01-14
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多