Qt QSqlQuery bindValue 适用于?但不是 :placeholders

Posted

技术标签:

【中文标题】Qt QSqlQuery bindValue 适用于?但不是 :placeholders【英文标题】:Qt QSqlQuery bindValue works with ? but not with :placeholders 【发布时间】:2014-01-14 04:17:03 【问题描述】:

我正在使用 SQLite,插入到表中。跟风

QSqlQuery testQuery(QString("INSERT INTO test(testcol) VALUES(?)"));
testQuery.bindValue(0, someQStringObg);
testQuery.exec();

有效,但是

QSqlQuery testQuery(QString("INSERT INTO test(testcol) VALUES(:val)"));
testQuery.bindValue(":val", someQStringObg);
testQuery.exec();

不要。 testQuery.lastError().text() 返回 No query Unable to fetch row

不知道为什么会这样,但真的很想知道。

【问题讨论】:

您使用的是哪种sql类型和版本?哪个Qt版本?哪个操作系统,哪个版本?您是否尝试过显式调用 .prepate() 来查看返回值?另外,你把“?”混在一起很奇怪。和 ":" 方法,尽管这无关紧要。 尝试用这个打印出最后一个查询:qDebug () << query->lastQuery() 只是为了确保。打印出来的是什么?另外,您能否在插入第二种情况之前检查该表是否正确存在?您可以使用命令行客户端进行双重检查。 @LaszloPapp 准备好一切正常!谢谢! 好的,太好了。提交答案以获得更好的可读性。 【参考方案1】:

请使用 prepare 作为official example:

QSqlQuery testQuery;
testQuery.prepare("INSERT INTO test(testcol) VALUES(:val)");
testQuery.bindValue(":val", someQStringObj);
testQuery.exec();

错误的原因是在绑定到相应的占位符之前执行了查询。相关部分可以看constructor documentation:

如果查询不是空字符串,则执行。

【讨论】:

问题是使用构造函数“如果查询不是空字符串,它将被执行。” - 所以查询是在绑定之前执行的... "错误的原因是查询是在绑定到对应占位符之前执行的"——看起来好像不起作用的代码在绑定到对应占位符之前执行了查询对我来说......我错过了什么吗?

以上是关于Qt QSqlQuery bindValue 适用于?但不是 :placeholders的主要内容,如果未能解决你的问题,请参考以下文章

QSqlQuery 与列名 Sqlite 的 prepare 和 bindValue

QSqlQuery如何获取计数值?

qt : QSqlQuery 返回 QVariant 的向量

Qt SQL:QSqlQuery

QT哪里设置QSqlquery.exe()的查询超时时间的

42.QT-QSqlQuery类操作SQLite数据库(创建查询删除修改)详解