在C#中存取Oracle数据库表中BLOB数据的方法研究

时间:2022-08-26 07:16:42

在C#中存取Oracle数据库表中BLOB数据的方法研究

摘要:该文在平台上使用C#编程,通过访问Oracle后台数据库,详细介绍了存取Oracle数据表中的BLOB数据的方法,并阐述了其工作原理及实现过程。

关键词:.NET平台;C#;BLOB数据;Oracle数据库

中图分类号:TP311文献标识码:A文章编号:1009-3044(2009)32-8877-02

Methods to Access BLOB Data of Oracle Database in C#

HUANG Sheng-zhong

(Liuzhou Teachers College, Liuzhou 545003, China)

Abstract: This paper programmed with C# on platform and visited the Oracle database through and introduced the method in which users’ access to BLOB data in the Oracle table, and described its working principle and the implementation process.

Key words: .NET platform; C#; BLOB data; oracle database

1 概述

在许多MIS系统中,经常需要存储图像、电子文档、音频和视频等多媒体数据,这些数据的数据量很大,具有不规则性,通常被称作BLOB[1-2]。目前,大多数的DBMS产品都对BLOB数据提供了有力的支持,如Oracle中的Long Binary类型。

BLOB全称为Binary Large Objects,即大型的、不定的二进制对象,或者字符型数据,通常是文档(*.txt、*.doc)和图片(*.jpeg、*.gif、*.bmp)。

设计中常见的问题是将数据存储在数据库中还是存储在文件系统中。存储在文件系统中的设计比较简单,只是把文件位置和文件名存放在数据库中,即在数据库表中设计一个Text类型的字段来存放这些信息。但缺点是显而易见的:一方面是在应用程序时所有的数据文件都要同时出去,并且还要注意路径的更新;另一方面数据有随时丢失、被查看、更改的危险[3]。因此在大多数情况下,最好把这些大型二进制数据与其他数据一起存在数据库中。主要有以下几个优点:首先,这种存放方式非常便于管理,BLOB数据存放在Oracle数据库,可以通过Oracle所提供的高效、安全的管理机制对BLOB数据进行存储和管理,避免了人工管理BLOB数据所带来的额外开销,此外,利用oracle数据库的备份恢复机制,也大大提高了BLOB数据存储的安全性。同时,BLOB字段可以根据实际内容的长度来占用存储空间,这一特点大大节省了信息存储空间的开销;其次,这种存放形式保证了数据的一致性,BLOB数据和其他数据的插入、更新、删除都在同一个事务中实现,这样就保证了文件与数据库之间的一致性;最后,这种存放形式,还可以实现数据的共享,便于网络开发。

2 工作原理

在C#中,对数据库中的BLOB数据进行操作之前,首先对其进行 “初始化”操作,即将其置为空BLOB[4-5]。Oracle提供了EMPTY_BLOB()函数对BLOB字段进行初始化操作。可以通过在INSERT语句中插入EMPTY_BLOB()函数,实现在一张表中插入一条新记录,并将BLOB字段初始化为空BLOB。初始化操作后,即可利用Oracle提供的DBMS_LOB函数包对BLOB数据进行读取和写入。

从数据库中读取BLOB数据时,使用 Oracle.DataAccess.Types.OracleBlob类的存储使用OracleDataReader的GetOracleBlob() 方法读取的定位器,然后使用Read() 方法访问 OracleBlob 中的数据[6]。往数据库中写BLOB数据时,调用OracleDataReader 的GetOracleBlobForUpdate() 方法,将 FOR UPDATE 子句添加到 SELECT 语句,然后调用GetOracleBlob() 方法取得 BLOB,然后使用OracleBlob对象的 Write() 方法写入 BLOB中,其工作原理如图1所示。

3 数据库的设计与连接配置

3.1 数据库设计

本文使用Oracle作为后台数据库系统。在Image数据库System方案中的Imgspace表空间建立ImgTable表来存储BLOB类型数据(图片、文档等),其结构如表1所示,其中,Product_id字段是图片所对应的产品信息表中的产品ID,其值通过相应页面的文本框productid.Text获得。

3.2 数据库连接配置

为了与数据库相连,需要在Web应用程序的配置文件web.config中配置数据库连接字符串:

//定义Oracle数据库连接字符串(数据库名、用户名和密码)

由于Web页面获取连接字符串时需要使用的类ConfigurationSettings被包含在System.Configuration命名空间中,因此需要引入该命名空间。页面获取连接字符串的程序代码如下:

Using System.Configuration;//引入命名空间

Private string ORACLECONNSTR=ConfigurationSettings.AppSettings

[“ConnectionString”].ToString();//获取连接字符串

OracleClient是为Oracle特别定制的数据提供程序,用于访问Oracle数据源。但默认情况下,VS2005并不加载这个组件资源,因此,需要把System.Data.OracleClient.dll文件拷贝到项目解决方案的\Bin文件夹下,然后引入此命名空间:Using System.Data.OracleClient。

4 应用程序设计与实现

4.1 写入BLOB数据的应用设计

写入BLOB类型的图片或文档数据时,可以通过VS2005提供的控件FileUpload的属性PostedFile.ContentLength获取上传文件字节大小,PostedFile.FileName获取上传文件文件名,PostedFile.ContentType获取上传文件类型[7]。然后使用Stream流对象读取上传文件数据到一个字节数组中,再将该字节数组数据存储到Oracle数据库中。具体步骤如下:

1) 在ASPX页面布局:1个FileUpload控件,命名为FileUp;1个button按钮,命名为BtnSave(保存);1个Label控件,命名为FileLabel,用来显示上传文件的类型、大小和提示信息等。

2) 在BtnSave_Click()事件中建立connection和command对象,使用访问数据库,用Stream流读取数据内容到pic数组,保存BLOB数据到Oracle数据库。

4.2 读取BLOB数据的应用设计

在数据库中,图片的保存方法与文本数据的保存方法不同。文本数据可以直接在数据库中查看,而图片数据是以二进制方式保存,查看时必须使用Stream流的Read方法读出图片数据,同时需要引入输入输出接口命名空间:System.IO[8]。为实现高效地访问数据,还需要编写自定义HTTP处理程序创建进程,并返回动态创建的内存流数据[9]。在项目中,使用Datalist控件绑定要即时显示的图片。

1) 在需要显示图片的ASPX页面上布局一个Datalist控件,在模板列中添加一个img控件,以通用自定义HTTP请求处理程序Handler.ashx的继承类Handler封装HTTP请求信息,然后将图片ID绑定到img控件:

利用自定义HTTP处理程序类Handler处理HTTP Web请求。

2) 由于内存流MemoryStream可有效降低应用程序对临时缓冲区和临时文件的需求,且与其他流相比,执行I/O操作的速度和效率高得多,因此可以利用Handler类的同步处理HTTP Web请求的函数ProcessRequ est,将图片数据用内存流MemoryStream读取显示出来。

5 小结

该文对关系数据库系统中的BLOB数据的存取策略进行了分析,并在.NET平台上使用C#编程实现了对Oracle数据库BLOB数据的存储和读取。该方法对声音、视频、文档、动画等其他BLOB类型数据同样适用,具有实际的参考价值和意义。

参考文献:

[1] 苏贵洋,黄穗网络编程从基础到实践[M].北京:电子工业出版社,2006.

[2] Watson K,Nagel C.C#入门经典[M].3版.北京:清华大学出版社,2006.

[3] 高晓兵.基于数据仓库的质量信息系统关键技术研究[D].西安:西北工业大学,2005.

[4] 杨勇.数据库系统中BLOB对象的管理[J].微电子学与计算机,2006,23(7):148-150.

[5] 杨光年,胡昌平,李方泉.Net企业应用架构技术探讨[J].淮海工学院学报:自然科学版,2008,17(2):31-34.

[6] 孟现飞,李浩,孙统风数据访问模型研究[J].微机发展,2003,13(6):94-98.

[7] 杨勇.数据库系统中BLOB对象的管理[J].微电子学与计算机,2006,23(7):148-150.

[8] Kauffman J,Matsik B.Beginning Databases Using C#[M].[S.l.]:Wrox Press Ltd.,2002.

[9] 杨光年,胡昌平,李方泉.Net企业应用架构技术探讨[J].淮海工学院学报:自然科学版,2008,17(2):31-34.

上一篇:基于Windows Server 2003上启用IPSEC保证数据... 下一篇:计算方法管理器的研究与实现