使用c++操作mysql完成大对象的存取

1.BLOB二进制大对象的类型

MySQL只能存储 mysql可以存对象吗_数据库


二进制大对象可以实现图片,音频,视频等内容的存取

2.向mysql存入图片

1.准备有关参数的结构体

// 定义超女信息的结构,与表中字段对应
  struct st_girls{
  
    long id;                // 超女编号
	char pic[100000];       // 超女图片的内容
	unsigned long picsize;  // 图片内容占用的字节数
  }stgirls;

2.编写SQL语句

stmt.prepare("\
	update girls set pic=:1 where id=:2");

3.绑定变量

stmt.bindinlob(1, stgirls.pic, &stgirls.picsize);
  stmt.bindin(2, &stgirls.id);

4.执行语句

// 模拟超女信息,修改表中数据
  for(int i = 3 ; i <= 4 ; i++){
	memset(&stgirls, 0, sizeof(st_girls));
      
    // 为结构体变量的成员赋值
    stgirls.id = i; //超女编号 
    
	// 把图片的内容加载到stgirls.pic中
	if(i == 3) stgirls.picsize = filetobuf("1.jpg", stgirls.pic);
	if(i == 4) stgirls.picsize = filetobuf("2.jpg", stgirls.pic);

    if(stmt.execute() != 0){
	  printf("stmt.execute() failed.\n%s\n%s\n", stmt.m_sql,stmt.m_cda.message);
	  return -1;
	}	
	printf("成功修改了%ld条记录\n", stmt.m_cda.rpc);// stmt.m_cda.rpc中存放了SQL执行影响的记录数
  }
  printf("存入图片 table girls ok\n");
  
  conn.commit();// 提交数据库事务

5.整体代码:

/*
  程序名:filetoblob.cpp 此程序演示开发矿框架操作MySQL数据库(把图片存入BLOB字段)
*/

#include "_mysql.h" // 开发框架操作MySQL的头文件

int main(int argc, char* argv[]){

  connection conn;  // 数据库连接类
  
  // 登录数据库,返回值:0-成功,其他为失败,存放了MySQL的错误代码
  // 失败代码在conn.m_cda.rc中,失败描述在conn.m_cda.message中
  if(conn.connecttodb("192.168.117.128,root,chenliang123789,testDatabase,3306", "utf8") != 0){
    printf("connect database failed.\n %s \n", conn.m_cda.message);
	return -1;
  }
  // printf("连接成功!\n");
  
  // 定义超女信息的结构,与表中字段对应
  struct st_girls{
  
    long id;                // 超女编号
	char pic[100000];       // 超女图片的内容
	unsigned long picsize;  // 图片内容占用的字节数
  }stgirls;
  
  sqlstatement stmt(&conn); // 操作SQL语句对象
  // 准备超女表, 编号id,姓名name,体重weight,报名时间btime,说明memo,图片pic
  stmt.prepare("\
	update girls set pic=:1 where id=:2");
	
  stmt.bindinlob(1, stgirls.pic, &stgirls.picsize);
  stmt.bindin(2, &stgirls.id);
	
  // 模拟超女信息,修改表中数据
  for(int i = 3 ; i <= 4 ; i++){
	memset(&stgirls, 0, sizeof(st_girls));
      
    // 为结构体变量的成员赋值
    stgirls.id = i; //超女编号 
    
	// 把图片的内容加载到stgirls.pic中
	if(i == 3) stgirls.picsize = filetobuf("1.jpg", stgirls.pic);
	if(i == 4) stgirls.picsize = filetobuf("2.jpg", stgirls.pic);

    if(stmt.execute() != 0){
	  printf("stmt.execute() failed.\n%s\n%s\n", stmt.m_sql,stmt.m_cda.message);
	  return -1;
	}	
	printf("成功修改了%ld条记录\n", stmt.m_cda.rpc);// stmt.m_cda.rpc中存放了SQL执行影响的记录数
  }
  printf("存入图片 table girls ok\n");
  
  conn.commit();// 提交数据库事务
  
  return 0;
}

3.从mysql取出图片

1.编写SQL
2.绑定变量
3.执行语句
4.通过next()方法从结果集中取出数据

/*
  程序名:blobtofile.cpp 此程序演示开发矿框架操作MySQL数据库(查询表)
*/

#include "_mysql.h" // 开发框架操作MySQL的头文件

int main(int argc, char* argv[]){

  connection conn;  // 数据库连接类
  
  // 登录数据库,返回值:0-成功,其他为失败,存放了MySQL的错误代码
  // 失败代码在conn.m_cda.rc中,失败描述在conn.m_cda.message中
  if(conn.connecttodb("192.168.117.128,root,chenliang123789,testDatabase,3306", "utf8") != 0){
    printf("connect database failed.\n %s \n", conn.m_cda.message);
	return -1;
  }
  // printf("连接成功!\n");
  
  // 定义超女信息的结构,与表中字段对应
  struct st_girls{
  
    long id;                // 超女编号
	char pic[100000];       // 超女图片的内容
	unsigned long picsize;  // 图片内容占用的字节数
  }stgirls;
  
  sqlstatement stmt(&conn); // 操作SQL语句对象
  // 准备超女表, 编号id,姓名name,体重weight,报名时间btime,说明memo,图片pic
  stmt.prepare("\
  select id,pic from girls where id in (1,2)");
	
  stmt.bindout(1, &stgirls.id);
  stmt.bindoutlob(2, stgirls.pic,100000,&stgirls.picsize);
  
	
  // 执行SQL语句,一定要判断返回值,0-成功,其他-失败
  if(stmt.execute() != 0){
    printf("stmt.execute() failed.\n%s\n%s\n", stmt.m_sql, stmt.m_cda.message);
	return -1;
  }
  
  //本程序执行的是查询语句,执行stmt.execute()后,将会在数据库的缓冲区中产生一个结果集
  while(true){
    memset(&stgirls, 0, sizeof(st_girls));
	
	//从结果集中获取一条记录,判断返回值,0-成功,1403-无记录,其他-失败
	if(stmt.next() != 0) break;
	
	// 把获取到的图片保存
	// 生成文件名。
    char filename[101]; memset(filename,0,sizeof(filename));
    sprintf(filename,"%d_out.jpg",stgirls.id);
    
    // 把内容写入文件。
    buftofile(filename,stgirls.pic,stgirls.picsize);
	
  }
  
  // stmt.m_cda.rpc中保存了SQL执行后被影响的记录数
  printf("本次查询了girls表%ld条记录\n",stmt.m_cda.rpc);
  
  return 0;
}