Qt 5与SQLite:bindValue()导致“参数计数不匹配”错误

时间:2014-07-10 19:16:54

标签: qt sqlite qt5 qtsql qsqlquery

我正在使用SQLite驱动程序在Windows 7上使用Qt 5.3.1(64位)进行简单的参数化查询。当我使用bindValue()设置查询的单​​个参数的值时,我系统地得到了可怕的“参数计数不匹配”错误。当我使用addBindValue()时,一切正常。请注意,bindValue()的代码适用于Qt 4.8.5(64位)。

以下是完整代码(main.cpp):

#include <QtSql>

int main(int, char* [])
{
    auto db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("db.sqlite");
    db.open();

    {
        QSqlQuery query("CREATE TABLE IF NOT EXISTS hashes (filepath TEXT, modified INTEGER, hash TEXT)", db);
        query.exec();
    }

    QSqlQuery query("SELECT modified FROM hashes WHERE filepath = :fp", db);
    query.bindValue(":fp", "test.jpg");

    if (!query.exec())
        qDebug() << query.lastError();

    db.close();

    return 0;
}

QtCreator项目文件(qtsqltest.pro):

QT += core sql
TARGET = qtsqltest
TEMPLATE = app
SOURCES += main.cpp

我的机器上的程序输出:

QSqlError("", "Parameter count mismatch", "")

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我没有在解决方案中添加注释的声誉,因此在这里,只是添加了另一个潜在的罪魁祸首:我试图将一个值绑定到列名,但遇到了Parameter count mismatch错误,无论实际错误是什么,这似乎都是错误消息:)

事实证明,这只是SQL的无效方法,请参见QSqlQuery with prepare and bindValue for column name Sqlite

所以不是

query.prepare("UPDATE connections SET (:columnName) = (:value) WHERE id = (:id)");
query.bindValue(":columnName", someColumnName);
query.bindValue(":value", someValue);
query.bindValue(":id", someId);

执行以下操作:

query.prepare(QString("UPDATE connections SET %1 = (:value) WHERE id = (:id)").arg(someColumnName));
query.bindValue(":value", someValue);
query.bindValue(":id", someId);
// etc.

这不是OP所做的,而是该线程是我搜索期间首先使用的线程,它可以节省其他人的时间。

答案 1 :(得分:2)

我刚发现我的问题与this one重复,且corresponding answer是正确的。

事实证明,根据documentation,传递给QSqlQuery的构造函数的查询字符串会立即执行。

目前尚不清楚为什么这些查询在Qt 4.8.5中运行正常,或者为什么在使用位置参数(使用?占位符)时它们与Qt 5.3.1一起使用,而它们在命名参数失败时(使用:占位符。