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; }
从数据库读一个二进制文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //从数据库中读二进制文件 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)