记录一个C++在条件查询时遇到的问题(推荐)

 更新时间:2021年01月22日 15:12:19   作者:小镇拾光  
这篇文章主要介绍了记录一个C++在条件查询时遇到的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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++条件查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C++通过COM接口操作PPT

    C++通过COM接口操作PPT

    这篇文章主要为大家详细介绍了C++通过COM接口操作PPT的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • C语言中常用的几个头文件及库函数

    C语言中常用的几个头文件及库函数

    这篇文章主要介绍了C语言中常用的几个头文件及库函数的相关资料,需要的朋友可以参考下
    2017-09-09
  • C++ atoi()函数用法案例详解

    C++ atoi()函数用法案例详解

    这篇文章主要介绍了C++ atoi()函数用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 纯C语言:递归二进制转十进制源码分享

    纯C语言:递归二进制转十进制源码分享

    这篇文章主要介绍了纯C语言:递归二进制转十进制源码,有需要的朋友可以参考一下
    2014-01-01
  • c++中临时变量不能作为非const的引用参数的方法

    c++中临时变量不能作为非const的引用参数的方法

    下面小编就为大家带来一篇c++中临时变量不能作为非const的引用参数的方法。小编觉得挺不错的现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 了解C++编程中指定的异常和未经处理的异常

    了解C++编程中指定的异常和未经处理的异常

    这篇文章主要介绍了C++中指定的异常和未经处理的异常,介绍了有关noexcept和terminate的作用,并结合了C++11标准的新特性,需要的朋友可以参考下
    2016-01-01
  • 使用C++创建多个IPC机制的上层接口

    使用C++创建多个IPC机制的上层接口

    设计一个上层的IPC接口,这个接口将在未来封装底层的通信机制,这样的设计要求接口足够抽象,以便于底层实现的细节对上层用户透明,本文给大家介绍了如何使用C++创建多个IPC机制的上层接口,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • C语言实现在windows服务中新建进程的方法

    C语言实现在windows服务中新建进程的方法

    这篇文章主要介绍了C语言实现在windows服务中新建进程的方法,涉及C语言进程操作的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C语言中判断一个char*是不是utf8编码

    C语言中判断一个char*是不是utf8编码

    这篇文章主要介绍了C语言中判断一个char*是不是utf8编码的相关资料,需要的朋友可以参考下
    2017-06-06
  • C/C++中的名字空间与作用域示例详解

    C/C++中的名字空间与作用域示例详解

    这篇文章主要给大家介绍了关于C/C++中名字空间与作用域的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c/c++具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧。
    2017-09-09

最新评论