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

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)的更多相关文章

  1. C# asp.net 导出数据库二进制字段到excel

    前台的话不多说,本次只详细说下后台导出数据库中的二进制字段,上传下次有时间再说,有比较急的可以留言我 之前在网上搜了关于下载导出二进制字段的资料,发现都不是我想要的,都只是把上传的文件放到服务器然后下 ...

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

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

  3. Sqlite 修改字段的名称。

    Sqlite 不支持直接修改字段的名称. 我们可以使用别的方法来实现修改字段名. 1.修改原表的名称 ALTER TABLE table RENAME TO tableOld; 2.新建修改字段后的表 ...

  4. SQLite中字段顺序和PAGE_SIZE对性能的影响

    1.背景 SQLite数据库中有1张表,该表含若干个字段,其中有1个字段为BLOB类型,且BLOB字段不是最后1个字段.表结构类似如下(col3为BLOB字段): T (col1 INTEGER,co ...

  5. delphi ftBlob二进制字段读取存储

    aStream:TMemoryStream; 保存到字段 qrypub.ParamByName('Data').LoadFromStream(aStream, ftBlob); 从字段读取到mem里 ...

  6. SQLITE 时间字段操作函数

    SQLite中的时间日期函数 这是我学习SQLite时做的笔记,参考并翻译了Chris Newman写的<SQLite>中的<Working with Dates and Times ...

  7. android:Android中用文件初始化sqlite数据库(zz)

        很多时候在应用安装初始化时,需要创建本地数据库,同时为数据库添加数据,之后再从数据库中读取数据. 这里有2个思路 1.先在本地创建一个能支持android使用的sqlite数据库文件,启动时, ...

  8. Android中查看SQLite中字段数据的两种方式

    方式一:ADB Pull 通过adb pull导出*.db文件到PC的文件夹中,通过可视化工具 SQLiteExpertPers 进行查看.编辑: adb pull /data/data/com.jo ...

  9. 关于SQLite数据库 字段 DateTime 类型

    这两天刚接触SQLite 数据库 还没有太过于深入的了解 , 于是出现了一个问题 : 我在 C#中 ,使用SQLiteHelper 查询SQLite数据库数据时,报了这个错误: System.Form ...

随机推荐

  1. LeetCode解题报告—— Permutations & Permutations II & Rotate Image

    1. Permutations Given a collection of distinct numbers, return all possible permutations. For exampl ...

  2. linux下输入密码不回显

    这几天在做一个登陆的程序,需要将输入的密码屏蔽掉,自己百度,找到了两种方法,先贴下第一种方法, #include<stdio.h> #include<unistd.h> int ...

  3. 一个Apache安装多个版本的PHP

    我的服务器centos6.5安装了xampp,php6.5版本的.已经有好几个网站在上面运行了,但是后面要安装该死的ecshop,无奈要装php5.2,因此就想如何能在一个apache上安装多个版本的 ...

  4. 剑指offer-链表中倒数第 K 个结点

    输入一个链表,输出该链表中倒数第k个结点. /* public class ListNode { int val; ListNode next = null; ListNode(int val) { ...

  5. Poj1733 Parity Game(带权并查集)

    题面 Poj 题解 反正只要你判断是否满足区间的奇偶性,假设每一位要么是\(1\)要么是\(0\)好了. 假设有\(S\)的前缀和为\(sum[]\),则有: 若\(S[l...r]\)中有奇数个\( ...

  6. 10 个常用的 es6 特性

    1. const  and let 除了函数作用域之外,增加了块级作用域和常量.const 定义的绑定不可以修改,let定义的绑定在{ }不能访问.之前的 var 如果不在函数作用域内,相当于定义了一 ...

  7. 【剑指offer】顺时针打印数组

    顺时针打印数组 题意 例如我们有一个二维数组,如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 现在要按照顺时针打印出来,结果应该为: 1 2 3 4 8 12 16 ...

  8. 1. ECMAScript 6 简介--ES6

    1. ECMAScript 和 JavaScript 的关系 国际标准化组织ECMA 制定了语言 ECMAScript, 该标准针对 Javascript 语言制定, 不叫Javascript 原因有 ...

  9. 关于 CommonJS AMD CMD UMD

    1. CommonJS CommonJS 原来叫 ServerJS, 是服务器端模块的规范,Node.js采用了这个规范. 根据CommonJS规范,一个单独的文件就是一个模块.加载模块使用requi ...

  10. [BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)

    差分之后就是求多串LCS. 对其中一个串建SAM,然后把其它串放在上面跑. 对SAM上的每个状态都用f[x]记录这个状态与当前串的最长匹配长度,res[x]是对每次的f[x]取最小值.答案就是res[ ...