使用ADO实现BLOB数据的存取-ADO开发实践之二

一、前言

在上一篇文章《ADO第一次亲密接触》中我们详细介绍了ADO基本的操作方法,在实际的开发过程中我们常常需要存储较大的二进制数据对象,比如:图像、音频文件、或其它二进制数据,这些数据我们称之为二进制大对象BLOB(Binary Large Object),其存取的方式与普通数据有所区别。本文将介绍利用ADO在数据库中存取BLOB数据的具体实现过程,并给出实现图像存取显示的完整示例工程。

二、前期准备

首先我们建立一张名为userinfo的表,包含三个字段:id,username,old,photo,其中photo是一个可以存储二进制数据的字段。

2.1 在SQL SERVER中我们可以在Query Analyzer中直接输入如下语句创建:

CREATE TABLE [dbo].[userphoto] (
  [id] [int] IDENTITY (1, 1) NOT NULL ,
  [username] [varchar] (50) NULL ,
  [old] [int] NULL ,
  [photo] [image] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

其中photo我们定义为image类型的字段。

2.2 在ACCESS中创建的方法如下:

建立一张新表包括id,username,old,photo四个字段,然后打开表,选视图菜单中设计视图,将id设置为自动编号的递增长整型,username为文本,old为数字,photo为OLE对象。

在我们的示例工程中已经包含了一个建立好的ACCESS2000的库,你可以直接拿来使用。

三、具体步骤

3.1 BLOB数据的保存

BLOB类型的数据无法用普通的方式进行存储,我们需要使用AppendChunk函数,AppendChunk包含在Field对象中,原型如下:

HRESULT AppendChunk (const _variant_t & Data );

从函数原型中可以看到关键的问题是我们需把二进制数据赋值给VARIANT类型的变量,下面我们给出具体的代码并作简单的分析:

///假设m_pBMPBuffer指针指向一块长度为m_nFileLen的二进制数据,并且已经成功打开了记录集对象m_pRecordset///
char    *pBuf = m_pBMPBuffer;
VARIANT    varBLOB;
SAFEARRAY  *psa;
SAFEARRAYBOUND  rgsabound[1];
m_pRecordset->AddNew();                       ///添加新记录
m_pRecordset->PutCollect("username",_variant_t("小李"));       ///为新记录填充username字段
m_pRecordset->PutCollect("old",_variant_t((long)28);         ///填充old字段
if(pBuf)
{  
  rgsabound[0].lLbound = 0;
  rgsabound[0].cElements = m_nFileLen;
  psa = SafeArrayCreate(VT_UI1, 1, rgsabound);           ///创建SAFEARRAY对象
  for (long i = 0; i < (long)m_nFileLen; i++)
   SafeArrayPutElement (psa, &i, pBuf++);             ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中
  varBLOB.vt = VT_ARRAY | VT_UI1;                  ///将varBLOB的类型设置为BYTE类型的数组
  varBLOB.parray = psa;                       ///为varBLOB变量赋值
  m_pRecordset->GetFields()->GetItem("photo")->AppendChunk(varBLOB);///加入BLOB类型的数据
}
m_pRecordset->Update();                       ///保存我们的数据到库中

至此我们的数据已经成功地保存到了数据库中,接下来我们所要做的工作便是将该数据提取出来,让我们继续吧!

时间: 2024-09-20 01:00:36

使用ADO实现BLOB数据的存取-ADO开发实践之二的相关文章

ADO+ 引导数据种类的演变(转自 ms 二)

ADO+ 增加了哪些内容? 用最抽象的话来说,ADO+ 是具有更大的可伸缩性和互操作性的 ADO.就对象模型及编程问题而言,ADO 与 ADO+ 是完全不同的两个实体.尽管这样,ADO+ 源自 ADO 并保留了它的鼓舞人心的原则. 以更多互操作性和可伸缩性充实 ADO 的关键在于断开这个概念.在允许客户机端的脚本代码实现诸如排序.过滤和文档/视图模型之类的有趣和交互式功能的同时,断开的记录集作为一种保留系统资源的方式被引入到 ADO 2.0 中.ADO+ 与 ADO 相比具有三个主要优点:互操作

sql语句 #-在VS2010中如何使用ADO.net更新数据操作

问题描述 在VS2010中如何使用ADO.net更新数据操作 我想把数据库中的某一表中的int型的变量取出来,然后进行自减操作,然后再存到数据 库中,具体的C#语句该怎么写呢? 解决方案 SqlConnection conn = new SqlConnection(连接字符串); conn.Open(); SqlCommand cmd = new SqlCommand("update 表名 set 字段=字段+1 where id = xxx", conn); cmd.ExecuteS

mfc操作-mfc ado数据库连接以及数据操作

问题描述 mfc ado数据库连接以及数据操作 ado 连接sql serve数据库 如何把数据读取出来显示到报表中啊? 每次总是连接数据库 总是出现无效指针错误 这个应该如何弄啊? 我是新手请教各位大神帮忙啊! 解决方案 连接数据库的字符串有问题.

vbs中使用 ADO 读取所有数据均在一行上的文本文件的代码_vbs

使用 ADO 读取所有数据均在一行上的文本文件问: 您好,脚本专家!我有一个固定宽度的文本文件,该文件包含名字(6 个字符).姓氏(13 个字符)和部门(9 个字符),并且它们均在同一行上.我该如何使用 ADO 来读取呢? -- DW 答: 您好,DW.坦白地讲,我们认为您不能使用 ADO(ActiveX 数据对象)读取这样的文件.ADO 是一种和文本文件进行交互的非常好的方法(有关详细信息,请参阅文章有关文本文件的 ADO 更多知识(英文)),但是,确实,ADO 有些挑剔:它的每项设置都必须完

JDBC+Hibernate将Blob数据写入Oracle

oracle|数据 Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢? 这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor用select查询出

ado-请教ADO操作Access库重复用ADO对象的问题

问题描述 请教ADO操作Access库重复用ADO对象的问题 我写了一个CADO类,我在构造函数里初始化com组件,创建连接对象并实例化.在析构函数里清除com组件,并关闭连接对象.我还写个一个函数_Recoreset ExcuteSQL(CString str) 里面定义了一个记录集对象并且实例化,然后将参数转化成SQL 语句,打开记录集并且把记录集返回. CADO::CADO() { //初始化COM库 ::CoInitialize(NULL); try { //创建连接对象实例 m_pCo

mysql是否支持blob 数据的 批处理插入,求教

问题描述 今天执行mysqlblob数据的批处理插入,遇到问题,所有blob数据的批处理,只执行了第一条,后边的数据blob字段没有执行插入.求教各位高人,先谢.Connectionconn=ds.getConnection();InputStreamis=newFileInputStream(f);StringsqlString="insertinto`dateinfo`(userID,name,averageoil,date,trip)"+"values('12','su

关于Adodb.Stream的写数据库数据到客户端文件的实践

ado|stream|客户端|数据|数据库 这是一个从服务器数据库直接下数据到客户端文件的例子,文件名和扩展名可以根据需要随便写.new/temp.htm要求真实存在,其实没有什么作用,只是引导一下,否则不能对stram数据进行写操作.网络上流传的这方面的东西不少,但多数是copy来的,很简单的事情搞得那么复杂.真正经过实践的东东少得可怜.于是自己写了一个,虽然简单,也有些问题,但是copy下去就可以用了.有问题的朋友可以跟我联系,好一起学习. filemystream=server.mappa

ASE12.5数据库内嵌JAVA开发指南

开发指南|数据|数据库 ASE12.5数据库内嵌JAVA开发指南 作者:翁彦 时间:2004年4月 平台 Windows 2000 Server ASE 12.5 developer edtion for NT 声明 欢迎转载,请保留本申明信息 enhydraboy@yahoo.com.cn     用过ORACLE 8i的朋友,知道ORACLE 8i中,可以通过loadjava命令将java对象内嵌在数据库里面.这样可以使得PL/SQL程序可以调用这些JAVA对象.这个技术的好处在于: 1 扩