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



本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/3723859.html,如需转载请自行联系原作者

相关文章
|
22天前
|
SQL 关系型数据库 MySQL
MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复
对于MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复。二进制日志是MySQL中记录所有数据库更改操作的日志文件。要进行时间点恢复,您需要执行以下步骤: 1. 确保MySQL配置文件中启用了二进制日志功能。在配置文件(通常是my.cnf或my.ini)中找到以下行,并确保没有被注释掉: Copy code log_bin = /path/to/binary/log/file 2. 在需要进行恢复的时间点之前创建一个数据库备份。这将作为恢复的基准。 3. 找到您要恢复到的时间点的二进制日志文件和位置。可以通过执行以下命令来查看当前的二进制日志文件和位
|
24天前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
164 0
|
3月前
|
关系型数据库 MySQL 数据库
往数据库的字段varchar 或datetime里存时间值
往数据库的字段varchar 或datetime里存时间值
118 0
|
16天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
2月前
|
存储 监控 安全
内网屏幕监控软件的数据存储与管理:使用SQLite数据库保存监控记录和配置信息
在当今数字化时代,安全和监控在企业和组织中变得至关重要。内网屏幕监控软件作为一种关键工具,帮助组织监视员工的活动并确保信息安全。这种软件不仅需要高效地记录和管理监控数据,还需要能够方便地进行配置和调整。本文将讨论如何使用SQLite数据库来保存监控记录和配置信息,并介绍如何通过自动化机制将监控到的数据提交到指定网站。
150 2
|
6天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。
|
1月前
|
关系型数据库 数据库 C++
嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)
嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)
|
1月前
|
存储 SQL 数据库
django如何连接sqlite数据库?
django如何连接sqlite数据库?
38 0
|
2月前
|
SQL 数据库管理
sqlite语句order by两个字段同时排序处理
sqlite语句order by两个字段同时排序处理
19 0
|
2月前
|
SQL 关系型数据库 MySQL
Python中的数据库操作:SQLite与MySQL的连接
Python中的数据库操作:SQLite与MySQL的连接
114 0