2

我已经编写了一个基于 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 = ? 和科尔 = ?

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

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 = ? 和科尔 = ?

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

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

4

3 回答 3

5

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

于 2010-01-17T08:05:40.223 回答
3

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

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

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

于 2010-01-17T08:17:20.553 回答
0

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

qDebug("%s" , Query.lastQuery().toStdString().c_str());
于 2011-05-15T23:30:16.280 回答