您的位置:首页 > 运维架构 > Linux

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

2015-01-23 15:45 603 查看
作为一个程序员,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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: