SQLite数据库如何存储和读取二进制数据
SQLite数据库如何存储和读取二进制数据
SQLite提供的绑定二进制参数接口函数为:
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
我们希望使用的是一套经过封装的COM接口,将上面这个函数封装为COM接口的形式
BindParaByIndex( LONG index, VARIANT val);
使用VARIANT变量来传递二进制数据,可以使用到它的一个SAFEARRAY指针,它保存了二进制数据的地址和二进制数据的字节长度。
在我们的COM接口中可以这样进行调用原始接口:
Sqlite3_bind_blob(m_pStmt, val.parray, val.parray->rsground->cElement,SQLITE_TRANSIENT);
构造一个例子测试我们的接口:
BYTE Data[] = {0x01,0x02,0x03,0x04,0x05};
CComSafeArray<byte> *pcsfa;
CComSafeArrayBound bound[1];
bound[0].SetCount(5);
bound[0].SetLowerBound(0);
pcsfa = new CComSafeArray<byte>(bound,1);
for(LONG i = 0; i <(LONG)5; i++)
{
HRESULT hr = pcsfa->SetAt(i,Data[i]);
}
_variant_t variant;
variant.vt = VT_ARRAY | VT_UI1;
variant.parray = pcsfa->m_psa;
将五个字节的数据封装到VARIANT变量中,然后调用相应的接口,将它们存储到数据库中,然后
调用下面的读取二进制接口,将数据读取出来,看是否读取的数据和存储的数据一致.
2. 读取二进制数据
读取二进制参数需要用到下面两个SQLite提供的API:
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
访问也通过COM接口来实现:
GetBlobData(LONG index, VARIANT* pval);
如何将原始接口读出来的数据封装到VARIANT结构中去呢,网上这方面的参考资料好少,差了不少资料,发现网上有不上SAFEARRAY的实现方案,但是我一一试了一下没有一个可以将二进制数读入SAFEARRAY结构的,Mentor给我推荐了一个CcomSafeArray类,这个类成功实现了数据的存储。
CComVariant cVal;
int nLen = sqlite3_column_bytes(m_pStmt,nIndex);
const void* pcvData = (const void*)sqlite3_column_blob(m_pStmt,nIndex);
BYTE* pData = new BYTE[nLen];
memcpy(pData,pcvData,nLen);
CComSafeArray<byte> *pcsfa;
CComSafeArrayBound bound[1];
bound[0].SetCount(nLen);
bound[0].SetLowerBound(0);
pcsfa = new CComSafeArray<byte>(bound,1);
for(LONG i = 0; i <(LONG)nLen; i++)
{
HRESULT hr = pcsfa->SetAt(i,pData[i]);
}
cVal = pcsfa->m_psa;
cVal.vt = VT_ARRAY | VT_UI1;
delete pData;
cVal.Detach(pVal);
OK,现在可以通过下面的代码来测试是否成功读取了所有的二进制数据。测试代码如下:
_variant_t val;
val = GetBlobData(nIndex); //nIndex表示BLOB类型数据的索引值
byte buf[5];
if(val.vt == (VT_UI1|VT_ARRAY))
{
for(LONG index = 0; index < 5; index++)
{
::SafeArrayGetElement(val.parray,&index,buf+index);
}
}
for(int j = 0; j < 5; j++)
{
cout << "0x" << hex <<(int) buf[j]<<endl;//测试结果为0x01,0x02,0x03,0x04,0x05
}
var allowComments=true,cb_blogId=152274,cb_entryId=3251712,cb_blogApp=currentBlogApp,cb_blogUserGuid='59ae949f-d5c2-e211-8d02-90b11c0b17d6',cb_entryCreatedDate='2013/8/11 18:00:00';loadViewCount(cb_entryId);
SQLite数据库如何存储和读取二进制数据的更多相关文章
- JDBC存储和读取二进制数据
以下JSP文件用common-fileupload组件实现文件上传,并将文件以二进制文件的形式存入数据库 <% if("POST".equalsIgnoreCase(requ ...
- [19/05/07-星期二] JDBC(Java DataBase Connectivity)_CLOB(存储大量的文本数据)与BLOB(存储大量的二进制数据)
一. CLOB(Character Large Object ) – 用于存储大量的文本数据 – 大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的.而非一般的字段,一次 ...
- (第二章第三部分)TensorFlow框架之读取二进制数据
系列博客链接: (第二章第一部分)TensorFlow框架之文件读取流程:https://www.cnblogs.com/kongweisi/p/11050302.html (第二章第二部分)Tens ...
- C# 在SQLite数据库中存储图像 z
C# 在SQLite数据库中存储图像 更多 0 C# SQLite 建表语句 CREATE TABLE [ImageStore]([ImageStore_Id] INTEGER NOT NULL ...
- python 读取二进制数据到可变缓冲区中
想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作.或者你想原地修改数据并将它写回到一个文件中去. 为了读取数据到一个可变数组中,使用文件对象的readinto() 方法.比如 im ...
- SharedPreferences数据、openFileOutput文件、SQLite数据库文件存储位置
在模拟器中: SharedPreferences将XML文件保存在/data/data/<package name>/shared_prefs目录下, openFileOutput方法将文 ...
- sqlite数据库 select 查询带换行符数据
在sqlite 数据库中用 select 语句查询带 换行符的 数据信息 实现 SELECT * from questions_exec where title like '%'||x'0 ...
- BLOB存储图片文件二进制数据是非对错
子在一天一天虚度,生活也在一天一天中茫然 做人做事哪能尽如人意,付出多少收获多少虽然存在偏颇,但是不劳而获的心态是万万不对的,更不能去怨天尤人,低调为人.做好自己就可以了 改进你的系统的最好的方法是先 ...
- SQLite入门(二)读写二进制数据
//读二进制数据的函数 BOOL OpenBinDataFile(BYTE **pBUf,UINT &len) { if (pBUf == NULL) { re ...
随机推荐
- 李洪强漫谈iOS开发[C语言-036]-C语言前四天学习小结
- 图像色彩空间YUV和RGB的差别
http://blog.csdn.net/scg881008/article/details/7168637 假如是200万像素的sensor,是不是RGB一个pixel是2M,YUV是1M? 首先, ...
- /MD, /MDD, /ML, /MT,/MTD(使用运行时库)
1. VC编译选项 多线程(/MT)多线程调试(/MTd)多线程 DLL (/MD)多线程调试 DLL (/MDd) 2. C 运行时库 ...
- poj3264Balanced Lineup(RMQ)
http://poj.org/problem?id=3264 RMQ讲解 http://dongxicheng.org/structure/lca-rmq/ j = log2K dp[i][j] = ...
- bzoj2039
还是同一类最小割问题 对于只要记住,建图是来最小化损失, 最大化收益是所有收益-最小取不到的收益 首先对于每个经理i,如果不取,必然有signma(w[i,j])收益会得不到(这里我们先不考虑额外的损 ...
- 使用 EPUB 制作数字图书
基于 XML 的开放式 eBook 格式 是否需要分发文档.创建电子图书或者把喜欢的博客文章存档?EPUB 是一种开放式的数字图书规范,以常用的技术如 XML.CSS 和 XHTML 为基础,EPUB ...
- CSS学习笔记——定位position属性的学习
今天学习之前剩下的一个问题:CSS的position属性.首先归纳出和position相关的问题: position作为一个属性,它一共有哪几个属性值? position常用的属性值有哪几个?分别有什 ...
- ASCII,Unicode和UTF-8
转自:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 今天中午,我突然想搞清楚Unicode和UTF-8之间的关 ...
- useradd adduser linux创建用户、设置密码、修改用户、删除用户
创建用户.设置密码.修改用户.删除用户: useradd testuser 创建用户testuser passwd testuser 给已创建的用户testuser设置密码 说明:新创建的用户会在/h ...
- FZU 2233 ~APTX4869 贪心+并查集
分析:http://blog.csdn.net/chenzhenyu123456/article/details/51308460 #include <cstdio> #include & ...