近期学习使用sqlite3数据库,有一个将图片读取到数据库中的练习,方式是将图片信息转换成二进制形式进行读取。现将代码帖上,欢迎一起
学习!!!
-------------------------------------------------将图片信息写入到数据库----------------------------------------
#include <stdio.h> #include <sqlite3.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <sys/stat.h> int main(int argc,char *argv[]) { if(argc != 2) { printf("Usage :%s <imgName>\n",argv[0]); return 1; } //打开图片文件,读取文件大小信息 int fd = open(argv[1],O_RDONLY); if(fd <0) { perror("open error:"); return 2; } //读取文件信息 struct stat st; fstat(fd,&st); int imgSize = st.st_size; void *addr = malloc(imgSize); if(!addr) { perror("malloc error:"); return 2; } read(fd,addr,imgSize);//将fd中的二进制内容读取到addr中,大小为imgSize close(fd);//关闭文件指针 //数据库操作 sqlite3 *db; int ret = sqlite3_open("img.db",&db);//打开数据库,前提是数据库要存在,且有相应的表 if(ret != SQLITE_OK) { fprintf(stderr,"open db error:%s\n",sqlite3_errmsg(db)); sqlite3_close(db);//关闭数据库 return 2; } //进行插入数据操作 char *insertsql = "insert into img_tb values(?,?);"; sqlite3_stmt *stmt; ret = sqlite3_prepare_v2(db,insertsql,strlen(insertsql),&stmt,NULL); if(ret != SQLITE_OK) { fprintf(stderr,"prepare db error:%s\n",sqlite3_errmsg(db)); sqlite3_close(db); } sqlite3_bind_text(stmt,1,argv[1],strlen(argv[1]),NULL);//绑定文本 sqlite3_bind_blob(stmt,2,addr,imgSize,NULL);//绑定二进制 //执行数据库操作 sqlite3_step(stmt); //销毁语句 sqlite3_finalize(stmt); sqlite3_close(db); free(addr); return 0; }
--------------------------------------------读取图片二进制信息------------------------------------------------
#include <stdio.h> #include <sqlite3.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <sys/stat.h> int main(int argc,char *argv[]) { sqlite3 *db; //打开数据库 int ret = sqlite3_open("img.db",&db); if(ret != SQLITE_OK) { fprintf(stderr,"open db error:%s\n",sqlite3_errmsg(db)); sqlite3_close(db); return 2; } //查询操作 char *selectsql = "select imgName,imgData from img_tb;"; sqlite3_stmt *stmt; ret = sqlite3_prepare_v2(db,selectsql,-1,&stmt,NULL); if(ret != SQLITE_OK) { fprintf(stderr,"prepare db error:%s\n",sqlite3_errmsg(db)); sqlite3_close(db); return 2; } ret= sqlite3_step(stmt);//执行 const char *imgName; const void *addr; int imgSize; while(ret == SQLITE_ROW)//如果执行成功就写入到文件描述符 { imgName = sqlite3_column_text(stmt,0); addr = sqlite3_column_blob(stmt,1); imgSize = sqlite3_column_bytes(stmt,1); printf("imgName = %s,imgSize = %d\n",imgName,imgSize); int fd = open(imgName,O_WRONLY | O_CREAT ,0666); if(fd < 0) { perror("open error:"); return 0; } write(fd,addr,imgSize); close(fd); ret= sqlite3_step(stmt);//执行 } sqlite3_finalize(stmt); sqlite3_close(db); return 0; }