基于ADONET的BLOB数据存取方法研究Word文档格式.docx
《基于ADONET的BLOB数据存取方法研究Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于ADONET的BLOB数据存取方法研究Word文档格式.docx(8页珍藏版)》请在冰点文库上搜索。
![基于ADONET的BLOB数据存取方法研究Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/657c1346-37ad-4c1b-b5a4-8b51d66f083f/657c1346-37ad-4c1b-b5a4-8b51d66f083f1.gif)
杨平利(1964-),男,博士,西北核技术研究所高级工程师,研究方向为软件工程与虚拟仿真;
齐芳丽(1974-),女,硕士,西北核技术研究所工程师,研究方向为计算机网络及应用;
袁媛(1979-),女,西北核技术研究所工程师,研究方向为计算机可视化与虚拟仿真。
0引言
随着计算机多媒体技术和网络技术的广泛应用,数据库管理系统中的数据处理对象也发生了变化[1]。
由原来单机环境下对数字、字符等数据的处理转变成网络环境下对数字、字符、文本、声音、图像、视频等数据的处理,而文本、声音、图像、视频等数据一般都是以文件的形式存在,这些文件具有特定的格式和数据存储方式(如微软Office系列软件产生的文件等),在数据库管理系统内,这类数据属于BLOB(BinaryLargeObject)数据类型,即二进制大对象数据。
如何实现二进制大对象数据在SQLServer数据库中的存取,这是开发人员需要研究和解决的问题。
BLOB是一种用于存储无边界数据的数据类型。
这些数据的共同特点是规模较大,内部顺序性不可分割,因此它们的存取一般采用整块移动的方式。
一般说来,这类数据的大小可以从KB到MB,变化范围很大,数据库管理系统不能像处理常规数据类型那样预留存储空间,因此大数据的存储变得比较复杂。
本文在第一部分介绍ADO.NET数据访问技术的特点、组件及访问模式;
第二部分重点阐述使用ADO.NET存取SQLServer2005中BLOB数据的方法,并编写代码实现了存取功能。
BLOB数据的类型包括图片(*.jpg、*.bmp等格式)和文档(*.doc、*.pdf等格式)。
1ADO.NET简介
ADO.NET是.NETFramework提供给.NET开发人员的一组类,它以XML为基础,提供一致的方法来访问各种数据源和数据访问服务,包括MicrosoftSQLServer数据库、ODBC、OLEDB数据源、Oracle数据源以及XML等[2]。
1.1ADO.NET体系结构
ADO.NET是一种全新的、强大的数据库访问技术[3]。
它可将系统前端的用户界面和后台数据库联系起来,应用程序可以通过ADO.NET来连接各种数据源,检索、插入、修改和删除数据源中的数据以及以快速、只读、只进的方式访问数据[4]。
用户和系统之间典型的交互过程如图1所示。
与传统的Web数据库访问方法比较,ADO.NET数据访问技术具有两个突出的优点:
一是紧密集成XML作为数据传输标准,使得ADO.NET能够更加灵活地访问各种不同类型的数据;
二是采用中断式访问模式,应用程序只是在需要访问或者进行数据更新时才会连接到数据库,一旦完成就立即断开。
为了实现上述任务,ADO.NET提供两个核心组件:
.NETFramework数据提供程序和DataSet[5]。
ADO.NET的体系结构如图2所示。
.NETFramework数据提供程序用于连接数据源、执行SQL命令以及检索数据,检索到的数据既可以直接处理,也可以放入DataSet对象中。
.NETFramework数据提供程序通过在DataAdapter对象和DataSet之间建立联系,使DataSet对象可以获取来自多个数据源的数据。
.NETFramework数据提供程序包括Connection对象、Command对象、DataReader对象和DataAdapter对象。
数据集DataSet是一种与数据源无关的内存数据表示方法,用于高速缓存关系型数据。
它像一个简化的关系数据库,可以包含数据表、数据列和数据行以及表与表之间的关系,并且完全是在脱机模式下进行操作。
图1ADO.NET的数据访问过程
图2ADO.NET的体系结构
1.2ADO.NET访问数据库模式
对于不同的应用需求,ADO.NET提供了两种模式来访问数据源中的数据:
使用DataReader对象进行基于连接的访问和使用DataAdapter对象进行非连接的访问[6]。
1.2.1基于连接的访问模式
基于连接的访问模式会占用数据库连接,然后读取数据。
它是通过DataReader对象来实现的,DataReader对象在已经建立的数据连接基础上,提供对数据源的单向、只读的数据流。
由于DataReader可以顺序处理从数据源返回的结果,而且不在内存中缓存,因此DataReader适合从数据源中检索大量的、不需要进行更新操作的数据。
1.2.2基于非连接的访问模式
基于非连接的访问模式是以Dataset为中心的数据访问模式。
Dataset中的数据是与数据库断开连接的[7]。
一旦将结果存储在Dataset之后,Dataset和数据库之间便不再有连接。
对Dataset内容所作的修改不会直接影响到数据库。
它的优点在于处理非连接数据时不需要始终与数据库连接。
2使用ADO.NET存取BLOB数据
2.1方法分析
SQLServer提供标准数据类型binary和varbinary等,用于处理二进制数据。
这些数据类型可用于小于8000个字节的小型不规则数据。
从SQLServer2005开始,“varbinary(max)”也包含在二进制数据类型当中,其关键词max表示大小不限。
如果SQLServer的版本是2005以前的,而数据长度又超过8000字节,就可以使用图像数据类型(image)进行存储。
这种数据类型的文件大小可变,最大可存储2GB的文件。
虽然图像数据类型也包含在SQLServer2005和2008中,但微软后续版本的SQLServer将不支持此功能,因此在今后的程序开发中不建议使用该数据类型。
综上所述,二进制数据类型可概述如下:
①binary:
文件大小固定,最大长度可达8000字节;
②varbinary(n):
文件大小可变,最大长度可达8000字节,(n指明最大文件长度);
③varbinary(max):
文件大小可变,max指示最大存储大小为231-1字节。
本文中的BLOB数据采用varbinary类型。
使用ADO.NET存取SQLServer2005中BLOB数据,从技术实现上而言,可以采用以下两种方法:
(1)文件名标记和索引法。
把BLOB数据保存在硬盘的某个特定目录下,并用SQLServer2005数据库的一个字符串字段存储该文件的文件名。
其基本思路是:
通过ADO.NET在SQLServer2005数据库中存取文件名,然后将文件名与硬盘中的BLOB文件一一对应。
优点是容易实现,无需复杂编码;
缺点是灵活性与安全性稍差,一旦所链接的数据文件被移动到其它目录,而数据库对它的引用不会自动更新,这时就出现了数据库和文件不同步的可能。
(1)语言法。
BLOB数据以二进制方式存储在SQLServer2005数据库的varbinary类型字段中,通过VisualC#编码实现转换,其基本思想是:
利用ADO.NET从数据库的varbinary字段获取数据,然后编码将二进制数据转化为文件。
其优点是数据以二进制形式直接存储在数据库的varbinary字段,灵活性较好,可以利用数据库来进行一定的权限控制,保证数据的安全性、完整性和一致性,以达到更好地管理数据的目的;
其缺点是编码较复杂。
2.2具体应用
BLOB不像一般的数据类型,不能直接写入数据库,较为常用的方法是使用文件流、内存流来存取,下面从图像数据和大型文本文件两个典型的应用来介绍BLOB数据的存取方法。
2.2.1图像数据
程序的后台数据库管理系统选用SQLServer2005。
数据库名为:
EISVN,图像数据保存在Para表中的Picture字段中,字段的类型为“varbinary”。
图像数据的存储过程:
①利用FileStream以流的方式打开图片文件;
②用BinaryReader将流做处理,转换为二进制数据存放到二进制数组(byte[])中;
③使用SQLServer中的insert语句将图片存储到指定的表中。
关键代码如下:
SqlConnectionsqlConn=newSqlConnection("
DataSource=abc\\SQLSERVER2005;
initialcatalog=EISVN;
integratedsecurity=SSPI"
);
//DataSource="
abc\\SQLSERVER2005"
为连接的数据源名称,"
initialcatalog=EISVN"
为连接的数据库名称,"
integratedsecurity=SSPI"
表示使用Windows集成安全身份认证。
sqlConn.Open();
byte[]imagebytes=null;
//记录图片的路径
stringfullpath=fileLocation+fileName;
//将图片以文件流的形式进行保存
FileStreamfs=newFileStream(fullpath,FileMode.Open);
BinaryReaderbr=newBinaryReader(fs);
imageSize=Int32.Parse(fs.Length.ToString());
//将流读入到字节数组中
imagebytes=br.ReadBytes(imageSize);
//设置SQL语句
stringcmd="
insertintoPara(Picture)values(@Picture)"
;
SqlCommandSqlcmd=newSqlCommand(cmd,SqlConn);
sqlComm.Parameters.Add(newSqlParameter("
@Picture"
,SqlDbType.VarBinary));
sqlComm.Parameters["
].Value=imagebytes;
Sqlcmd.ExecuteNonQuery();
sqlConn.Close();
执行完上述代码后,图像数据在数据库中实现了二进制形式的存储。
如图3所示。
图3图像数据的二进制形式存储
图像数据的显示过程:
①使用Select语句对存储在数据库表的图片进行查询;
②使用MemoryStream将二进制数据转换为流的形式;
③使用Bitmap对流进行处理,从而得到位图文件,将存储在Picture字段中的数据正确地显示。
SqlConnectionsqlConn=newSqlConnection("
DataSource=abcSQLSERVER2005;
Stringselect=@"
selectPicturefromPara"
SqlCommandsqlComm=newSqlCommand(select,sqlConn);
//将二进制数据转化为流
byte[]pic=(byte[])sqlComm.ExecuteScalar();
MemoryStreamms=newMemoryStream(pic,true);
//将流转化为位图文件
Bitmapbmp=newBitmap(ms);
pictureBoxBefore.Image=bmp;
ms.Close();
2.2.2大型文本文件存取
如果系统中要处理的技术资料是大型文本文件,处理方法仍可选择varbinary类型,存储过程与图像数据的存储过程相同,但读取过程有所差别。
数据库名为:
EISVN,文本文件保存在document表的content字段中,字段的类型为“varbinary”。
SqlDataReaderdr=null;
SqlCommandcm=newSqlCommand();
cm.CommandType=CommandType.Text;
cm.CommandText=@"
selectcontentfromdocument"
dr=cm.ExecuteReader();
byte[]File=null;
if(dr.Read())
{
File=(byte[])dr[0];
}
FileInfofi=newSystem.IO.FileInfo(Path);
fs=fi.OpenWrite();
fs.Write(File,0,File.Length);
fs.Close();
dr.Close();
3结语
本文讨论了使用ADO.NET技术实现对SQLServer2005中BLOB数据的存取方法,文中的代码基于VisualC#语言编写,均在VisualStudio2005编译环境中调试运行。
结果表明:
该方法对信息系统中的BLOB数据存取切实可行,实用价值较高。
参考文献参考文献:
\[1\]萨师煊,王珊.数据库系统概论[M].北京:
高等教育出版社,2002:
912.
[2]申朝阳,宋颜浩.ASP.NET与数据库技术高级指南[M].北京:
中国水利水电出版社,2005:
116119.
[3]张奇,李律松,卫建伟.VisualC#数据库项目案例导航[M].北京:
清华大学出版社,2005:
23.
[4]路红武.基于.NET企业信息资源管理系统的设计与实现[J].计算机与现代化,2005,118(6):
21.
[5]李律松,陈少刚,沈刚.VisualC#数据库高级教程[M].北京:
65.
[6]周晓娟.基于ADO.NET的数据库访问技术研究[J].现代商贸工业,2009(24):
293.
[7]DAVIDSCEPPA.ADO.NET2.0技术内幕[M].北京:
清华大学出版社,2007:
188.
(责任编辑:
杜能钢)