博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sqlite 二进制字段 (zz)
阅读量:5988 次
发布时间:2019-06-20

本文共 1623 字,大约阅读时间需要 5 分钟。

有时我们用数据库存储文件,需要用到二进制字段,下面列常用方法。

   1.写二进制数据

     sqlite3 * db;

     int result;

     char **errmsg =NULL;

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

    if( result != SQLITE_OK )

{ return -1;}

result = sqlite3_exec( db,"create table tb( ID integer, content  blob)", NULL, NULL, errmsg);

if(result != SQLITE_OK){printf("erro");}

 

       char *buffer;//要写的二进内容,也可以从文件读出来

       buffer=new char[1024*1024];

       for(int i=0;i<1024*1024;i++)buffer[i]='a';

 

sqlite3_stmt  *stat;//写二进制数据时要用的结构

       sqlite3_prepare( db, "insert into tb( ID,  content) values( 10, ? )", -1, &stat, 0 );//准备插入数据

       sqlite3_bind_blob( stat, 1, buffer, strlen(buffer), NULL ); //把内容和字段绑定

       result=sqlite3_step( stat );//执行

       sqlite3_finalize( stat );释放内存

sqlite3_close( db );

 

2.读二进制数据

 这里重点介绍一下sqlite3_blob_open函数

这个函数用于打开二进制字段数据

第一个参数是数据库句柄

第二个参数是数据库名

第三个参数是表名

第四个参数是二进制数据字段(列)名

第五个参数是行数,也就是打开第几行的字段。

第六个

第七个参数是二进制文件句柄

用这个函数打二进制字段就像打开文件一样简单。

下面为例子代码:

 

sqlite3 * db;

     int result;

     char **errmsg =NULL;

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

    if( result != SQLITE_OK )

{ return -1;}

int rf= sqlite3_blob_open(db,NULL,"Tbl_2","file_content",1,1,&sqlite3_blob);

 

if(rf!= SQLITE_OK)return –1;

       int len=sqlite3_blob_bytes(sqlite3_blob);//得到二进数据长度

sqlite3_blob_read(sqlite3_blob,buffer,len,0); 读二进数据,最后一个参数为起始位置

//如果不想读全部内容,可以设置这个参数

       sqlite3_blob_close(sqlite3_blob);//关闭

sqlite3_close( db );

   3.几个问题

a.       sqlite3_blob_open函数第五个参数读第几行的数据,不知道通过什么函数能得到当前行的绝对行数,而sqlite3_total_changes函数只能得更改行的相对行数。

b.       sqlite3_blob_write函数是用于写二进制数据,但这个函数只能用于修改二进制数据,不能用于插入二进制数据,而写数据的时候长度不能超过第一次插入数据时的长度。

  我希望存储的单个二进数据字段可能有几个G的容量,而且随时有可能修改,长度会不断变化,用sqlite3_stmt显然是不行的,而 sqlite3_blob_write函数又不能改变二进数据字段的长度,是我对Sqlite了解的不多,还是这个数据库本身就有这个限制 ,希望高手能够指点。

 

转载地址:http://sbnlx.baihongyu.com/

你可能感兴趣的文章
Hive深入浅出
查看>>
uva 1594 Ducci Sequence <queue,map>
查看>>
40、JDBC相关概念介绍
查看>>
unix
查看>>
Spring Boot MyBatis 通用Mapper插件集成
查看>>
testNg vs junit 4.X @Test
查看>>
微信公众号用户OpenID同步导出系统
查看>>
如何自定义 maven中的archetype
查看>>
使用bitmap处理海量数据
查看>>
(转)Bootstrap 之 Metronic 模板的学习之路 - (5)主题&布局配置
查看>>
初学JavaScript之推測new操作符的原理
查看>>
MyBatis入门程序之整合Spring
查看>>
CommonClassLoader或SharedClassLoader加载的Spring如何访问并不在其加载范围内的用户程序呢...
查看>>
【Java学习笔记之六】java三种循环(for,while,do......while)的使用方法及区别
查看>>
微软 改变 开源【几个站点】
查看>>
html-webpack-plugin插件 根据模板生成多页面
查看>>
webApi文档好帮手-apidoc使用教程
查看>>
方差,协方差,自协方差,互协方差,自相关,互相关
查看>>
如何统计代码行数
查看>>
机器学习结果加ID插入数据库源码
查看>>