记录一个C++在条件查询时,遇到的问题。
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了记录一个C++在条件查询时,遇到的问题。,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3322字,纯文字阅读大概需要5分钟。
内容图文
C++在条件查询时困扰了6个小时的小问题
先说结论
1:如果由
%作为占位符.arg()传参
的模式,则sql_query.exec(sql_str)执行查询
时,必须加上查询语句。
2:如果由?作为占位符.addBindValue()
传参的模式,则sql_query.exec()执行查询
时,不可加上查询语句。
1. 贴上运行错误的原码
int InputManage::queryInputsByUserId(int userId,map<uint,Model_AllInPut> &AInputMap){
if(!db.openDB()){
db.openDB();
}
qDebug()<<"用户ID为::::"<<userId; //打印正确为1
QSqlQuery sql_query; //数据库查询对象
QString select_str = "select * from t_allinput where UserId = ?";//条件查询语句,将?改为1放到Navicat中可查询出结果
sql_query.prepare(select_str); //预处理
sql_query.addBindValue(userId); //根据传入的id去查询记录
if(!sql_query.exec(select_str)) //执行查询sql语句
{
qDebug()<<sql_query.lastError();
}
else
{
while(sql_query.next()) //遍历结果
{
Model_AllInPut AInput;
AInput.setAllInPutId(sql_query.value(0).toUInt()); //根据index遍历
uint Id = AInput.AllInPutId();
AInput.setConcrete_compressive_grade(sql_query.value(1).toString());
//... 省略中间字段 ...
AInput.setUserId(sql_query.value(19).toUInt());
AInputMap[Id]= AInput; //将键值对放入map中
}
db.closeDB();
return AInputMap.size();
}
db.closeDB();
return 0;
}
结果,Qt Creater报错:参数个数不匹配(“Parameter count mismatch”)。
2. 错误分析
2.1 sql语句错误
2.1.1 数据库字段不匹配
我看了数据库结构,表名字段名确认没问题(在Navicat中可进行查询);
?为英文也没问题;
UserId字段为整形,不用加引号的,但死马当活马医试一试。
然后我在?上加单引号,不报错了,但是查询出的记录个数为0。
2.1.2 占位符的问题
分析原因:不带条件查询能查询出来,并且我在Navicat中条件查询将?替换成具体的数值也可以查询出来。
所以问题很可能是出在?占位符上。(这里不再区分?的中英文了,都是英文,为了方便不再切换为英文)
2.2 sql语句替换
于是询问同学,同学看了也不太清楚,换上同学的%占位符进行语句查询。结果: 查 询 成 功,我的天那!!!
仅将sql语句替换为如下:
QString select_str = QString( "select * from t_allinput where UserId = '%1'").arg(userId);//条件查询语句,
2.3 继续问题分析
为什么我会迷茫:因为我的其它表中也含有类似 where 字段名 = ?
的条件查询语句。
其它表都能运行成功,为什么这个表不行?
首先我怀疑是因为这个表查询的字段不是主键。(我知道是不是主键影响不大,但还是尽可能试一试)
于是我将字段改为主键字段进行查询,错误依旧。
被逼无奈我将两个表的条件查询函数逐字比较
,最后发现原来问题出执行查询sql语句
的地方。
对比:
if(!sql_query.exec(select_str)) //执行查询sql语句
if(!sql_query.exec()) //执行查询sql语句
3.总结
条件查询的占位符与查询执行的匹配:
1:如果由
%作为占位符.arg()传参
的模式,则查询语句执行时需要加上查询语句。(已验证,必须加上)
2:如果由?作为占位符.addBindValue()
传参的模式,则查询语句执行时不可以加上查询语句。
示例1:
QSqlQuery sql_query; //数据库查询对象
QString select_str = QString( "select * from t_allinput where UserId = '%1'").arg(userId);//%作为占位符.arg()传参
sql_query.prepare(select_str); //预处理
if(!sql_query.exec(select_str)) //+++++ 必须带查询语句 ++++++++//
示例2:
QSqlQuery sql_query; //数据库查询对象
QString select_str = "select * from t_allinput where UserId = ?"; //?作为占位符
sql_query.prepare(select_str); //预处理
sql_query.addBindValue(userId); //.addBindValue()传参
if(!sql_query.exec()) //+++++ 不可带查询语句 ++++++++//
内容总结
以上是互联网集市为您收集整理的记录一个C++在条件查询时,遇到的问题。全部内容,希望文章能够帮你解决记录一个C++在条件查询时,遇到的问题。所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。