在C++ QT中使用PayRead()和BDIVALULVE()

在C++ QT中使用PayRead()和BDIVALULVE(),c++,qt,qtsql,C++,Qt,Qtsql,我已经基于Qt assistant编写了一个SQL查询,它说您可以使用prepare方法而不是exec,然后您可以通过两个方法传递参数,这两个方法称为: bindvalue和addbindvalue 以下是我的问题的代码片段: Query->prepare("SELECT ID , Row , Col FROM sometable WHERE Row = :row AND Col = :col"); Query->bindValue(":row" , __Row); Query-&g

我已经基于Qt assistant编写了一个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());
输出:

从sometable中选择ID、Row、Col,其中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());
输出:

从sometable中选择ID、Row、Col,其中Row=?和Col=

但是当我正常使用exec时,它工作得很好,将替换相应的值而不是

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

这只是一个猜测,但我从以下内容中了解到:

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


在您的案例中连接是否打开?

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

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

不相关的小注释,而不是qDebug%s,str.toStdString.c_str,do qDebug