第5期 杨辉:档案管理数据库系统中的图片存取 51 WEB应用程序、桌面应用程序和移动应用程序, VB.NET、VC++.NET、VC}}.NET、vj}}.NET、 法,一种是把文字信息和图像信息分开保存;即 把文字信息保存在数据库表中,把图像信息保存 在指定的文件夹下,在数据库表中只保存图像文 件的存储路径和文件名,对图片的存取则根据图 像文件的存储路径和文件名来进行,这种方法编 ASP.NET都使用相同的集成开发环境(IDE), 该环境允许它们共享工具并有助于创建混合语言 解决方案。VB.NET是最流行的应用软件开发工 具之一,具有功能强大、控件丰富、编程简单, 程简单,但操作不方便,图像信息不安全,不适 合保存重要的图像信息;另一种方法是把文字信 方便、快捷地开发图形用户界面的特性,因此用 SQL Server 2000和VB.NET开发信息管理系统是 众多开发人员的首选。 1.1数据库表的创建 根据用户需要管理的信息创建用户数据库表, 在需要保存图片表中,增加一个“图片”字段, 数据类型设定为Image。由于该类型存储的是可 变长度的二进制数据,因此不能直接把图像数据 存储到Image字段,要先把图像数据转换成二进 制数据,再把二进制数据存储到Image字段。 1.2数据类型的转换 当获取图片的图像数据并把其调入内存后, 利用VB.NET提供的MemoryStream类把图像数据 转换成可变长度的二进制数据。再把该可变长度 的二进制数据保存到数据库表中的Image数据类 型字段,数据的长度与实际图片的长度相同。 1.3方案特点 在过去的信息管理系统中,图片数据和文字 数据是分开保存的,数据库表中只保存文字数据 和图片的路经及文件名,而图片信息则以图像文 件的形式保存在其它地方,使得对数据的管理很 不方便,同时安全性和可靠性也不能保证,无关 用户进入计算机后,可轻易获得图片信息,如身 份证复印件等。采用本方案后,数据库表中可同 时保存文字数据和图片数据,通过数据库的权限 设置,无关用户进入计算机后不能轻易获得文字 和图片数据信息,而且在一条数据记录上保存文 字和图片数据,因此数据的安全性和可靠性得到 了保障。 该方案解决了数据库中存储图像数据的问题, 提高了信息管理系统的应用功能和范围。由于图 片的保存是一个独立的过程,在其它的应用系统 开发中可以方便的应用,提高了信息系统开发的 效率。 2图像的保存 在信息管理系统中,保存图像一般有两种方 息和图像信息一起保存在数据库表中,直接在数 据库中对文字和图像进行操作,这种方法编程复 杂,但操作简单,数据信息安全。本文所讨论的 为后者。 2.1图像的保存 在保存数据信息时,由于VB.NET中的Com— mandText对象使用SQL语言时Insert语句不支持 可变长度的二进制数据和变量,在插入文字数据 的同时不能插入图像数据,因此图像数据另外利 用ADO.NET的Command.Parameters.add对象添 加进去。在保存图片前,要先保存相关的数据, 否则保存图片操作将找不到相关的纪录,操作失 败。 在教师管理系统中的教师基本情况窗体中创 建一个图片控件(控件名为:Pic—jbqk—tp),以 用来显示图片,当点击“插入图片”按钮时,通 过打开文件对话框选择所需图片,插入到图片框 中,如图1所示。 代码如下: Private Sub cmd—jbqk—crtp—Click(ByVal sender As System.Object,ByVal e As System. EventArgs)Handles cmd—jbqk—crtp.Click 教师基本情况插入照片 Dim pic As Image Dim curpath,filename As String If OpenFileDial0g1.ShowDialog=DialogResult. OK Then pic=New Bitmap(OpenFileDialog1.FileName) Pic—jbqk—tp.Image=pic End If cmd—jbqk—bctp.Enabled=True End Sub 当点击“保存图片”按钮时,把图片控件 (控件名为:Pic—jbqk—tp)中的图像文件转换为 可变长度的二进制流,放在数组变量myimagebyte ()中,再通过调用过程savept来保存图片。代码 维普资讯 http://www.cqvip.com 52 如下: 昆明冶金高等专科学校学报 Dim mysql As String If id0=0 Then 2007年9月 mysql=”update”+CStr(mytable)+”set照 片=@picture where身份证号=@id” Else mysql=”update”+CStr(mytable)+”set 照片=@picture where身份证号=@id and id=” 图1 教师管理系统中的教师基本情况窗体 C n Private Sub cmde —jbqk—bctp—Click(ByValn D sender As System.Object,ByVal e As System.Even—r r r tArgs)Handles cmd—jbqk—bctp.Click r V, 教师基本情况保存照片 C rO r Dim mystream As New MemoryStream‘定义内 存流变量 Pic—jbqk—tp.Image.Save(mystream,Pic— jbqk—tp.Image.RawFormat)’把图片框中的图像 文件转换为二进制内存流数据 Dim myimagebyte()As Byte=mystream.Get— Buffer‘获取二进制流 mystream.Close() Dim biao As String=”jsjbqk”’要保存图片 的表名 savept(biao,myimagebyte,id,0)‘调用保存 图片过程 End Sub 过程savept根据身份证号在数据表的对应记 录中的“照片”字段中保存图片。过程savept有 四个参数:mytable为要保存图片的数据库表名 (字符型);mytp为图像文件的二进制流(Byte 型);id为身份证号(字符型);id0为第二标识 符(整形)。由于教师有多次学习进修阶段,只 用身份证号不能准确定位数据记录,因此要用第 二标识符来辅助定位。代码如下: Public Sub savept(ByVal mytable As String, ByVal mypt()As Byte,ByVal id As Stirng,ByVal id0 As Intl6)保存图片 Try +Chr(39)+CStr(id0)+Chr(39) End If As New SqlCommand(mysql, With mycom .Parameters.Add(New SqlParameter(”@pic— ture”,SqlDbType.Image)).Value=mypt .Parameters.Add(New SqlParameter(”@id”, SqlDbType.NVarChar,18)).Value=id .Connection.Open() .ExecuteNonQuery() .Connection.Close() MessageBox.Show(”照片已被成功保存!”,” 保存照片提示”,MessageB0xButt0ns.OK,Message— Boxlcon.Information) End With Catch ex As Exception MessageBox.Show(”保存照片失败!”,”保 存照片提示”,MessageB0xButt0ns.OK,Message— Boxlcon.Information) End Try End Sub 当保存图片成功时,提示“照片已被成功保 存!”;当保存图片失败时,提示“保存照片失 败!”。 2.2显示数据库中的图像数据 显示数据库中的图像数据是保存图像数据的 逆过程,即把数据库表字段中的二进制数转换为 内存的二进制流,再把内存流的数据转换为图像 数据放到图片框中。代码如下: Private Sub Cmb—jSCX—jsxm—SelectedIndex— Changed(ByVal sender As Object,ByVal e As Sys— tem。EventArgs)Handles Cmb—jSCX—jsxm。Select— edIndexChanged 选择教师姓名后,填充陔教师的基本情况 Public cnn As New OleDb.OkDbC0nnecti0n(” 维普资讯 http://www.cqvip.com 第5期 杨辉:档案管理数据库系统中的图片存取 53 Provider=sqloledb;Data Source=.;Integrated Se— cu ̄ty=SSPI;Initial Catalog=教师管理”) Dim mysql As St6ng mysql=”select from jsjbqk where姓名=” ”’&Cmb—jSCX~jSXE.Text&” and教研室= &”“’&Cmb—jSCX—jys.Text&”“’ Dim con As New OleDbCommand con.Connection=cnn con.CommandText=mysql If cnn.State=ConnectionState.Closed Then cnn. Open() dr=con.ExecuteReader While dr.Read txt—jbqk—id.Text=dr.Item(”身份证号”) id=dr.Item(”身份证号”) txt—jbqk—name.Text=dr.Item(”姓名”) jsname=dr.Item(”姓名”) Com—jbqk—xb.Text=dr.Item(”性另0”) (其它字段类似省略) Com—jbqk—XW.Text=dr.Item(”学位”) If dr.IsDBNull(18)=True Then Pic—jbqk—tp.Image=Nothing Else Dim mypicturebyte()As Byte=CType(dr.Item (18),Byte()) Dim mstream As New MemoryStream(mypicture— byte) ic—jbqk—tp.SizeMode=PictureBoxSizeMode. StretchImage Pic—jbqk—tp.Image=Image.FromStream (mstream) mstream.Close() End If End While dr.Close() cnn.Close() jsjbqkshow(0) butt(1,1,1,1,1) cmd—jbqk—bctp.Enabled=False TabControl1.SelectedTab=TabPage1 End Sub 3结语 本文介绍了图像文件在SQL Server数据库中 的存储和显示的方法,并把存储方法做成一个过 程,在其它的应用程序中也可以调用,以在使用 时提供方便。需要注意的是,在保存图片前要先 保存相关的数据,否则在保存图片操作时将找不 到相关的纪录,操作失败。 本文中的程序已在教师管理信息系统中用 VB.NET实现,测试运行正常,对数据库的操作 运行速度也较快,有一定的实用价值;另外,对 SQL Server数据库的图像操作也可以把存取操作。 做成SQL Server数据库的存储过程来实现,方法 类似。本文叙述的程序中,有部分代码内容与图 像操作无关而被省略,在使用时只需根据实际情 况参照给出的代码即可。 参考文献: [1]罗斌.Visual Basic.NET精彩编程实例集锦[M].北 京:中国水利水电出版社。2006. [2]章立民.Visual Basic2003—2005开发秘诀与范例大全 [M].北京:电子工业出版社,2005. [3]王秀红,刘造新.Visual Basic.NET程序设计教程与 实训[M].北京:北京大学出版社,2006. [4]杜兆将,郭鲜凤,刘占祥.SQL Server数据库管理与开 发教程与实训[M].北京:北京大学出版社,2006. [责任编辑:贾朝光]
因篇幅问题不能全部显示,请点此查看更多更全内容