【问题标题】:Qt 5 with SQLite: bindValue() results in "Parameter count mismatch" error带有 SQLite 的 Qt 5:bindValue() 导致“参数计数不匹配”错误
【发布时间】:2014-09-01 07:13:33
【问题描述】:

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

有什么想法吗?

【问题讨论】:

标签: qt sqlite qt5 qtsql qsqlquery


【解决方案1】:

我没有为解决方案添加评论的声誉,所以在这里,只是添加另一个潜在的罪魁祸首:我试图将一个值绑定到列名,但我得到了 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 所做的,但这个线程是我搜索过程中首先出现的,它可能会为其他人节省一些时间。

【讨论】:

    【解决方案2】:

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

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

    目前尚不清楚为什么此类查询在 Qt 4.8.5 上运行良好,或者为什么在使用位置参数(使用 ? 占位符)时它们在 Qt 5.3.1 上运行而在命名参数(使用 @ 987654326@ 占位符)。

    【讨论】:

    • 我遇到了类似的问题,但在我的情况下,解决它的方法是在查询中添加括号,所以我必须使用 query.prepare( "INSERT INTO tablename (columnname) VALUES :placeholder" ); 而不是 query.prepare( "INSERT INTO tablename (columnname) VALUES (:placeholder)" );
    • 我遇到了类似的问题(正确使用了 prepare),但我的错误是 sql 查询中的拼写错误(我有“SELECT a, b, cFROM table”而不是“SELECT a, b , c FROM table")...错误消息“参数计数不匹配”在这里真的很误导...可能会帮助某人,祝你好运!
    • 我也有类似的问题。但我在 set datadase path > db.setDatabaseName(path); 处错了
    猜你喜欢
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 2011-06-25
    • 2017-08-10
    相关资源
    最近更新 更多