2010-01-17 247 views
2

我写了一个基于Qt助手的SQL查询,它说您可以使用prepare()方法而不是exec(),那么您可以通过帮助传递参数两种方法叫:
bindvalue()addbindvalue()在C++中使用prepare()和bindvalue()Qt

这里是我的问题的代码片段:

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 =?和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,行,列FROM sometable其中row =?和Col =?

但是当我通常使用exec()它通常会很好地工作,并会替换相应的值而不是“?”。

有没有解释?或者我应该使用普通的exec()?

+0

小无关评论,( “%S”,str.toStdString()c_str())。 ','qDebug()<< str'。 – 2010-06-21 15:42:02

回答

5

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

3

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

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

连接在您的情况下打开吗?

0

,如果你想查询预处理语句如何构建你可以试试这个:不是`qDebug

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