C++:Stmt预处理SQL与大文件存取(五)

1、预处理相关API
  • mysql_stmt_init:初始化生成一个预编译处理的Stmt对象
  • mysql_stmt_prepare:预处理SQL语句,值部分用?进行占位(可以防止SQL注入)
  • mysql_stmt_bind_param:给预处理的SQL语句中的?进行值绑定
    • MYSQL_BIND:
      • MYSQL_TYPE_XXX:数据类型,int、long、string、blob…
      • buffer:数据值的指针
      • buffer_length:数据长度,如果是整形数据可以不传入
  • mysql_stmt_execute:执行SQL语句
  • mysql_stmt_close:关闭Stmt对象
MYSQL_STMT * STDCALL mysql_stmt_init(MYSQL *mysql);
int STDCALL mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, unsigned long length);
my_bool STDCALL mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt);
my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt);
2、通过预编译接口插入图片到数据库
  • 将一张图片存到数据库中然后再从数据库中读取出来
2.1、建立连接
MYSQL mysql;// 初始化mysql结构体并且初始化服务连接环境mysql_init(&mysql);const char *host = "127.0.0.1";const char *user = "root";const char *password = "123456";const char *db = "cpp";int timeout = 3;// 连接超时时长设置mysql_options(&mysql, MYSQL_OPT_CONNECT_TIMEOUT, &timeout);// 断开重连设置int reconnect = 1;mysql_options(&mysql, MYSQL_OPT_RECONNECT, &reconnect);// MySQL连接建立if(!mysql_real_connect(&mysql, host, user, password, db, 3306, 0, CLIENT_MULTI_STATEMENTS)){std::cout << "mysql connect failed!" << mysql_error(&mysql) << std::endl;}else{std::cout << "mysql connect " << host << " success!" << std::endl;}// .....mysql_close(&mysql);mysql_library_end();
2.2、创建表

MySQL中存取文件可以用blob来表示,表示使用二进制的方式存储

void create_table(MYSQL &mysql)
{string sql = "CREATE TABLE IF NOT EXISTS `t_data` (\`id` int(10) unsigned AUTO_INCREMENT,\`name` varchar(1024),\`data` blob,\`size` int,\PRIMARY KEY (`id`)\) ENGINE=InnoDB DEFAULT CHARSET=utf8;";if(mysql_real_query(&mysql, sql.c_str(), sql.length()) != 0){cout << "mysql_query failed!" << endl;}
}
2.3、存入图片到MySQL中

这里主要通过ftsream来计算文件的大小,也可以通过其他手段,例如stat.h、lseek函数(Linux环境)

void insert_picture(MYSQL &mysql)
{// 1. 初始化stmt预处理对象MYSQL_STMT *stmt = mysql_stmt_init(&mysql);string sql = "insert into `t_data`(`name`, `data`, `size`) values(?,?,?);";if(mysql_stmt_prepare(stmt, sql.c_str(), sql.length()) != 0){cerr << "mysql_stmt_prepare failed!" << mysql_stmt_error(stmt) << endl;}// 2. 绑定数据string filename = "touxiang.jpg";fstream in(filename, ios::in | ios::binary);if (!in.is_open()){cerr << "open file error!" << endl;}in.seekg(0, ios::end);int filesize = in.tellg();in.seekg(0, ios::beg);char *data = new char[filesize];int readed = 0, current_filesize = filesize;while(!in.eof()){in.read(data+readed, current_filesize-readed);if(in.gcount() <= 0)        break;readed += in.gcount();}in.close();MYSQL_BIND bind[3] = {0};bind[0].buffer_type = MYSQL_TYPE_STRING;bind[0].buffer = (char *)filename.c_str();bind[0].buffer_length = filename.length();bind[1].buffer_type = MYSQL_TYPE_BLOB;bind[1].buffer = data;bind[1].buffer_length = filesize;bind[2].buffer_type = MYSQL_TYPE_LONG;bind[2].buffer = &filesize;// 3. 将占位符的参数替换成实际数据if(mysql_stmt_bind_param(stmt, bind) != 0) {cerr << "mysql_stmt_bind_param error!" << endl;}// 4. 执行实际的mysql语句if(mysql_stmt_execute(stmt) != 0){cerr << "mysql_stmt_execute error!" << mysql_stmt_error(stmt) << endl;}else{cout << "mysql_stmt_execute success! affect row = " << mysql_stmt_affected_rows(stmt) << ", insert data id = " << mysql_stmt_insert_id(stmt) << endl;}// 5. 关闭连接if(mysql_stmt_close(stmt) != 0){cerr << "mysql_stmt_close error!" << endl;}// 释放所有资源delete []data;
}
2.4、将数据库中的图片取出来
void select_data(MYSQL &mysql)
{string sql = "select *from `t_data` limit 0, 1";if (mysql_real_query(&mysql, sql.c_str(), sql.length()) != 0){cerr << "mysql_real_query error" << mysql_error(&mysql) << endl;}MYSQL_RES *result = mysql_store_result(&mysql);MYSQL_ROW  row = mysql_fetch_row(result);if(!row){cerr << "mysql_fetch_row error" << mysql_error(&mysql) << endl;}unsigned long* lens = mysql_fetch_lengths(result);MYSQL_FIELD *mysqlField = mysql_fetch_fields(result);int field_count = mysql_num_fields(result);for(int i = 0;i < field_count;i++){cout << mysqlField[i].name << " , length = " << lens[i] << endl;}string filename("out_");filename += row[1];fstream out(filename, ios::out | ios::binary);if(!out.is_open()){cerr << "open file failed!" << endl;}out.write(row[2], lens[2]);out.flush();out.close();
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据仓库实践

什么是数据仓库&#xff1f; 数据仓库是一个用于存储大量数据并支持数据分析与报告的系统。它通常用于集成来自不同来源的数据&#xff0c;提供一个统一的视图&#xff0c;以便进行更深入的分析和决策。 数据仓库的主要优势&#xff1f; 决策支持&#xff1a;为企业决策提供可靠…

渗透知识贴

文章目录 基础知识同源策略 常见web漏洞SQL注入漏洞 web中间件 基础知识 同源策略 同源策略是目前所有浏览器都实行的一种安全政策。A网页设置的 Cookie&#xff0c;B网页不能打开&#xff0c;除非这两个网页同源。所谓同源&#xff0c;是指&#xff1a;协议、端口、域名相同…

Windows Server 2008添加Web服务器(IIS)、WebDAV服务、网络负载均衡

一、Windows Server 2008添加Web服务器&#xff08;IIS&#xff09; &#xff08;1&#xff09;添加角色&#xff0c;搭建web服务器&#xff08;IIS&#xff09; &#xff08;2&#xff09;添加网站&#xff0c;关闭默认网页&#xff0c;添加默认文档 在客户端浏览器输入服务器…

面试算法-165-随机链表的复制

题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节…

前端saas化部署

在项目中难免会遇到一些特殊的需求&#xff0c;例如同一套代码需要同时部署上两个不同的域名A和B。A和B的不同之处仅在于&#xff0c;例如一些背景图片&#xff0c;logo&#xff0c;展示模块的不同&#xff0c;其他业务逻辑是和展示模块是完全一样的。此时我们当然可以考虑单独…

Python网络爬虫(六):油管视频评论

本文的思路是利用googleapiclient.discovery连接Google API服务,获取油管视频的评论。Google API可以为开发人员提供很多有用的工具和数据,使用起来也非常简单方便。注意,连接Google API服务需要设置代理,这里需要用到httplib2库,利用该库设置代理信息,然后传入googleapi…

HTML入门基础操作(1)

如果没有下载专业的软件&#xff0c;可直接在txt文本中写出代码后对txt文件名后缀改为.html&#xff0c;即可使用浏览器打开&#xff0c;以作学习。 1、HTML 标题&#xff08;Heading&#xff09;是通过 <h1> - <h6> 等标签进行定义的&#xff0c;标题的大小从h1到…

倒计时1天 | 袋鼠云春季发布会完整议程出炉!快快预约直播

在日新月异的数字化经济时代&#xff0c;企业和组织不断寻求利用先进技术构建自身的核心竞争力。其中&#xff0c;大数据与AI的深度融合正在成为推动企业实现新质生产力的关键路径。 在此背景下&#xff0c;袋鼠云举办春季发布会&#xff0c;以“DataAI&#xff0c;构建新质生…

2024 年广西职业院校技能大赛高职组 《云计算应用》赛项赛题第①套

2024 年广西职业院校技能大赛高职组 《云计算应用》赛项赛题第①套 模块一 私有云&#xff08;30 分&#xff09;任务 1 私有云服务搭建&#xff08;5 分&#xff09;任务 2 私有云服务运维&#xff08;15 分&#xff09;任务 3 私有云运维开发&#xff08;10 分&#xff09; 模…

【Nature Electronics】二维钙钛矿氧化物SNO作为high-κ栅介质的应用

【Li, S., Liu, X., Yang, H. et al. Two-dimensional perovskite oxide as a photoactive high-κ gate dielectric. Nat Electron 7, 216–224 (2024). https://doi.org/10.1038/s41928-024-01129-9】 概括总结&#xff1a; 本研究探讨了二维钙钛矿氧化物Sr2Nb3O10&#xf…

基于蓝牙和IMU的卡尔曼滤波融合算法、扩展卡尔曼滤波算法

前言 看了大量的多源融合室内定位论文,都绕不开卡尔曼滤波和扩展卡尔曼滤波算法。相当经典,但是又缺少代码。 由于计算机专业不学这些算法,因此理解起来难度还有点大。因此业余抽空复现了下,话不多说,直接上代码。 蓝牙和IMU的卡尔曼滤波融合 from filterpy.kalman imp…

商家跑路城市拥堵大数据论文代码开源

原始数据&#xff1a; 日期名称类型所属区拥挤指数速度客流指数20240405世界之花假日广场购物;购物中心大兴区2.46621.369.4920240405华润五彩城购物;购物中心海淀区2.01329.7111.1720240405北京市百货大楼购物;购物中心东城区1.85615.938.2320240405apm购物;购物中心东城区1.…

常用12个自动化测试工具

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

基于springboot实现校园资料分享平台系统项目【项目源码+论文说明】

基于springboot实现校园资料分享平台系统演示 摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求&#xff…

Java基础学习: java.lang.Void

文章目录 一、介绍二、 java.lang.Void 特点 一、介绍 在Java中&#xff0c;java.lang.Void 是一个特殊的包装类&#xff0c;用于表示 void 类型。虽然 void 关键字在Java中通常用于表示方法没有返回值&#xff0c;但 java.lang.Void 类提供了对 void 类型的一个有限的、有用的…

探索ChatGPT应用:学术写作实践与经验分享

ChatGPT无限次数:点击直达 探索ChatGPT应用&#xff1a;学术写作实践与经验分享 引言 随着人工智能技术的快速发展&#xff0c;自然语言处理模型在各个领域的应用也日益普及。其中&#xff0c;ChatGPT作为一款强大的文本生成模型&#xff0c;正在被越来越多的学术写作者用于提…

为什么K8s需要服务网格Istio?

什么是Kubernetes服务网格 Kubernetes服务网格是一种工具&#xff0c;用于在平台级别而非应用级别为应用程序注入可观测性、可靠性和安全性功能。Kubernetes和微服务的兴起推动了人们对这项技术的兴趣&#xff0c;许多组织都采用了Kubernetes服务网格解决方案。 微服务架构高…

kali基础渗透学习,永恒之蓝,木马实战

简介 kali的学习本质是在linux上对一些攻击软件的使用&#xff0c;只是学习的初期 先在终端切换到root用户&#xff0c;以便于有些工具对权限的要求 下载链接 镜像源kali 攻击流程 公网信息搜集 寻找漏洞&#xff0c;突破口&#xff0c;以进入内网 进入内网&#xff0c…

(学习日记)2024.04.10:UCOSIII第三十八节:事件实验

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Golang——方法

一. 方法定义 Golang方法总是绑定对象的实例&#xff0c;并隐式将实例作为第一实参。 只能为当前包内命名类型定义方法参数receiver可以任意命名。如方法中未曾使用&#xff0c;可省略参数名参数receiver类型可以是T或*T。基类型T不能是接口或指针类型(即多级指针)不支持方法重…