您的位置:首页 > 数据库

sqlite3数据库存取和取出图片

2017-08-21 13:12 393 查看
近期学习使用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sqlite3