7

我正在使用 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", "")

任何想法?

4

2 回答 2

6

我刚刚发现我的问题与这个问题重复,并且相应的答案是正确的。

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

目前尚不清楚为什么此类查询在 Qt 4.8.5 中可以正常工作,或者为什么在使用位置参数(使用?占位符)时它们在 Qt 5.3.1 中可以正常工作,而在使用命名参数(使用:占位符)时它们会失败。

于 2014-07-11T07:20:54.210 回答
4

我没有为解决方案添加评论的声誉,所以在这里,只是为了添加另一个潜在的罪魁祸首:我试图将一个值绑定到列名,但我得到了Parameter count mismatch错误,这似乎是 -无论实际错误是什么,都会显示错误消息:)

事实证明,这只是一种无效的 SQL 方法,请参阅QSqlQuery with prepare 和 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 所做的,但这个线程是我搜索过程中首先出现的,它可能会为其他人节省一些时间。

于 2020-05-19T12:46:49.293 回答