c/c++语言开发共享记录一个C++在条件查询时遇到的问题(推荐)

c++在条件查询时困扰了6个小时的小问题 先说结论1. 贴上运行错误的原码2. 错误分析2.1 sql语句错误2.2 sql语句替换2.3 继续问题分析 3.总结先说结论1:如果由%作为占位符.arg

c++在条件查询时困扰了6个小时的小问题 先说结论1. 贴上运行错误的原码2. 错误分析2.1 sql语句错误2.2 sql语句替换2.3 继续问题分析 3.总结

先说结论

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++条件查询内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/596122.html

(0)
上一篇 2021年5月8日
下一篇 2021年5月8日

精彩推荐