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*'