C++ API方式连接mysql数据库实现BLOB访问
博客园中,发现一篇很好的内容,《C++ API方式连接mysql数据库实现增删改查》https://www.cnblogs.com/47088845/p/5706496.html。
代码复制在VS2012中,控制台方式,顺利运行。 说明也写的用心。感谢!
在此篇佳作基础上,我补充了一点点新学来的内容。首先BLOB的记录写和读操作。要点体会:
1) 按照字节为单位,字符为类型,组织 长长的“query”,通过API与MYSQL交互。
2)字节数要特别清楚,否者 mysql_real_query(&mysql, query, lenofquery)就犯错。
3)要及时发现错误,要配合使用 printf(mysql_error(&mysql));// 调试使用,观察查询指令失败原因。
4)sizeof()不能得到字节数,依靠其他API函数得到字节数。
写一个二进制文件进入Mysql的步骤:
1)二进制方式读入文件,先得到文件字节数,再获得字节流(将存为数据库内BLOB类型数据)。按照文件字节数,malloc()分配内存放字节流。
2)对文件字节流做转义处理,API函数为mysql_real_escape_string()。得到字节数和字节流。
3)在VC中,_snprintf()函数组织 SQL语句字符串,query,也要字符串及其字节数。
4)执行API函数 mysql_real_query(),将信息写入MySQL数据库内。
环境: VS2012 + MySQL5.6
代码举例:
首先在 mysql 中,创建一个表 语句为
创建语句如下: create table images(id int not null primary key, data mediumblob);
//存二进制文件进数据库 bool blobwrite(void) { int len;// 定义数组过大,改变 堆栈大小设置 在项目属性 连接 系统 中修改 保留堆栈大小 long size; FILE *fp; //二进制方式打开文件 fp = fopen("flower.jpg", "rb"); // flower.jpg 和源文件放在一个同一目录中 if(NULL == fp) { printf("Error:Open input.c file fail!\n"); return false; } //求得文件的大小 fseek(fp, 0, SEEK_END); size = ftell(fp); rewind(fp); //申请一块能装下整个文件的空间 char* ar = (char*)malloc(sizeof(char)*size); //读文件 fread(ar,1,size,fp);//每次读一个,共读size次 static long len1; static long len2; static long len3; char stat[] = "INSERT INTO images(id, data) VALUES('3', '%s')"; char* chunk = (char*)malloc(sizeof(char)*(size*2+1)); len2= mysql_real_escape_string(&mysql, chunk, ar, size);// 将ar内的特殊BYTE做转义处理,放入chunk内,便于构成合法SQL语句。 len3 = sizeof(stat)+len2 ;//计算将分配内存大小,放查询语句 char* query = (char*)malloc(sizeof(char)*(len3));//分配内存,放查询语句 len1 = _snprintf(query, sizeof(stat)+len2 , stat, chunk);// 产生查询语句。 在 VC中 _snprintf,其他地方可能 snprintf query[0x286D];// 调试,观察最后一个字符是否为半圆括号。 int ret = mysql_real_query(&mysql, query, len1);// 执行查询指令 if( ret != 0) { printf(mysql_error(&mysql));// 调试使用,观察查询指令失败原因。 return false; } free(ar);// 释放从堆分配来的内存 free(chunk);// 释放从堆分配来的内存 free( query);// 释放从堆分配来的内存 fclose(fp); return true; }
从数据库读一个二进制文件。
//从数据库中读二进制文件
bool blobRead(void)
{
MYSQL_RES *result;
MYSQL_ROW row;
unsigned long *lengths;
FILE *fp;
fp = fopen("image.jpg", "wb");
mysql_query(&mysql, "SELECT data FROM images WHERE id=3");
result = mysql_store_result(&mysql);
row = mysql_fetch_row(result);
lengths = mysql_fetch_lengths(result);
fwrite(row[0], lengths[0], 1, fp);
mysql_free_result(result);
fclose(fp);
return true;
}
其他 参考
fread函数详解,介绍malloc()函数及 fread函数,栗子好,写的也好!https://www.cnblogs.com/melons/p/5791874.html

浙公网安备 33010602011771号