sqlite 二进制字段 (zz)

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

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了解的不多,还是这个数据库本身就有这个限制
,希望高手能够指点。

sqlite 二进制字段 (zz),布布扣,bubuko.com

时间: 2024-12-11 15:10:50

sqlite 二进制字段 (zz)的相关文章

eImage(仅两行代码实现输出从数据库中查询到的二进制字段)标签

功能: 专门用于向浏览器输出从数据库中查询到的二进制字段.支持通用的几十种文件类型 别名为edoc 使用方法: <chtml><eimage id=书包名type=类型>key</eimage></chtml>或 <chtml><edocid==书包名 type=类型>key</edoc></chtml> ·        id:书包名.ESql标签返回的书包名称 ·        type:类型.输出文件类型

sqlite删除字段办法 near &#39;drop&#39;:syntax error;

sqlite删除字段时提示附近有语法错误,怎么解决呢?sqlite中ALTER TABLE语句不支持DROP COLUMN,只有RENAME 和ADD 解决办法: 1.创建一个临时表,把除了要删的字段以外的字段加上 create table _temp as select _id,name,age,balance from person; select * from _temp; 2.删除原表 drop table person; 3.把临时表命名成原表 alter table  _temp r

Oracle数据库插入二进制字段数据

oracle数据库喜欢搞特殊,二进制字段数据不能直接插入,需先再该字段插入oracle函数返回的的初始数据,然后在查询更新该字段.下面以Blob字段类型为例: 1.插入初始数据 Class.forName("oracle.jdbc.driver.OracleDriver");      Connection cn= DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.5:1521:orcl", "

[转]SQLite支持字段类型及建表

转自:http://boonya.iteye.com/blog/2118252 一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断. SQLite具有以下五种数据类型: 1.NULL:空值. 2.INTEGER:带符号的整型,具体取决有存入数字的范围大小. 3.REAL:浮点数字,存储为8-byte IEEE浮点数. 4.TEXT:字符串文本. 5.BLOB:二进制对象. 但实际上,sqlite3也接受如下的数据类型: smallint 16 位元的整数.

2015.1.5 用DBFactorySingleton写、读二进制字段与oralce CLOB类型字段读写[除非需要做内部解析,不要用CLOB,CLOB速度要比BLOB慢15倍以上]

//写 FileStream fstr = File.OpenRead(tb_filepath.Text); //openread函数用于打开只读文件,openwrite可写 BinaryReader br = new BinaryReader(fstr); byte[] buffer = br.ReadBytes((int)fstr.Length); string sql = string.Format("insert into NVDUSER_FLT.FILE_SOURCE values(1

SQLITE 时间字段操作函数

SQLite中的时间日期函数 这是我学习SQLite时做的笔记,参考并翻译了Chris Newman写的<SQLite>中的<Working with Dates and Times>一文中的部分内容. SQLite包含了如下时间/日期函数:datetime().......................产生日期和时间date()...........................产生日期time()...........................产生时间strftime

关于SQLite数据库 字段 DateTime 类型

这两天刚接触SQLite 数据库 还没有太过于深入的了解 , 于是出现了一个问题 : 我在 C#中 ,使用SQLiteHelper 查询SQLite数据库数据时,报了这个错误: System.FormatException:“该字符串未被识别为有效的 DateTime.” 在网上查询了一些文章后,我发现sqlite使用标准的时间格式,即 yyyy-mm-dd hh:mm:ss 我之前存储的数据为 2017-7-10 9:25:36 按照标准格式 更改为: 2017-07-10 09:25:36

SQLite可视化管理工具汇总

版权声明:本文为博主原创文章,未经博主允许不得转载. 搜集了一些SQLite工具,在这里做个总结,有的工具用的多一些,有的只是简单试用,甚至未试用,所以有描述不当的还请回复指正,也欢迎补充完善! 2015-03-11 更新情况: SQLiteSpy最新版本1.9.8,重大改变,支持db拖拽 SQLiteStudio最新版本3.0.3,重大改变,打开数据量较大的数据库速度明显改善,还有count查询,堪比SQLiteExpert SQLiteExpert 最新版本3.5.76,相信也更好用了,尚未

SQLite语句小结

一.创建数据库: 1.点击connection,选择SQLite 2.输入“连接名”和“选择保存数据库的路径” 3.选择完路径之后,双击“连接名”,出来main(如图) 4.右击main,选择New Query...,(打开一个新窗口) 5.SQ语句: PS:先明白几个名词概念: a.表名:t_people(格式t_名字).一张表对应一个表名.在一个数据库中可以存在很多表. b.关键字. c.字段.一张表可以有很多字段,一个字段是一列.但是有且只能有一个字段是主键.主键用来唯一标识一条记录.(r