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

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

资料背景:

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

[cpp]  view plain  copy
  1. #include <my_global.h>  
  2. #include <mysql.h>  
  3. #include <string.h>  
  4.   
  5. void finish_with_error(MYSQL *con)  
  6. {  
  7.   fprintf(stderr, "%s\n", mysql_error(con));  
  8.   mysql_close(con);  
  9.   exit(1);          
  10. }  
  11.   
  12. int main(int argc, char **argv)  
  13. {  
  14.   /*测试用将图片保存本地*/  
  15.   FILE *fp = fopen("woman2.jpg""wb");  
  16.     
  17.   if (fp == NULL)   
  18.   {  
  19.       fprintf(stderr, "cannot open image file\n");      
  20.       exit(1);  
  21.   }  
  22.   /*连接数据A*/  
  23.   MYSQL *con = mysql_init(NULL);  
  24.     
  25.   if (con == NULL)  
  26.   {  
  27.       fprintf(stderr, "mysql_init() failed\n");  
  28.       exit(1);  
  29.   }    
  30.     
  31.   if (mysql_real_connect(con, "localhost""root""1qazxsw2#",   
  32.           "QR", 0, NULL, 0) == NULL)   
  33.   {  
  34.       finish_with_error(con);  
  35.   }  
  36.   /*查询A数据库的图片数据*/  
  37.   if (mysql_query(con, "SELECT IMG_B FROM QR_IMG WHERE QRNUM='3691746087775941894'"))  
  38.   {  
  39.       finish_with_error(con);  
  40.   }  
  41.     
  42.   MYSQL_RES *result = mysql_store_result(con);  
  43.     
  44.   if (result == NULL)   
  45.   {  
  46.       finish_with_error(con);  
  47.   }    
  48.   
  49.   MYSQL_ROW row = mysql_fetch_row(result);  
  50.   unsigned long *lengths = mysql_fetch_lengths(result);  
  51.     
  52.   if (lengths == NULL) {  
  53.       finish_with_error(con);  
  54.   }  
  55.   /*连接远程数据B*/  
  56.   MYSQL *con1 = mysql_init(NULL);  
  57.     
  58.   if (con1 == NULL)  
  59.   {  
  60.       fprintf(stderr, "mysql_init() failed\n");  
  61.       exit(1);  
  62.   }    
  63.     
  64.   if (mysql_real_connect(con1, "localhost""root""1qazxsw2#",   
  65.           "card", 0, NULL, 0) == NULL)   
  66.   {  
  67.       finish_with_error(con);  
  68.   }  
  69.   /*图片数据进行转义,存储图片的关键步骤*/  
  70.   char chunk[2*lengths[0]+1];  
  71.   mysql_real_escape_string(con, chunk, row[0], lengths[0]);  
  72.   
  73.   /*数据插入B数据库*/  
  74.   char *st = "INSERT INTO card_pack(code_img) VALUES('%s')";  
  75.   size_t st_len = strlen(st);  
  76.   
  77.   char query[st_len + 2*lengths[0]+1];   
  78.   int len = snprintf(query, st_len + 2*lengths[0]+1, st, chunk);  
  79.   
  80.   if (mysql_real_query(con1, query, len))  
  81.   {  
  82.       finish_with_error(con);  
  83.   }  
  84.   /*保存到本地,用来测试用判断图片时候下载成功*/  
  85.   fwrite(row[0], lengths[0], 1, fp);  
  86.   
  87.   if (ferror(fp))   
  88.   {              
  89.       fprintf(stderr, "fwrite() failed\n");  
  90.       mysql_free_result(result);  
  91.       mysql_close(con);  
  92.   
  93.       exit(1);        
  94.   }    
  95.     
  96.   int r = fclose(fp);  
  97.   
  98.   if (r == EOF) {  
  99.       fprintf(stderr, "cannot close file handler\n");  
  100.   }  
  101.     
  102.   mysql_free_result(result);  
  103.   mysql_close(con);  
  104.   mysql_close(con1);  
  105.   
  106.   exit(0);  
  107. }  

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

猜你喜欢

转载自blog.csdn.net/mianhuantang848989/article/details/77684014