我有以下代码应该将值绑定到准备语句:
QSqlQuery query(db);
query.setForwardOnly(true);
query.prepare("SELECT Entry.* FROM Entry WHERE body LIKE ?;");
query.addBindValue(QVariant("%" + name + "%"));
query.exec();
tDebug("%s", query.executedQuery().toUtf8().data());
例如,如果name
"thing"
,则查询应该SELECT Entry.* FROM Entry WHERE body LIKE "%thing%"
执行语句,但它执行SELECT Entry.* FROM Entry WHERE body LIKE ?
,几乎就像绑定值被忽略一样。命名占位符也有同样的问题。
我在一个等效的例子中尝试了这个,并适当地测试了"prepare"和"exec"的结果,它们都返回布尔值。我测试了这些值在执行后是否正常:
QList<QVariant> list = query.boundValues().values();
for (int i = 0; i < list.size(); ++i)
qDebug() << i << ": " << list.at(i).toString();
我测试了我得到了预期的结果
while (query.next())
qDebug()<<"result = "<<query.value(0);
事实上,executedQuery
没有包含有界值,但Qt中的注释对此有些模糊:
"如果在不支持它的DBMS上执行带有占位符的准备好的查询,则会模拟此查询的准备。原始查询中的占位符将替换为其绑定值以形成新查询。此函数返回修改后的查询。它主要用于调试目的。
所以我假设对于 postgresql(我所拥有的(和 SQLite,executedQuery
确实返回带有占位符而不是有界值的原始内容。