Got stuck on using prepare() and bindvalue() in c++ Qt

Sey*_*emi 2 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());
Run Code Online (Sandbox Code Playgroud)

输出:

SELECT ID,Row,Col FROM sometable WHERE Row =?和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());
Run Code Online (Sandbox Code Playgroud)

输出:

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

但是当我exec()正常使用它完美地工作并将替换相应的值而不是"?".

那有什么解释吗?或者我应该使用普通的exec()?

小智 5

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