sqlite3数据库存取和取出图片

近期学习使用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;
}



猜你喜欢

转载自blog.csdn.net/sinat_39061823/article/details/77448555