c 窗体程序 mysql_C\C++开发MySQL程序简介(下)
如果需要向数据库中存储BLOB数据,则不能单纯的使用字符串,因为BLOB数据中很可能含有0。
一般有两种方法用来存储BLOB数据,一个是通过MYSQL提供的转义函数:
unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length)
该函数将“from”中的字符串编码为转义SQL字符串。将结果置于“to”中,并添加1个终结用NULL字节。编码的
字符为NUL (ASCII 0)、‘\n’、‘\r’、‘\’、‘'’、‘"’等。
注意,必须为“to”缓冲区分配至少length*2+1字节,以保证在最坏情况下不会溢出。
另一种方法则是通过MYSQL预处理函数进行BLOB数据的存储。
下面先介绍预处理函数。
MySQL客户端/服务器协议提供了预处理语句。该功能采用了由mysql_stmt_init()初始化函数返回的MYSQL_STMT语句处理程序数据结构。对于多次执行的语句,预处理执行是一种有效的方式。首先对语句进行解析,为执行作好准备。接下来,在以后使用初始化函数返回的语句句柄执行一次或多次。
对于多次执行的语句,预处理执行比直接执行快,主要原因在于,仅对查询执行一次解析操作。在直接执行的情况下,每次执行语句时,均将进行查询。此外,由于每次执行预处理语句时仅需发送参数的数据,从而减少了网络通信量。
预处理语句的另一个优点是,它采用了二进制协议,从而使得客户端和服务器之间的数据传输更有效率。
下述语句可用作预处理语句:CREATE TABLE、DELETE、DO、INSERT、REPLACE、SELECT、SET、UPDATE、以及大多数SHOW语句。在MySQL 5.1中,不支持其他语句。
预处理函数有两个核心的数据类型,MYSQL_STMT和MYSQL_BIND,关于MYSQL_STMT完全不需要理解,关于MYSQL_BIND需要查看下手册,接下来的一些函数需要用到它。
/*初始化,使用预处理语句必须先调用该函数*/
MYSQL_STMT *mysql_stmt_init(MYSQL *mysql);
/*准备语句*/
int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, unsigned long length);
/*绑定参数*/
my_bool mysql_stmt_bind_param(MYSQL_STMT *stmt, MYSQL_BIND *bind);
/*绑定结果*/
my_bool mysql_stmt_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind);
/*执行SQL语句*/
int mysql_stmt_execute(MYSQL_STMT *stmt);
/*使用完后需要释放资源*/
my_bool mysql_stmt_close(MYSQL_STMT *);
对于预处理流程,MYSQL提供了很多和普通流程同样的接口,比如获取记录集,获取一行记录,获取SQL语句影响的行数,以及错误处理函数等,只是在函数名中加入了stmt,查下手册就可以了。
这里稍微解释下mysql_stmt_prepare函数和mysql_stmt_bind_param函数,一般来说,需要使用到预处理流程的,都是SQL语句格式固定,只是有一两个值在变化,比如:
INSERT INTO mytbl VALUES(?,?,?)
这里的三个问号就是三个参数,如果你写过存储过程应该很好理解。
通过将问号字符“?”嵌入到SQL字符串的恰当位置,应用程序可包含SQL语句中的一个或多个参数标记符。
标记符仅在SQL语句中的特定位置时才是合法的。例如,它可以在INSERT语句的VALUES()列表中(为行指定列值),或
与WHERE子句中某列的比较部分(用以指定比较值)。但是,对于ID(例如表名或列名),不允许使用它们,不允许指定二进
制操作符(如等于号“=”)的操作数。后一个限制是有必要的,原因在于,无法确定参数类型。一般而言,参数仅在DML(数据
操作语言)语句中才是合法的,在DDL(数据定义语言)语句中不合法。
将这条语句prepare好后,就可以进行绑定参数了,当然在调用函数前,需要先将MYSQL_BIND结构体准备好,比如上边这条语句有3个参数,那么就需要准备一个数组
MYSQL_BIND bind[3]={0};
......
mysql_stmt_bind_param(stmt,bind);
再回到开头的问题,如果需要存储BLOB数据,那么我们可以设置MYSQL_BIND结构体绑定到一个buffer,然后执行SQL语句即可
MYSQL * mysql = NULL;
......
MSYQL_STMT * stmt = mysql_stmt_init(mysql);
const char * strSql = "insert into mytable(id,content) values(1,?)";
mysql_stmt_prepare(stmt,strSql,strlen(strSql));
char buffer[128]={0};
int len = 128;//数据的长度
/*通过memcpy等向buffer中复制数据*/
MYSQL_BIND bind;
bind.buffer_type = MYSQL_TYPE_BLOB;
bind.buffer = buffer;
bind.buffer_length = &len; //这个长度是指缓冲区的最大长度
bind.is_null = 0;
bind.length = &len;//这个指数据的实际长度
mysql_stmt_bind_param(stmt,&bind);
mysql_stmt_execute(stmt);
...
mysql_stmt_close(stmt);
不管使用普通流程还是预处理流程,在读取BLOB数据时,你需要用到下边的函数来获取数据的长度:
/*该函数返回一个指针,你可以通过索引值来获得相应的列的值的长度*/
/*每次获取一行新记录,你都需要调用该函数*/
unsigned long *mysql_fetch_lengths(MYSQL_RES *result); 下一篇将会给出一些比较完整的例子
c 窗体程序 mysql_C\C++开发MySQL程序简介(下)相关推荐
- asp.net程序涉及案例_定制小程序 | 企业在开发小程序前需要满足哪些条件?
目前深圳小程序开发行业发展愈发迅速,小程序开发已成为目前的潮流趋势,制作属于自己的小程序刻不容缓.那么在开发小程序前,企业需要满足什么条件呢? 1.注册账号 万纵联小编告诉你,要想开发小程序,申请账号 ...
- 小程序资源服务器,开发小程序没有服务器资源
开发小程序没有服务器资源 内容精选 换一换 在性能优化时,需要遵循一定的原则,主要有以下几个方面:对性能进行分析时,要多方面分析系统的资源瓶颈所在,如CPU利用率达到100%时,也可能是内存容量限制, ...
- 用java开发一个简单的安卓程序,Android NDK开发简单程序分享(Hello Word!)
在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android ...
- 微信小程序 - 使用 uni-app 开发小程序以及部分功能实现
文章目录 一.uni-app 1.简介 2.开发工具 3.新建 uni-app项目 4.把项目运行到微信开发者工具 二.实现tabBar效果 1.创建tabBar页面 2.配置tabBar 三.配置网 ...
- [小程序]你也要开发小程序?设计规范少不了
你也要开发小程序?设计规范少不了 听说你准备开发小程序,这套设计规范送给你 目录: 1.设计尺寸 2.设计区域 3.字体规范 4.字体颜色规范 5.顶部导航栏 navigationBar 6.标签分页 ...
- 开发一个c语言程序要经过,开发c程序的基本步骤
大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 开发c语言的七个基本步骤是: 1.定义程序目标.在开始写程序之前,应对希望程序要做什么有一个清晰的想法.考虑程序需要的信息,程序需 ...
- 用Java开发桌面应用程序(Swing开发GUI程序)
前面学过了面向对象基本概念.面向对象基本特征.Java基本包和API:异常.多线程.IO等. 基本概念 Swing:java中的一个包,负责开发GUI程序 GUI:图形用户界面,一般指可视化桌面系统中 ...
- 微信开发众筹项目视频教学小程序+java后端开发+mysql数据库
用HBuilder X开发微信小程序,java后端开发工具idea,mysql数据库,主要功能有:用户管理.分类列表.分类金额.众筹列表.订单列表.系统设置.权限分配 源码下载地址:>>& ...
- 定制化开发小程序与模板开发小程序的区别?
随着小程序关注度的持续走高,越来越多的企业商家开始涌入这片流量红海抢占商机,都想用微信小程序给自己带来红利,但在小程序开发之前,很多人会纠结,深圳小程序模板开发和深圳小程序定制开发,该怎么选? 今天, ...
最新文章
- TreeView控件中实现拖拽的功能
- 【机器学习PAI实践四】如何实现金融风控
- java代码块执行顺序_Java笔记 | Java代码块执行顺序测试
- 单核工作法16:循序渐进(下)
- VTK:Utilities之KnownLengthArray
- beetl模板引擎之自定义html标签,Beetl模板引擎自定义分页标签
- BZOJ-2463 谁能赢呢?
- python列表属于什么类型的游戏_1.4 python数据类型之list类
- 顺丰同城通过港交所聆讯 今年前五个月收入为30.46亿元
- poj 3667 Hotel 线段树 内存分配问题
- 通过ROS控制真实机械臂(17) --- 视觉抓取之ORK实现三维物体识别
- 系泊系统 matlab代码,一种应用于系泊系统的设计方法与流程
- 计算机毕业设计之java+ssm的图书管理系统的设计与实现论文
- 数学分析典型方法pdf下载_硬质合金刀具常识及使用方法 pdf下载 0700
- 虚拟机Centos系统安装
- java如何调用百度地图拾取坐标系统
- 电机矢量控制(霍尔位置传感器)
- 固态移动硬盘安装linux,如何在移动硬盘上安装Ubuntu系统(1)
- YOLOv5训练时出现Corrupt JPEG data: 2 extraneous bytes before marker 0xd9
- 宏正自动科技发表新款8/16端口双滑轨LCD KVM多电脑切换器
热门文章
- 03_Weblogic之配置简单域:启动和配置域,使用模板创建域,使用控制台
- FreeMarker语法指南
- 南山中学2021级2班高考成绩查询,绵阳南山中学双语学校2021年排名
- jquery ajax 找到数据怎样放到下拉框里_闲话Excel之简易数据动态图表的制作
- c语言字母输出什么意思,C语言中字符的输入输出以及计算字符个数的方法详解...
- SSD(Single Shot MultiBox Detector):因为数据集中图像通道数不对导致的训练异常
- C语言中atoi()函数的用法
- g20曲线拟合源码解读
- 在Ubuntu下安装Bazaar
- Java中Arrays.toString ()打印二维数组及Array数组的常用操作