欧阳艳阶,王家旭
(十堰职业技术学院 信息与智能工程系,湖北 十堰 442000)
随着计算机软件在各个行业的应用发展,管理信息系统成为必不可少的管理工具。在管理信息系统中,图像存取成为必不可少的信息处理要求。如照片、医用影像、工程图纸扫描图像、地图等。然而图像信息所含的数据量远远大于普通数据的数据量。如何在管理信息系统中存取图像也是程序员在开发过程中要解决的关键问题。
本文结合笔者开发的汽车零部件管理信息系统中汽车及零部件图像的存取功能,给出了图像的两种存储及读取方法,并使用C#.Net开发工具实现了图像在SQL Server 2005数据库中的存储和读取操作。
通常程序员在解决管理信息系统中图像的存取问题时主要采用两种方法。一是将图像以数据库方式存储;二是将图像以文件系统存储。这两种方式各有优缺点,其使用环境也有差别。
这种图像存取方式优点有以下几个方面:
(1)管理方便。当图像与其他数据一同存储在数据库中时,图像与其他数据能共同备份和复原。从而避免了普通数据与图像数据的不同步,并且避免了其他用户无意中误操作图像的风险。
(2)共享与查询效率高。将图像存储在SQL Server数据库中可以与其他数据一样,同时完成插入、修改、删除和查询操作,保证图像与普通数据的一致性。同时操作员可以在任何时间任何地点任何一部终端上打开数据库并使用图像数据,大大提高图像数据的共享、查询效率。
(3)提高图像安全性。图像存储到SQL Server数据库中以后,其安全性,特别是远程访问安全性将由SQL Server提供的安全保证机制来实现,大大提高图像访问控制的强度。
但将图像存储于数据库方式也存在着以下缺陷:
(1)图像放在数据库中不便于修改编辑。
(2)数据库读取数据时的I/O消耗比较大。
使用文件系统存储是指将图像存储在文件中,将文件的路径信息存储在数据库中,通过数据库中的路径信息来完成存储在指定的文件夹中的文件操作。
这种图像方式有以下优点:
(1)图像编辑简单方便。编辑图像时使用工具软件对图像进行直接编辑、存储,只与硬盘打交道,不涉及数据库和其他服务功能,简单方便。
(2)节省数据库空间,有效地避免了数据库的膨胀。
但是,这种方式需要借助文件系统实现。其最大的缺点是文件系统的安全保护措施比较脆弱,可能会造成图像信息的不良复制、修改、删除及误操作。
.NET平台下SQL Server常见的数据驱动类在System.Data.SqlClient类库中,本文SQL Serv-er图像存取功能的实现必须使用以下两个类。
(1)SqlConnection类。SqlConnection类用于连接数据库,它代表数据库和数据用户之间的实际连接。这个对象中包含有用于打开和关闭连接的方法,并且还包含有描述当前连接状态的属性。Sql-Connection类的语法格式如下:SqlConnection conn=new SqlConnection(“Server=服务器标识;Data-Base=数据库名称;Uid=用户名称;pwd=密码;”);
Server:目标服务器IP,若为本机可使用“.”或“(Local),”;
DataBase:目标数据库名称 ;
Uid或User ID,连接数据库的用户名;
Pwd或Password:连接数据库的密码。
(2)SqlCommand类。SqlCommand类是数据库命令的封装。这个命令既可以是SQL语句,又可以是存储过程。SqlCommand类可以重置CommandText属性并重复使用SqlCommand对象。SqlCommand类特别提供了对SQL Server数据库执行命令的方法。ExecuteReader方法执行有返回行的命令,该方法需要设定SQLDataReader对象接受返回结果;ExecuteNonQuery方法执行如INSERT、DELELE、UPDATE语句等无返回结果的命令;ExecuteScalar方法从数据库中检索单个值(例如一个聚合值);ExecuteXmlReader方法将CommandText发送到Connection并生成一个XmlReader对象。
FileStream类是以文件输入输出为主的Stream,既支持同步读写操作,也支持异步读写操作,其命名空间为System.IO。FileStream对象可以通过URL指定的简单文件打开硬盘中的图像文件,其作用是提供通用文件访问功能。在各种数据库文件访问中,FileStream以其易于使用、熟悉的界面、高速度以及较低的内存占用,成为目前操作最方便的数据访问技术。
FileStream对象提供文件读取、写入以及管理字节流的手段。该字节流可以是文本或二进制数,并且在大小方面只受限于系统资源。
在SQL Server数据库中,小于8 000字节的图像数据可以用二进制型(binary、varbinary)来表示。对于大于8 000个字节的图像,SQL Server提供二进制大对象(BLOB)进行存储。Image数据类型即是BLOB对象的一种,用于存储二进制类型数据,比如:图像、视频、可执行文件等。C#中Image类提供了位图和元文件操作的函数,该类的图像处理方法有以下三种:
(1)FromFile方法。它根据输入的文件名产生一个Image对象,其函数形式包括public static Image FromFile(string filename)和public static Image FromFile(string filename,bool useEmbedded-ColorManagement)两种;
(2)FromHBitmap方法。它从一个 windows句柄处创建一个bitmap对象,其函数形式包括public static bitmap fromhbitmap(intptr hbitmap)和public static bitmap fromhbitmap(intptr hbitmap,intptr hpalette)两种;
(3)FromStream方法。从一个数据流中创建一个image对象,其函数形式包括public static image fromstream(stream stream)、public static image fromstream(stream stream,bool useembeddedcolormanagement) 和 fromstream (stream stream,bool useembeddedcolormanagement,bool validateimagedata)三种。
笔者结合“汽车零部件管理”的开发,详细介绍C#.Net+SQL Server数据库图像存取的实现方法。
创建数据库“AutoManageDB”,并创建表“AutoPhotoTable”,表结构设计为:(PictureID int;PictureContent Image;PictureText varchar(50))。在数据库设计中,设计图像字段PictureContent的类型为Image,存储二进制数据;设计图像描述字段PictureText为varchar(50),用于存储图像的查询关键字。
在使用SQL Server数据库进行图片存储时,首先将图像文件转换为二进制数据,并保存在内存。然后建立与数据库的连接,使用SqlCommand类的Insert语句将图像插入数据库中表的指定字段。Stream对象提供读取、写入以及管理字节流的手段。该字节流可以是文本或二进制数,并且在大小方面只受限于系统资源。“存储图像到数据库”的代码如下:
代码中最关键的设计是图像变量的定义及图像长度的获取。使用Parameters.Add方法和photo.Length属性即可获取和设置。
读取存储在数据库表中的二进制图像数据时,直接查询图像所在记录,读入内存,并通过字节数组转换为PictureBox控件能显示的文件流数据直接显示。其核心代码如下:
一个好的图像存取解决方案不仅能够使管理信息系统具有更大的适应性,而且能大大提高管理信息系统的使用方便性和执行效率。本文介绍的设计思想在Visual C#.Net 2008+SQL Server 2008环境中成功地实现了图像在数据库的存取。该方法操作简单,容易掌握,使得我们不需要编写大量的代码,就可以实现在管理信息系统中存储和显示图像文件。
[1]徐人凤.SQL Server 2005数据库及应用[M].北京:高等教育出版社,2007:72.