踩坑记:Poco库,MySql,解析大文本的bug

这两天在调试一个小功能,使用c++,读取MySql。使用的是Poco库。按照官网的写法:

    std::cout << "read normal data by poco recordset "<<std::endl;
	Poco::Data::MySQL::Connector::registerConnector();
	Poco::Data::Session session("MySQL", "host=127.0.0.1;port=3306;user=root;password=Citic@123;db=test");
	Poco::Data::Statement select(session);
	select << "select id,name from student ",now;//查询
	Poco::Data::RecordSet rs(select);//创建结果集
	bool more = rs.moveFirst();//第一条
	while (more)
	{
		int id = rs[0].convert<int>();//读取id
		std::string name = rs[1].convert<std::string>();//读取name
		std::cout << "id=" << id << " name=" << name << std::endl;//输出
		more = rs.moveNext();//下一条
	}

 代码没有问题,可以查询到数据,并输出:

换一张表,其中有一个字段是text,里面存储的数据比较大,4K个字符。结果就报错了。表结构如下:

查询代码:

	std::cout << "read normal data by poco recordset " << std::endl;
	Poco::Data::MySQL::Connector::registerConnector();
	Poco::Data::Session session("MySQL", "host=127.0.0.1;port=3306;user=root;password=Citic@123;db=test");
	Poco::Data::Statement select(session);
	select << "select uid,data1 from test ", now;
	Poco::Data::RecordSet rs(select);
	bool more = rs.moveFirst();
	while (more)
	{
		int id = rs[0].convert<int>();//读取id
		std::string data = rs[1].convert<std::string>();//读取data
		std::cout << "id=" << id << " data=" << data << std::endl;//输出
		more = rs.moveNext();//下一条
	}

两次代码一模一样,但是执行就报错了:

报错:ucrtbase.dll,处有未经处理的异常: 将一个无效参数传递给了将无效参数视为严重错误的函数。
这个dll属于系统C语言运行时。在网上搜相关的内容,基本上都是流读写或者关闭不正常导致。经在尝试各种方法以后,还是无法解决这个问题。

推测,应该是poco库本身在对mysql的大文本字段进行解析的时候,出bug了。只好另辟蹊径。偶然发现,RecordSet这个类,有一个copy(ostrem),大致意思是直接给recordset流拷贝一下。既然这样,那么就来尝试一下。

    std::cout << "read big data by ofstream" << std::endl;
	Poco::Data::MySQL::Connector::registerConnector();
	Poco::Data::Session session("MySQL", "host=127.0.0.1;port=3306;user=root;password=Citic@123;db=test");
	Poco::Data::Statement select(session);
	select << "select uid,data1 from test ", now;
	Poco::Data::RecordSet rs(select);//创建数据集,select对象给数据全部写入数据集
	std::ofstream outFile("data.txt");//创建一个文件流
	rs.copy(outFile);//流拷贝
	outFile.flush();//强制写入

这个代码的意思,创建一个文件流,输出到test.txt。然后直接从recordset把流拷贝走。如果成功的话,这个文件里面应该是mysql查询到的数据。

执行结果如上图所示。实际上,这就是mysql返回的查询结果,rescordset里面存储的就是这个。recordset再提供一些方法去从这个数据里面解析成一个个值。到此基本上发现了问题,就是Poco自带的解析方法,再解析大量数据的时候,出问题了。

所以:不想重新编译Poco库,那就想办法自己解析。解析办法,就是按字符串,一行一行去解析。代母如下:

	std::cout << "read big data by ostream" << std::endl;
	Poco::Data::MySQL::Connector::registerConnector();
	Poco::Data::Session session("MySQL", "host=127.0.0.1;port=3306;user=root;password=Citic@123;db=test");
	Poco::Data::Statement select(session);
	select << "select uid,data1 from test ", now;
	Poco::Data::RecordSet rs(select);//创建数据集,select对象给数据全部写入数据集
	std::stringstream  stm;//定义一个用于接收recoredset的字符串流
	rs.copy(stm);//结果集复制到字符串流
	stm.flush();//强制读取完毕
	char line[4500] = { 0 };//读取字符串流读取的缓存,要大于一行总字节长度
	stm.getline(line, 4500);//跳过标题 uid   ,  data1
	stm.getline(line, 4500);//跳过分割 --------------------
	int id = 0;//id变量
	std::string data = "";//data变量
	while (stm.getline(line, 4500))
	{
		sscanf(line, "%d ", &id);//解析id
		data = std::string(line + 17);//解析长文本
		std::cout << id << "-----" << data << std::endl;
	}

 

运行结果,解析成功,并且不报错。

解析原理就是把recordset里面的流先复制到字符串流,然后再一行一行的读取。前两行是标题和分隔符,后面是数据,按照自己定义的数据规则去读取。

line+17:因为uid是一个int,读取出来,占了16个字节,前面留空。uid和data1列之间有一个空格,所以,data1数据开始的下标是17。

到此问题解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/878929.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rust表达一下中秋祝福,群发问候!

一、Rust表达一下中秋祝福 在Rust中&#xff0c;表达中秋佳节的祝福可以通过定义一个包含祝福语的字符串变量&#xff0c;并使用标准输出函数来打印这个字符串。以下是一个简单的Rust程序示例&#xff0c;用于展示如何用Rust编写并打印中秋佳节的祝福语&#xff1a; fn main()…

Altium Designer常用操作备忘笔记

Altium Designer常用操作备忘笔记 Chapter1 Altium Designer常用操作备忘笔记Chapter2 Altium Designer 22.1.2使用总结&#xff08;常更&#xff09;一、原理图1.1 绘制元器件原理图1.2 绘制元器件封装1.3 修改原理图网格1.4 修改原理图库后更新当前原理图1.5 旋转和翻转1.6 悬…

一款rust语言AI神器cursor在ubuntu环境下的安装启动教程

虽然cursor目前只支持英文但是它强大的代码联想能力以及问答能力&#xff0c;可以高效的提高编码效率。 如下步骤所有的前提是你的ubuntu上面已经安装了vscode以及其必须的extensions。 1 下载 到官网https://www.cursor.com下载指定版本的软件。 下载到本地以后会生成如下软…

第二十六篇——九地篇:九种形势的应对之道

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 地势的维度重新阐述了懂得人心的重要性&#xff0c;道久其归一为为别人。…

S-Procedure的基本形式及使用

理论 Lemma 1. ( S- Procedure[ 34] ) : Define the quadratic func- \textbf{Lemma 1. ( S- Procedure[ 34] ) : Define the quadratic func- } Lemma 1. ( S- Procedure[ 34] ) : Define the quadratic func- tions w.r.t. x ∈ C M 1 \mathbf{x}\in\mathbb{C}^M\times1 x…

MATLAB 可视化基础:绘图命令与应用

目录 1. 绘制子图1.1基本绘图命令1.2. 使用 subplot 函数1.3. 绘图类型 2.MATLAB 可视化进阶(以下代码均居于以上代码的数据定义上实现)2.1. 极坐标图2.3. 隐函数的绘制 3.总结 在数据分析和科学计算中&#xff0c;数据可视化是理解和解释结果的关键工具。今天&#xff0c;我将…

替换 Oracle ,江河信息用 TDengine 解决高基数查询写入问题

在数字经济快速发展的背景下&#xff0c;智慧水利作为重要的基础设施之一&#xff0c;正逐步成为提升水资源管理效率、优化生态环境的重要力量。江西省水投江河信息技术有限公司&#xff08;以下简称“江河信息”&#xff09;作为高新技术国有企业&#xff0c;坚定致力于打造数…

RuoYi-Vue3使用minio图片预览不了的问题

参照官网配置好之后&#xff0c;图片预览不了 1、参照官网修改前端src\components\ImageUpload\index.vue 2、如果图片预览不了&#xff0c;发现是Minio后台返回的url地址内部包括逗号 与代码里split(",")冲突了&#xff0c; 解决方法是改成分号 多个图片可以预览了…

sqlgun靶场漏洞挖掘

1.xss漏洞 搜索框输入以下代码&#xff0c;验证是否存在xss漏洞 <script>alert(1)</script> OK了&#xff0c;存在xss漏洞 2.SQL注入 经过测试&#xff0c;输入框存在SQL注入漏洞 查询数据库名 查询管理员账号密码 此处密码为MD5加密&#xff0c;解码内容如下 找…

【C++】list常见用法

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;C从小白到高手 &#x1f339;往期回顾&#x1f339;&#xff1a;[C]vector常见用法 &#x1f516; 流水不争&#xff0c;争的是滔滔不息。 文章目录 一、list的介绍li…

mybatis的基本使用与配置

注释很详细&#xff0c;直接上代码 项目结构 源码 UserMapper package com.amoorzheyu.mapper;import com.amoorzheyu.pojo.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select;import java.util.List;Mapper //在运行时生成代…

ImportError: DLL load failed while importing _ssl: 找不到指定的模块的解决方法

ImportError: DLL load failed while importing _ssl: 找不到指定的模块的解决方法 现象解决办法 现象 在命令行中&#xff0c;可以正常导入_ssl模块&#xff0c;如下&#xff1a; Python 3.9.0 (default, Nov 15 2020, 08:30:55) [MSC v.1916 64 bit (AMD64)] :: Anaconda, …

LeetCode[中等] 49.字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 思路&#xff1a; new Dictionary<string, List<string>>() 存储数据&#xff0c;key为排序之后的字符…

箭头检测系统源码分享

箭头检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

QT 串口上位机读卡显示

目录 一. QT创建工程 二. 软件更换图标 三. QT打包 一. QT创建工程 文件新建&#xff0c;选择创建一个桌面QT。 重命名RFID,并选择工程保存路径 RFID.pro QT core gui serialport #串行串口greaterThan(QT_MAJOR_VERSION, 4): QT widgetsTARGET RFID TE…

LLMs之SWIFT:SWIFT的简介、安装和使用方法、案例应用之详细攻略

LLMs之SWIFT&#xff1a;SWIFT的简介、安装和使用方法、案例应用之详细攻略 目录 SWIFT的简介 新闻 &#x1f6e0;️ 安装 &#x1f680; 快速开始 Web-UI 训练 训练脚本 支持的训练过程 单卡训练 模型并行训练 数据并行训练 Deepspeed训练 多机多卡 阿里云-DLC多…

面试官:讲一讲Spring MVC源码解析

好看的皮囊千篇一律、有趣的灵魂万里挑一 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】获取福利&#xff0c;回复【项目】获取项目源码&#xff0c;回复【简历模板】获取简历模板&#xff0c;回复【学习路线图】获取学习路线图。…

【C++】——继承详解

目录 1、继承的概念与意义 2、继承的使用 2.1继承的定义及语法 2.2基类与派生类间的转换 2.3继承中的作用域 2.4派生类的默认成员函数 <1>构造函数 <2>拷贝构造函数 <3>赋值重载函数 <4析构函数 <5>总结 3、继承与友元 4、继承与静态变…

Linux(CentOS8)服务器安装RabbitMQ

我安装了很久都没有成功, 各种问题, 每次的异常都不一样, 现将成功安装过程做个总结 安装前工作 确保已经安装了一些基础工具和组件库 下载安装包 https://www.erlang.org/patches/otp-24.3.4.5 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.15/ra…

C/C++实现植物大战僵尸(PVZ)(打地鼠版)

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 游戏…