C++ API方式连接mysql数据库实现BLOB访问

博客园中,发现一篇很好的内容,《C++ API方式连接mysql数据库实现增删改查https://www.cnblogs.com/47088845/p/5706496.html。

代码复制在VS2012中,控制台方式,顺利运行。 说明也写的用心。感谢!

 

在此篇佳作基础上,我补充了一点点新学来的内容。首先BLOB的记录写和读操作。要点体会:

1) 按照字节为单位,字符为类型,组织 长长的“query”,通过API与MYSQL交互。

2)字节数要特别清楚,否者  mysql_real_query(&mysql, query, lenofquery)就犯错。

3)要及时发现错误,要配合使用  printf(mysql_error(&mysql));// 调试使用,观察查询指令失败原因。

4)sizeof()不能得到字节数,依靠其他API函数得到字节数。

 

写一个二进制文件进入Mysql的步骤:

1)二进制方式读入文件,先得到文件字节数,再获得字节流(将存为数据库内BLOB类型数据)。按照文件字节数,malloc()分配内存放字节流。

2)对文件字节流做转义处理,API函数为mysql_real_escape_string()。得到字节数和字节流。

3)在VC中,_snprintf()函数组织 SQL语句字符串,query,也要字符串及其字节数。

4)执行API函数  mysql_real_query(),将信息写入MySQL数据库内。

环境: VS2012  + MySQL5.6

代码举例:

首先在 mysql 中,创建一个表  语句为 

创建语句如下: create table images(id int not null primary key, data mediumblob);

复制代码
//存二进制文件进数据库  
bool blobwrite(void)
{
  int len;// 定义数组过大,改变 堆栈大小设置 在项目属性 连接  系统 中修改 保留堆栈大小
  long size;
  FILE *fp;
  //二进制方式打开文件    
  fp = fopen("flower.jpg", "rb"); // flower.jpg 和源文件放在一个同一目录中
  if(NULL == fp)  
  {  
      printf("Error:Open input.c file fail!\n");  
      return false; 
  } 
  //求得文件的大小  
  fseek(fp, 0, SEEK_END);  
  size = ftell(fp);  
  rewind(fp); 
  //申请一块能装下整个文件的空间  
  char* ar = (char*)malloc(sizeof(char)*size); 
  //读文件  
  fread(ar,1,size,fp);//每次读一个,共读size次

  static long len1;
  static long len2;
  static long len3;
  char stat[] = "INSERT INTO images(id, data) VALUES('3', '%s')";
  char* chunk =  (char*)malloc(sizeof(char)*(size*2+1)); 

  len2= mysql_real_escape_string(&mysql, chunk, ar, size);// 将ar内的特殊BYTE做转义处理,放入chunk内,便于构成合法SQL语句。

  len3 = sizeof(stat)+len2 ;//计算将分配内存大小,放查询语句
  
  char* query = (char*)malloc(sizeof(char)*(len3));//分配内存,放查询语句

  len1 = _snprintf(query, sizeof(stat)+len2 , stat, chunk);// 产生查询语句。   在 VC中 _snprintf,其他地方可能 snprintf
  query[0x286D];// 调试,观察最后一个字符是否为半圆括号。
  int ret = mysql_real_query(&mysql, query, len1);// 执行查询指令
  if(  ret !=   0)
  {  
      printf(mysql_error(&mysql));// 调试使用,观察查询指令失败原因。
      return false;
  }


  free(ar);// 释放从堆分配来的内存  
  free(chunk);// 释放从堆分配来的内存  
  free( query);// 释放从堆分配来的内存 

  fclose(fp);
  return true;
}
复制代码

从数据库读一个二进制文件。

其他 参考  

fread函数详解,介绍malloc()函数及 fread函数,栗子好,写的也好!
https://www.cnblogs.com/melons/p/5791874.html
posted @   辛河  阅读(595)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示