坚持在c ++ Qt中使用prepare()和bindvalue()

时间:2010-01-17 07:13:45

标签: c++ qt qtsql

我已经编写了一个基于Qt助手的SQL查询,它说你可以使用prepare()方法代替exec(),然后你可以通过两个叫做的方法来传递你的参数:登记/> bindvalue()addbindvalue()

以下是我的问题的代码段:

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()?

3 个答案:

答案 0 :(得分:5)

exec()调用失败了吗? 因为你所看到的可能是正常的,因为根据你使用的是哪个sql server,绑定可以由服务器(例如Oracle)完成。 根据Qt docs,executionQuery:“在大多数情况下,此函数返回与lastQuery()相同的字符串。 如果在不支持它的DBMS上执行带有占位符的准备好的查询,则准备此查询被模仿 “。所以,我想,如果服务器支持绑定值,则不会模拟准备,因此您只需查看查询而不将占位符替换为实际值。

答案 1 :(得分:3)

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

  

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

你的情况下连接是否打开?

答案 2 :(得分:0)

如果您想了解如何使用预准备语句构建查询,可以试试这个:

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