Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 参数化查询中的参数计数不匹配_C++_Qt_Sqlite_Qtsql - Fatal编程技术网

C++ 参数化查询中的参数计数不匹配

C++ 参数化查询中的参数计数不匹配,c++,qt,sqlite,qtsql,C++,Qt,Sqlite,Qtsql,出于性能原因,我在代码中使用了很多参数化查询。简言之,它们中有些有效,有些无效 我在构建数据库包装器期间初始化查询,如下所示: QString querystring = QString("SELECT somevalue FROM sometable " "WHERE one_feature = :one_feature AND other_feature = :other_feature "); myquery = QSqlQuery(db); m

出于性能原因,我在代码中使用了很多参数化查询。简言之,它们中有些有效,有些无效

我在构建数据库包装器期间初始化查询,如下所示:

QString querystring = QString("SELECT somevalue FROM sometable "
                      "WHERE one_feature = :one_feature AND other_feature = :other_feature ");
myquery = QSqlQuery(db);
myquery.setForwardOnly(true);
myquery.prepare(querystring);
myquery
是我的数据库包装的
QSqlQuery
成员变量。稍后,在要使用此查询的函数中,我执行以下操作

int db_wrapper::fetch_some_value (int arg1, int arg2) {
    myquery.clear();
    myquery.bindValue(":one_feature", arg1);
    myquery.bindValue(":other_feature", arg2);

    qDebug() << "Bound values: " << myquery.boundValues();

    bool OK = myquery.exec();
    if (!OK) {
        int number = myquery.lastError().number();
        qDebug() << "db error " << number;
        qDebug() << "db error " << myquery.lastError().text();

#ifdef USE_EXCEPTIONS
        throw "Could not fetch some_value!";
#endif
    }

    // process data...
}
这种异常并不奇怪,但参数计数不匹配。调用
boundValues
实际上显示了正确的值和所有值,但我仍然收到此错误消息。我有类似的问题,但效果很好

我尝试替换位置绑定值,重命名占位符,使用
和位置绑定值,但都没有用。有人知道问题出在哪里吗


我使用Qt4.7.3和SQLite 3.7.4-2,通常这个错误意味着SELECT/UPDATE查询本身是不正确的。您没有给出数据库的架构,因此无法确定是哪一个。因此,数据库/表中没有一个或多个
somevalue
sometable
one\u feature
second\u feature

表中的字段是否声明为int?是否可以尝试使用文本(并传递带引号的字符串)?是的,在生成SQL脚本中,字段声明为
“一个\u功能”整数非空引用“功能表”(“id”)
。不幸的是,更改表不是一个选项。我还尝试在
querystring
中引用参数,但也不起作用。其他人的面包屑:我有这个错误,但我的问题是我没有引用带有倒勾的列名,而且我的列名也是sqlite关键字。对不起,我无法发布架构。但是,我尝试在SQLite数据库浏览器中使用值1和1(如示例中所示)替换参数来执行查询。这很好,那么query.clear()调用呢?是否像您在示例中指定的那样?如果在prepare()之后调用它,它将从查询中删除它。调用clear()通常不是必需的。事实上,对于引发此错误的一些查询,字段名的输入错误确实是罪魁祸首,所以我接受了这个答案。对于其他人,我仍然不知道,就像网上很多人一样。问题主要归咎于Qt在其发行版中使用了古老的sqlite头文件。感谢@arne,我的例子中也出现了这个问题。我有一个没有占位符的查询,它在SQLiteStudio中运行良好,但是QSqlQuery抛出了一个错误。这是一个联接的select,QSqlQuery需要在所有选定字段前加上带点的表名前缀。
Bound values:  QMap((":one_feature", QVariant(int, 1) ) ( ":other_feature" ,  QVariant(int, 1) ) )  
db error  -1 
db error  " Parameter count mismatch" 
terminate called after throwing an instance of 'char const*'