我已经编写了一个基于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()?
答案 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());