使用sqlite保存图片和导出图片

前端之家收集整理的这篇文章主要介绍了使用sqlite保存图片和导出图片前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本人在使用sqlite数据库时,使用c语言作为调用sqlite数据库的嵌入式语言,在调用的时候实现了对图片和视频的保存和调用。结果获得了成功。这是一个对blob类型的使用例子。

下面时本人的试验代码,已在本机运行通过。

#include<iostream>
#include<string>
#include"sqlite3.h"
using namespace std;
int main()
{
sqlite3 *db;
sqlite3_stmt *stat;
char *zErrMsg = 0;
char buffer2[1024]="0";
int result;

result = sqlite3_open("sqlite.db",&db);

if(result)
{
cout<<"Open the database sqlite.db Failed"<<endl;
}

else
cout<<"Open the database sqlite.db sucessfully"<<endl;

sqlite3_exec(db,"CREATE TABLE linhui (fliename varchar(128) UNIQUE,fzip blob);",&zErrMsg);


//sqlite3_prepare()第一个参数跟前面一样,是个 sqlite3 * 类型变量,第二个参数是一个 sql 语句。这个 sql
//语句特别之处在于values 里面有个 ? 号。在sqlite3_prepare函数里,?号表示一个未定的值,它的值等下才插入。
sqlite3_prepare(db,"insert into linhui values ('./images/5.bmp',?);",-1,&stat,0);

FILE *fp;
long filesize = 0;
char * ffile;
fp = fopen("./images/5.bmp","rb");
if(fp != NULL)
{
fseek(fp,SEEK_END);//将fp指针退回到距离文件结尾0个字节处。
filesize = ftell(fp);//函数 ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数。
fseek(fp,SEEK_SET);//将fp指针指到距离文件头0个字节处。
ffile = new char[filesize+1];//创建一个空间为dilesize大小的字符型数组。
size_t sz = fread(ffile,sizeof(char),filesize+1,fp);//将fp指针指向的文件读取filesize+1个大小的以char为元素单位大小,到ffile中。

fclose(fp);//关闭文件读取
}


//sqlite3_bind_blob()函数中。?号的索引。前面prepare的sql语句里有一个?号,假如有多个?号怎么插入?方法就是改变 bind_blob 函数第2个参数。
//这个参数我写1,表示这里插入的值要替换 stat 的第一个?号(这里的索引从1开始计数,而非从0开始)。
//如果你有多个?号,就写多个 bind_blob 语句,并改变它们的第2个参数就替换到不同的?号。如果有?号没有替换,sqlite为它取值null。
//本函数是将图片保存到stat的表中。
sqlite3_bind_blob(stat,1,ffile,filesize,NULL);

sqlite3_step(stat);//通过这个语句,stat 表示的sql语句就被写到了数据库里。
sqlite3_prepare(db,"select * from linhui;",0);
sqlite3_step(stat);
const void * test = sqlite3_column_blob(stat,1);
int size = sqlite3_column_bytes(stat,1);
sprintf(buffer2,"%s",test);

FILE *fp2; fp2 = fopen("4.bmp","wb"); if(fp2 != NULL) { size_t ret = fwrite(test,size,fp2); //将fp2的图片写进test中fclose(fp2); } delete(ffile); sqlite3_finalize(stat); sqlite3_close(db); return 0; }

猜你在找的Sqlite相关文章