linux 环境下 c语言实现mysql数据库图片的存储以及多数据库直接的转存

作为一个程序员,CSDN对我的编程带来了很多帮助和提高,在这里可以让你找到很多开发过程中遇到的问题的解决办法,今天也写点自己积累的东西跟大家分享一下,希望对需要的人有帮助.

资料背景:

        之前项目一直使用oracle数据,最近换工作,公司使用的为mysq数据库,项目中需要将A数据库保存的图片数据转存到另外一个远程数据库B,存储图片使用的类型为longblob,LongBlob (lang binary large object),二进制大对象,是一个可以存储二进制文件的容器。longblob这里不做详细介绍。下面将如何进行数据存储的操作贴出来,只是一个简单的demo,实际应用还要根据实际需求修改,但也包含了图片下载和图片转存的功能。代码如下:

#include <my_global.h>
#include <mysql.h>
#include <string.h>

void finish_with_error(MYSQL *con)
{
  fprintf(stderr, "%s\n", mysql_error(con));
  mysql_close(con);
  exit(1);        
}

int main(int argc, char **argv)
{
  /*测试用将图片保存本地*/
  FILE *fp = fopen("woman2.jpg", "wb");
  
  if (fp == NULL) 
  {
      fprintf(stderr, "cannot open image file\n");    
      exit(1);
  }
  /*连接数据A*/
  MYSQL *con = mysql_init(NULL);
  
  if (con == NULL)
  {
      fprintf(stderr, "mysql_init() failed\n");
      exit(1);
  }  
  
  if (mysql_real_connect(con, "localhost", "root", "1qazxsw2#", 
          "QR", 0, NULL, 0) == NULL) 
  {
      finish_with_error(con);
  }
  /*查询A数据库的图片数据*/
  if (mysql_query(con, "SELECT IMG_B FROM QR_IMG WHERE QRNUM='3691746087775941894'"))
  {
      finish_with_error(con);
  }
  
  MYSQL_RES *result = mysql_store_result(con);
  
  if (result == NULL) 
  {
      finish_with_error(con);
  }  

  MYSQL_ROW row = mysql_fetch_row(result);
  unsigned long *lengths = mysql_fetch_lengths(result);
  
  if (lengths == NULL) {
      finish_with_error(con);
  }
  /*连接远程数据B*/
  MYSQL *con1 = mysql_init(NULL);
  
  if (con1 == NULL)
  {
      fprintf(stderr, "mysql_init() failed\n");
      exit(1);
  }  
  
  if (mysql_real_connect(con1, "localhost", "root", "1qazxsw2#", 
          "card", 0, NULL, 0) == NULL) 
  {
      finish_with_error(con);
  }
  /*图片数据进行转义,存储图片的关键步骤*/
  char chunk[2*lengths[0]+1];
  mysql_real_escape_string(con, chunk, row[0], lengths[0]);

  /*数据插入B数据库*/
  char *st = "INSERT INTO card_pack(code_img) VALUES('%s')";
  size_t st_len = strlen(st);

  char query[st_len + 2*lengths[0]+1]; 
  int len = snprintf(query, st_len + 2*lengths[0]+1, st, chunk);

  if (mysql_real_query(con1, query, len))
  {
      finish_with_error(con);
  }
  /*保存到本地,用来测试用判断图片时候下载成功*/
  fwrite(row[0], lengths[0], 1, fp);

  if (ferror(fp)) 
  {            
      fprintf(stderr, "fwrite() failed\n");
      mysql_free_result(result);
      mysql_close(con);

      exit(1);      
  }  
  
  int r = fclose(fp);

  if (r == EOF) {
      fprintf(stderr, "cannot close file handler\n");
  }
  
  mysql_free_result(result);
  mysql_close(con);
  mysql_close(con1);

  exit(0);
}

借鉴资料: 点击打开链接  http://zetcode.com/tutorials/mysqlcapitutorial/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值