SQLite数据库如何存储和读取二进制数据

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[html] 你有使用过summary标签吗?说说它的用途

[html] 你有使用过summary标签吗&#xff1f;说说它的用途 没有用过这个标题&#xff0c;认真地查阅了一下。 发现summary标签和details标签是配套使用的&#xff0c;而且仅有Chrome和Safari 6浏览器支持。 summary标签是作为details标签里的标题&#xff0c;details标签用于描…

Git 仓库 清理 瘦身

第一步&#xff0c;找出大文件或误添加的文件 git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk {print $1})" 第二步&#xff0c;从仓库中删除文件或文件夹 删文件&#xff0c;将 bigfile 换成上…

去除标题_资深运营导师-云中教你轻松写标题

一、标题作用解读标题对于产品的意义买家购买逻辑想到一款产品&#xff0c;并知道他的名称去网上搜索&#xff0c;看到图片等信息类比价格评价等内容&#xff0c;下单收到货和自己根据标题照片评判商品核心要点&#xff1a;买家是根据产品名字作为购买切入点&#xff1b;照片和…

电大计算机网考选择题多少分,2016年度电大计算机网考选择题及标准答案.doc

2016年度电大计算机网考选择题及标准答案^计算机网考选择题及答案1.微型计算机的性能指标不包括______。DA.字长 B.存取周期 C.主频 D.硬盘容量2.计算机硬件系统的主要组成部件有五大部分&#xff0c;下列各项中不属于五大部分的是______。BA.运算器 B.软件 C.I/O设备 D.控制器…

Oracle OCM 认证指南

OCM考试全称为Oracle Certified Master(Oracle认证大师)&#xff0c;是在OCA(Oracle认证专员Oracle Certified Associate)、OCP(Oracle认证专家Oracle Certified Professional)之后更高一级的Oracle技术认证&#xff0c;也是Oracle技术认证最高的一个级别。 考试是两天的时间&a…

李宏毅机器学习课程---2、Regression - Case Study

李宏毅机器学习课程---2、Regression - Case Study 一、总结 一句话总结&#xff1a; 分类讨论可能是比较好的找最佳函数的方法&#xff1a;如果 有这样的因素存在的话 模型不够好&#xff0c;可能是因素没有找全 因素以及函数的复杂度&#xff0c;并不是越高越好&#xff0c;适…

[html] 如何动态修改`<title>`的标题名称?

[html] 如何动态修改<title>的标题名称&#xff1f; 1、原生&#xff1a;document.getElementsByTagName("title")[0].innerText your title document.title your title 2、jquery: $(title).html(your title) $(title).text(your title)个人简介 我是歌谣…

报名学校计算机考试在哪里报,全国计算机等级考试报名流程

全国计算机等级考试报名流程全国计算机等级考试采用全国统一命题&#xff0c;统一考试的形式&#xff0c;各科目均为上机操作考试。1&#xff0e;上网填报基本信息考生可任意选择地点并在规定时间内上网填报、修改及查询本人信息。填报过程分为登录、查看提示信息、输入并提交报…

卸载一直在创建还原点_如何创建系统还原点以及如何恢复?

如何创建系统还原点1、在搜索框中输入“创建还原点”并打开。2、在“系统保护”选项卡中点击“创建”。3、为此次还原点添加备注描述&#xff0c;此处命名为测试&#xff0c;点击创建即可。恢复系统至上一个还原点1、在刚才的“系统保护”界面中点击“系统还原”。2、在弹出的系…

UNICODE字符集

Unicode &#xff1a;宽字节字符集1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数&#xff1f;可以调用Microsoft Visual C的运行期库包含函数_mbslen来操作多字节&#xff08;既包括单字节也包括双字节&#xff09;字符串。调用strlen函数&#xff0c;无…

学生党的Surface Pro 5乞丐版使用体验

因为已经装了台式机&#xff0c;大一开学时买的厚重且续航差的华硕游戏本&#xff08;i5GTX950M8G)对我这个考研党已经显得不合适了。恰巧有一同学笔记本坏了&#xff0c;我便将游戏本低价出了&#xff0c;然后用两三倍的价格&#xff0c;入手了surface pro5 (new surface)的最…

2018计算机河北省高考试题,2018年河北高考物理压轴试题【含答案】

2018年河北高考物理压轴试题【含答案】18&#xff0e;如图4所示&#xff0c;由粗细均匀的电阻丝制成的边长为L的正方形金属框向右匀速运动&#xff0c;穿过方向垂直金属框平面向里的有界匀强磁场&#xff0c;磁场宽度d2L。从ab边刚进入磁场到金属框全部穿出磁场的过程中&#x…

[html] 为什么说cookie不可以滥用?

[html] 为什么说cookie不可以滥用&#xff1f; 1.安全问题 2.每次请求都会携带cookie,占内存&#xff0c;影响带宽 3.不能跨域 4.可储存的内容少个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目…

富士通01018z平板电脑评测_档案扫描好帮手,富士通ix1500无线双面高速扫描仪评测...

扫描仪是办公中常用的一种设备&#xff0c;尤其是建立了较为完备的档案管理制度的企业和组织&#xff0c;经常需要扫描和存档大量的文稿和图像&#xff0c;下文就介绍一台获得日本Good Design设计奖的无线高速扫描仪——富士通ScanSnap iX1500。打开包装可以看到ScanSnap iX150…

鼠标搭上显示背景色

原来帮一小朋友写的简单的应用&#xff0c;没有什么技术含量&#xff0c;只是做一学习过程的记录。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns&q…

《JAVA核心技术》

java 开发环境搭建 第3章 java的基本程序设计结构转载于:https://www.cnblogs.com/rivsidn/p/10976712.html

计算机教案评比,信息技术课堂教学评比案例——多媒体作品合成;

让多媒体作品合成插上魔术的翅膀----《多媒体作品合成》教学案例普陀中学柯林一、教材分析教学内容为教科社版、普通高中课程标准实验教材《多媒体技术应用》(必修)第4章《作品的合成与提交》第2节《多媒体作品的合成》。本节旨在进一步培养和提升学生利用多媒体软件合成多媒体…

[html] 一个标签上同时出现三个或多个class属性,请问它的渲染顺序是怎样的?

[html] 一个标签上同时出现三个或多个class属性&#xff0c;请问它的渲染顺序是怎样的&#xff1f; 按照css定义的顺序从前往后渲染&#xff0c;后定义的同类属性覆盖前面定义的。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持…

工厂模式 + 反射 ?= 灵活多变的数据库

工厂模式 反射 ? 灵活多变的数据库么 由于现实项目中我们难保会客户会更换系统的数据库&#xff0c;这样我们需要把若干数据库各种情况基本上都想到。多种数据库&#xff0c;引出抽象&#xff0c;我们就能在众多数据库的上层抽出一个Factory&#xff0c;由Factory去引导具体…

中使用swiper不能自动切换_液晶拼接墙显示系统中矩阵切换器使用的注意事项

近年来在液晶拼接墙显示系统中矩阵切换器的使用已变得越来越普遍、这主要是因为各矩阵切换器品牌商根据众多用户的实际需求对矩阵进行了同能扩展与完善。这也使得矩阵切换器除了使用在大屏拼接显示系统外还适用于多媒体会议系统、调度指挥系统、数字化城市建设、安防等工程。而…