使用c++操作mysql完成大对象的存取
1.BLOB二进制大对象的类型
二进制大对象可以实现图片,音频,视频等内容的存取
2.向mysql存入图片
1.准备有关参数的结构体
// 定义超女信息的结构,与表中字段对应
struct st_girls{
long id; // 超女编号
char pic[100000]; // 超女图片的内容
unsigned long picsize; // 图片内容占用的字节数
}stgirls;
2.编写SQL语句
stmt.prepare("\
update girls set pic=:1 where id=:2");
3.绑定变量
stmt.bindinlob(1, stgirls.pic, &stgirls.picsize);
stmt.bindin(2, &stgirls.id);
4.执行语句
// 模拟超女信息,修改表中数据
for(int i = 3 ; i <= 4 ; i++){
memset(&stgirls, 0, sizeof(st_girls));
// 为结构体变量的成员赋值
stgirls.id = i; //超女编号
// 把图片的内容加载到stgirls.pic中
if(i == 3) stgirls.picsize = filetobuf("1.jpg", stgirls.pic);
if(i == 4) stgirls.picsize = filetobuf("2.jpg", stgirls.pic);
if(stmt.execute() != 0){
printf("stmt.execute() failed.\n%s\n%s\n", stmt.m_sql,stmt.m_cda.message);
return -1;
}
printf("成功修改了%ld条记录\n", stmt.m_cda.rpc);// stmt.m_cda.rpc中存放了SQL执行影响的记录数
}
printf("存入图片 table girls ok\n");
conn.commit();// 提交数据库事务
5.整体代码:
/*
程序名:filetoblob.cpp 此程序演示开发矿框架操作MySQL数据库(把图片存入BLOB字段)
*/
#include "_mysql.h" // 开发框架操作MySQL的头文件
int main(int argc, char* argv[]){
connection conn; // 数据库连接类
// 登录数据库,返回值:0-成功,其他为失败,存放了MySQL的错误代码
// 失败代码在conn.m_cda.rc中,失败描述在conn.m_cda.message中
if(conn.connecttodb("192.168.117.128,root,chenliang123789,testDatabase,3306", "utf8") != 0){
printf("connect database failed.\n %s \n", conn.m_cda.message);
return -1;
}
// printf("连接成功!\n");
// 定义超女信息的结构,与表中字段对应
struct st_girls{
long id; // 超女编号
char pic[100000]; // 超女图片的内容
unsigned long picsize; // 图片内容占用的字节数
}stgirls;
sqlstatement stmt(&conn); // 操作SQL语句对象
// 准备超女表, 编号id,姓名name,体重weight,报名时间btime,说明memo,图片pic
stmt.prepare("\
update girls set pic=:1 where id=:2");
stmt.bindinlob(1, stgirls.pic, &stgirls.picsize);
stmt.bindin(2, &stgirls.id);
// 模拟超女信息,修改表中数据
for(int i = 3 ; i <= 4 ; i++){
memset(&stgirls, 0, sizeof(st_girls));
// 为结构体变量的成员赋值
stgirls.id = i; //超女编号
// 把图片的内容加载到stgirls.pic中
if(i == 3) stgirls.picsize = filetobuf("1.jpg", stgirls.pic);
if(i == 4) stgirls.picsize = filetobuf("2.jpg", stgirls.pic);
if(stmt.execute() != 0){
printf("stmt.execute() failed.\n%s\n%s\n", stmt.m_sql,stmt.m_cda.message);
return -1;
}
printf("成功修改了%ld条记录\n", stmt.m_cda.rpc);// stmt.m_cda.rpc中存放了SQL执行影响的记录数
}
printf("存入图片 table girls ok\n");
conn.commit();// 提交数据库事务
return 0;
}
3.从mysql取出图片
1.编写SQL
2.绑定变量
3.执行语句
4.通过next()方法从结果集中取出数据
/*
程序名:blobtofile.cpp 此程序演示开发矿框架操作MySQL数据库(查询表)
*/
#include "_mysql.h" // 开发框架操作MySQL的头文件
int main(int argc, char* argv[]){
connection conn; // 数据库连接类
// 登录数据库,返回值:0-成功,其他为失败,存放了MySQL的错误代码
// 失败代码在conn.m_cda.rc中,失败描述在conn.m_cda.message中
if(conn.connecttodb("192.168.117.128,root,chenliang123789,testDatabase,3306", "utf8") != 0){
printf("connect database failed.\n %s \n", conn.m_cda.message);
return -1;
}
// printf("连接成功!\n");
// 定义超女信息的结构,与表中字段对应
struct st_girls{
long id; // 超女编号
char pic[100000]; // 超女图片的内容
unsigned long picsize; // 图片内容占用的字节数
}stgirls;
sqlstatement stmt(&conn); // 操作SQL语句对象
// 准备超女表, 编号id,姓名name,体重weight,报名时间btime,说明memo,图片pic
stmt.prepare("\
select id,pic from girls where id in (1,2)");
stmt.bindout(1, &stgirls.id);
stmt.bindoutlob(2, stgirls.pic,100000,&stgirls.picsize);
// 执行SQL语句,一定要判断返回值,0-成功,其他-失败
if(stmt.execute() != 0){
printf("stmt.execute() failed.\n%s\n%s\n", stmt.m_sql, stmt.m_cda.message);
return -1;
}
//本程序执行的是查询语句,执行stmt.execute()后,将会在数据库的缓冲区中产生一个结果集
while(true){
memset(&stgirls, 0, sizeof(st_girls));
//从结果集中获取一条记录,判断返回值,0-成功,1403-无记录,其他-失败
if(stmt.next() != 0) break;
// 把获取到的图片保存
// 生成文件名。
char filename[101]; memset(filename,0,sizeof(filename));
sprintf(filename,"%d_out.jpg",stgirls.id);
// 把内容写入文件。
buftofile(filename,stgirls.pic,stgirls.picsize);
}
// stmt.m_cda.rpc中保存了SQL执行后被影响的记录数
printf("本次查询了girls表%ld条记录\n",stmt.m_cda.rpc);
return 0;
}