作为一个程序员,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/