1.       存储二进制数据

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

}

转载于:https://www.cnblogs.com/top5/archive/2009/11/26/1611479.html

SQLite数据库如何存储和读取二进制数据相关推荐

  1. 数据库可以存储哪些类型的数据

    baidu了很久,也不知道是不是因为baidu垃圾,才入门数据库,不知道数据库能存储哪些类型的数据,网上搜了半天没有搜到答案,因此,自己理解就是电脑上的一切数据都是按着二进制来存储,因此数据库是可以存 ...

  2. matlab 十六进制数组,【MATLAB】MATLAB中读取二进制数据文件并加入到矩阵中

    MATLAB中读取二进制数据文件并加入到矩阵中的应用如下: 如果对c语言十分熟悉的话,应该对fopen,fclose,ftell,fseek,fread,fwrite,feof 这些函数非常熟悉了,在 ...

  3. python 读取二进制数据到可变缓冲区中

    想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作.或者你想原地修改数据并将它写回到一个文件中去. 为了读取数据到一个可变数组中,使用文件对象的readinto() 方法.比如 im ...

  4. 前端读取文件图片信息流;js读取图片不同信息流;js读取图片;前端就js读取二进制数据;前端js读取文件流使用FileReader对象的readAsDataURL方法来读取图像文件;

    原文链接 FileReader来把文件读入内存,并且读取文件中的数据. readAsDataURL方法可以在浏览器主线程中异步访问文件系统,读取文件中的数据,且读取后 result 为 DataURL ...

  5. 《Python Cookbook 3rd》笔记(5.9):读取二进制数据到可变缓冲区中

    读取二进制数据到可变缓冲区中 问题 你想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作.或者你想原地修改数据并将它写回到一个文件中去. 解法 为了读取数据到一个可变数组中,使用文件 ...

  6. Matlab读取二进制数据文件

    第一步:函数fopen打开文件 fid=fopen('文件名',读取方式) fid:句柄值 小于0表示打开失败:大于0表示打开成功 文件名:字符串,使用单引号(本文例子'savedata.dat') ...

  7. 在SQL数据库中存储纬度和经度数据时要使用的数据类型是什么? [重复]

    本文翻译自:What datatype to use when storing latitude and longitude data in SQL databases? [duplicate] Th ...

  8. python读取数据库数据类型_从SQL数据库读取二进制数据(图像数据类型)并将其膨胀,Matlab vs.Python...

    完全编辑: 我迫切需要使用Python访问microsoftsqlserver并从中读取压缩数据.在经历了很多麻烦之后,我终于找到了一个可以工作的Matlab实现,它可以完成这个任务.不过,我需要用P ...

  9. javascript 类型数组读取二进制数据

    先建一个文件,按UTF-16大端 BOM 格式保存一个字符串:hi aleck, 使用 file API 把他按二进制方式读取到浏览器. 文件读取方法在这里: http://hi.baidu.com/ ...

最新文章

  1. hdu3987 最小割边数
  2. VTK:图片之ImageSobel2D
  3. codeblock下载
  4. SAP的软件是如何深刻影响着世界的?
  5. js实现svg图形转存为图片下载
  6. 动手实操丨基于随机森林算法进行硬盘故障预测
  7. python列表推导式生成随机数_python 【迭代器 生成器 列表推导式】
  8. python性别只能为男或女_Pycaffe实践 1)分类:性别识别
  9. Python内置函数之-struct
  10. Android性能优化-过度绘制解决方案
  11. Unity 游戏中近战攻击判定检测——射线检测
  12. 【计算机网络学习笔记04】网络体系架构与网络协议
  13. 忘记ubuntu登录密码
  14. 二期开发立项申请书,已经提交,等待批准!
  15. android天气预报sdk,Android手机集成天气预报功能方案:全国天气预报API调用
  16. 主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs
  17. 1100 校庆分数 25
  18. vue中css写法_vue css 写法大全
  19. 你与植物人有何区别?意识与复杂性的新研究给你答案
  20. Ubuntu安装时卡在安装界面怎么办

热门文章

  1. Visual Editor插件下载、安装问题(Eclipse3.1.1)
  2. Java动态编译执行
  3. FocusBI:租房分析可视化(PowerBI网址体验)
  4. Lock和synchronized的选择
  5. 亮剑:PHP,我的未来不是梦(11)
  6. 关于img 403 forbidden的一些思考
  7. Sybase用户登录以后的自动运行脚本
  8. 分享一个CSS3和jQuery实现的模糊显示效果 - 帮助你的访问用户更好的阅读内容
  9. java建立tcp服务器长连接_B/S 架构下后端能否建立 TCP 长连接?
  10. Go语言实战 : API服务器 (2) 运行流程