sqlite3中BLOB数据类型存储大对象运用示例
1:常用接口 个人比较喜欢sqlite,使用最方便,唯一的准备工作是下载250K的源;而且作者很热心,有问必答。 以下演示一下使用sqlite的步骤,先创建一个数据库,然后查询其中的内容。2个重要结构体和5个主要函数: sqlite3 *pdb,数据库句柄,跟文件句柄FILE很类似 sqlite3_stmt *stmt,这个相当于ODBC的Command对象,用于保存编译好的SQL语句 sqlite3_open(),打开数据库 sqlite3_exec(),执行非查询的sql语句 sqlite3_prepare(),准备sql语句,执行select语句或者要使用parameter bind时,用这个函数(封装了sqlite3_exec). Sqlite3_step(),在调用sqlite3_prepare后,使用这个函数在记录集中移动。 Sqlite3_close(),关闭数据库文件 还有一系列的函数,用于从记录集字段中获取数据,如 sqlite3_column_text(),取text类型的数据。 sqlite3_column_blob(),取blob类型的数据 sqlite3_column_int(),取int类型的数据 … 2:sqlite数据类型介绍 在进行数据库Sql操作之前,首先有个问题需要说明,就是Sqlite的数据类型,和其他的数据库不同,Sqlite支持的数据类型有他自己的特色,这个特色有时会被认为是一个潜在的缺点,但是这个问题并不在我们的讨论范围之内。 总的来说,所有存在Sqlite 3.0版本当中的数据都拥有以下之一的数据类型: ps: 在关系数据库中,CLOB和BLOB类型被用来存放大对象。BOLB表示二进制大对象,这种数据类型通过用来保存图片,图象,视频等。CLOB表示字符大对象,能够存放大量基于字符的数据。 对应的,对于数据列,同样有以下的数据类型: TEXT TEXT 将数据向文本进行转换,对应的数据类型为NULL,TEXT 或 BLOB 实例代码如下, 附件工程可直接编译,例子使用了blob数据类型。 #include "sqlite3.h" //包含一个头文件就可以使用所以sqlite的接口了 #include "stdlib.h" #include "stdio.h" #include "string.h" #pragma comment(lib,"sqlite.lib") //我把sqlite编译成了一个静态的lib文件。 void createdb(); void querydb(); int main() { createdb(); querydb(); return 0; } void createdb() { int ret; sqlite3 *pdb = 0; sqlite3_stmt *stmt = 0; char *error = 0; char *sql = "insert into table1 values('value11',:aaa)"; int &nbs; index; static void *value = "asdfadsfasdfjasdfjaksdfaskjdfakdsfaksfja"; ret = sqlite3_open("db1.sdb",&pdb); //打开数据库,跟打开文本文件一样 if( ret != SQLITE_OK ) return; ret = sqlite3_exec(pdb,"create table table1(col1 char(20),col2 BLOB)",&error ); if( ret != SQLITE_OK ) return; ret = sqlite3_prepare(pdb,sql,strlen(sql),&stmt,&error); if( ret != SQLITE_OK ) return; index = sqlite3_bind_parameter_index(stmt,":aaa"); ret = sqlite3_bind_blob(stmt,index,value,strlen(value),SQLITE_STATIC); if( ret != SQLITE_OK ) return; ret = sqlite3_step(stmt); if( ret != SQLITE_DONE ) return; sqlite3_close(pdb); } void querydb() { int ret; sqlite3 *pdb = 0; sqlite3_stmt *pstmt = 0; char *error = 0; char *sql = "select * from table1"; int len; int i; char *name; void *value; ret = sqlite3_open("db1.sdb",&pdb); if( ret != SQLITE_OK ) return; ret = sqlite3_prepare(pdb,&pstmt,&error); if( ret != SQLITE_OK ) return; while( 1 ) { ret = sqlite3_step(pstmt); if( ret != SQLITE_ROW ) break; name = sqlite3_column_text(pstmt,0); value = sqlite3_column_blob(pstmt,1); len = sqlite3_column_bytes(pstmt,1 ); } } 实例二:SQLite中如何用api操作blob类型的字段 在实际的编程开发当中我们经常要处理一些大容量二进制数据的存储,如图片或者音乐等等。对于这些二进制数据(blob字段)我们不能像处理普通的文本那样 简单的插入或者查询,为此SQLite提供了一组函数来处理这种BLOB字段类型。下面的代码演示了如何使用这些API函数。 首先我们要建立一个数据库: sqlite3_exec(db,"CREATE TABLE list (fliename varchar(128) UNIQUE,fzip blob);",&zErrMsg); //由于mmmm.rar是一个二进制文件,所以要在使用insert语句时先用?号代替 sqlite3_prepare(db,"insert into list values ('mmmm.rar',?);",-1,&stat,0); FILE *fp; long filesize = 0; char * ffile; fp = fopen("mmmm.rar","rb"); if(fp != NULL) { //计算文件的大小 fseek(fp,SEEK_END); filesize = ftell(fp); fseek(fp,SEEK_SET); //读取文件 ffile = new char[filesize+1]; size_t sz = fread(ffile,sizeof(char),filesize+1,fp); fclose(fp); } //将文件数据绑定到insert语句中,替换“?”部分 sqlite3_bind_blob(stat,1,ffile,filesize,NULL); //执行绑定之后的SQL语句 sqlite3_step(stat); 这时数据库当中已经有了一条包含BLOB字段的数据。接下来我们要读取这条数据: //选取该条数据 sqlite3_prepare(db,"select * from list;",0); sqlite3_step(stat); //得到纪录中的BLOB字段 const void * test = sqlite3_column_blob(stat,1); //得到字段中数据的长度 int size = sqlite3_column_bytes(stat,1); //拷贝该字段 sprintf(buffer2,"%s",test); 此时可以将buffer2写入到文件当中,至此BLOB数据处理完毕。 实例三:sqlite 中用blob存储图片和取出图片 #include<iostream> using namespace std; int main() char buffer2[1024]="0";
if(result) sqlite3_exec(db,&zErrMsg); fp = fopen("./data/2.bmp","rb"); if(fp != NULL) ffile = new char[filesize+1]; sqlite3_bind_blob(stat,NULL); sqlite3_prepare(db,0); const void * test = sqlite3_column_blob(stat,1); sprintf(buffer2,test); FILE *fp2; fp2 = fopen("outfile.png","wb"); if(fp2 != NULL) delete(ffile); sqlite3_finalize(stat); sqlite3_close(db); return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |