Qt的QSqlQuery绑定值(bindValue)可以使用?占位符,但不能使用:冒号占位符

14

我正在使用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() 返回无法查询,无法获取行

对于为什么会出现这种情况,我一无所知,但我真的想找到答案。


你使用的是哪种 SQL 类型和版本?使用的是哪个 Qt 版本?使用的是哪个操作系统及其版本?你尝试过显式调用 .prepare() 方法来查看返回值吗?另外,你混合使用 "?" 和 ":" 的方法很奇怪,但这不应该有影响。 - László Papp
尝试使用 qDebug() << query->lastQuery() 打印出最后一个查询,以确保其正确。那会打印出什么呢?此外,在插入第二个案例之前,请检查表是否存在,你可以使用命令行客户端来进行双重检查。 - László Papp
@LaszloPapp 准备好一切了!谢谢! - user3136871
好的,太棒了。提交了一个答案以获得更好的可读性。 - László Papp
1个回答

16

请使用准备好的官方示例


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

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

 

如果查询不是一个空字符串,则将执行它。


问题在于使用构造函数"If query is not an empty string, it will be executed." - 因此在绑定之前查询被执行了... - LS_ᴅᴇᴠ
错误的原因是在绑定到相应的占位符之前执行了查询 - 在我看来,不起作用的代码似乎并没有在绑定到相应的占位符之前执行查询... 我错过了什么吗? - HelloGoodbye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接