本人在使用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中。
//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; }
原文链接:https://www.f2er.com/sqlite/202855.html