我有以下代码,用于将值绑定到准备语句:
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 ?,就好像绑定值被忽略了一样。命名占位符也有同样的问题。
发布于 2018-06-01 14:00:52
我在一个等价的例子中尝试了这一点,并对“准备”和"exec“的结果进行了适当的测试,这两个结果都返回一个布尔值。我测试了在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上执行已准备好的占位符查询,则此查询的准备工作是将原始查询中的emulated.The占位符替换为它们的绑定值,以形成新的查询。此函数返回修改后的查询。它对调试非常有用。”
因此,我假设对于postgresql (我所拥有的)和SQLite,executedQuery确实返回带有占位符而不是有界值的原始值。
https://stackoverflow.com/questions/50643407
复制相似问题