如果需要向数据库中存储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程序简介(下)相关推荐

  1. asp.net程序涉及案例_定制小程序 | 企业在开发小程序前需要满足哪些条件?

    目前深圳小程序开发行业发展愈发迅速,小程序开发已成为目前的潮流趋势,制作属于自己的小程序刻不容缓.那么在开发小程序前,企业需要满足什么条件呢? 1.注册账号 万纵联小编告诉你,要想开发小程序,申请账号 ...

  2. 小程序资源服务器,开发小程序没有服务器资源

    开发小程序没有服务器资源 内容精选 换一换 在性能优化时,需要遵循一定的原则,主要有以下几个方面:对性能进行分析时,要多方面分析系统的资源瓶颈所在,如CPU利用率达到100%时,也可能是内存容量限制, ...

  3. 用java开发一个简单的安卓程序,Android NDK开发简单程序分享(Hello Word!)

    在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android ...

  4. 微信小程序 - 使用 uni-app 开发小程序以及部分功能实现

    文章目录 一.uni-app 1.简介 2.开发工具 3.新建 uni-app项目 4.把项目运行到微信开发者工具 二.实现tabBar效果 1.创建tabBar页面 2.配置tabBar 三.配置网 ...

  5. [小程序]你也要开发小程序?设计规范少不了

    你也要开发小程序?设计规范少不了 听说你准备开发小程序,这套设计规范送给你 目录: 1.设计尺寸 2.设计区域 3.字体规范 4.字体颜色规范 5.顶部导航栏 navigationBar 6.标签分页 ...

  6. 开发一个c语言程序要经过,开发c程序的基本步骤

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 开发c语言的七个基本步骤是: 1.定义程序目标.在开始写程序之前,应对希望程序要做什么有一个清晰的想法.考虑程序需要的信息,程序需 ...

  7. 用Java开发桌面应用程序(Swing开发GUI程序)

    前面学过了面向对象基本概念.面向对象基本特征.Java基本包和API:异常.多线程.IO等. 基本概念 Swing:java中的一个包,负责开发GUI程序 GUI:图形用户界面,一般指可视化桌面系统中 ...

  8. 微信开发众筹项目视频教学小程序+java后端开发+mysql数据库

    用HBuilder X开发微信小程序,java后端开发工具idea,mysql数据库,主要功能有:用户管理.分类列表.分类金额.众筹列表.订单列表.系统设置.权限分配 源码下载地址:>>& ...

  9. 定制化开发小程序与模板开发小程序的区别?

    随着小程序关注度的持续走高,越来越多的企业商家开始涌入这片流量红海抢占商机,都想用微信小程序给自己带来红利,但在小程序开发之前,很多人会纠结,深圳小程序模板开发和深圳小程序定制开发,该怎么选? 今天, ...

最新文章

  1. TreeView控件中实现拖拽的功能
  2. 【机器学习PAI实践四】如何实现金融风控
  3. java代码块执行顺序_Java笔记 | Java代码块执行顺序测试
  4. 单核工作法16:循序渐进(下)
  5. VTK:Utilities之KnownLengthArray
  6. beetl模板引擎之自定义html标签,Beetl模板引擎自定义分页标签
  7. BZOJ-2463 谁能赢呢?
  8. python列表属于什么类型的游戏_1.4 python数据类型之list类
  9. 顺丰同城通过港交所聆讯 今年前五个月收入为30.46亿元
  10. poj 3667 Hotel 线段树 内存分配问题
  11. 通过ROS控制真实机械臂(17) --- 视觉抓取之ORK实现三维物体识别
  12. 系泊系统 matlab代码,一种应用于系泊系统的设计方法与流程
  13. 计算机毕业设计之java+ssm的图书管理系统的设计与实现论文
  14. 数学分析典型方法pdf下载_硬质合金刀具常识及使用方法 pdf下载 0700
  15. 虚拟机Centos系统安装
  16. java如何调用百度地图拾取坐标系统
  17. 电机矢量控制(霍尔位置传感器)
  18. 固态移动硬盘安装linux,如何在移动硬盘上安装Ubuntu系统(1)
  19. YOLOv5训练时出现Corrupt JPEG data: 2 extraneous bytes before marker 0xd9
  20. 宏正自动科技发表新款8/16端口双滑轨LCD KVM多电脑切换器

热门文章

  1. 03_Weblogic之配置简单域:启动和配置域,使用模板创建域,使用控制台
  2. FreeMarker语法指南
  3. 南山中学2021级2班高考成绩查询,绵阳南山中学双语学校2021年排名
  4. jquery ajax 找到数据怎样放到下拉框里_闲话Excel之简易数据动态图表的制作
  5. c语言字母输出什么意思,C语言中字符的输入输出以及计算字符个数的方法详解...
  6. SSD(Single Shot MultiBox Detector):因为数据集中图像通道数不对导致的训练异常
  7. C语言中atoi()函数的用法
  8. g20曲线拟合源码解读
  9. 在Ubuntu下安装Bazaar
  10. Java中Arrays.toString ()打印二维数组及Array数组的常用操作