如何在数据库中保存大量图片
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何在数据库中保存大量图片
作者: 刘师义上海盟威软件有限公司软件开发工程师
时间: 2010/6/1
来源: 上海盟威软件有限公司()。
公司拥有以微软最有价值专家为核心的技术团队,专业从事Aaccess开发培训,学员可非脱产方式参加培训,自由安排学习时间,并通过网络获得公司的技术支持,几年来已为全国各地大中型企事业单位培养了众多“精管理、懂编程”的复合型人才,详情了解:/training.asp。
一、摘要:
我们将图片保存到数据库中,使用维护起来都变得很简单尤其适用于小型便携式的Access管理系统。
但如果直接通过绑定对象框控件的插入对象方法将图片插入的话,非位图图片体积会暴增几十上百倍,从而大大降低了实用性。
在本文中,讲述了如何将图片以原始大小保存到数据库中进行使用的方法。
二、正文:
一般情况下,如果要将图片保存到数据库中,都是通过绑定对象框的“插入对象”功能来实现,但是这样做会造成数据库体积的明显增大。
尤其是在Access 2007之前的版本中所有插入的图上均会被转换成位图,而如果把一个JPG图片转换成位图,我们会发现图片的大小增大了几十上百倍。
那么有没有一种办法能够直接把保存源格式的图片到数据库中呢?答案是肯定的,答案就在ADO中的流对象(Stream)。
此处要注意的是,ADO必须是2.5以及更新的版本,老版本中是没有流对象的。
流对象主要有两种用途:一种是处理文档数据,这样可以通过流对象的属性和方法来读取和修改文档内容;另一种就是把其它任意格式的文件以二进制数据流进行处理,不关心文件的格式和内容。
在本文中我们讨论的是在数据库中存储图片,所以我们这里主要讨论的就是它的后一种用途。
为了更容易理解,我们在此基于一个示例程序来进行说明。
首先我们需要在表中添加至少两个字段,一个用来存放图片的名称,一个用来存放图片的二进制文件数据:
然后我们基于此表来创建窗体,通过窗体实现图片的保存以及将保存的图片显示出来。
在此窗体中我们需要手动添加三个控件:
图像控件:名称:imgPic 图片类型:链接
按钮控件:名称:cmdAdd 标题:添加/更改图片单击事件:[事件过程]
按钮控件:名称:cmdDel 标题:删除图片单击事件:[事件过程]
由于相关的记录修改添加都是通过代码完成,所以我们需要将“图片名称”的“锁定”属性设为“是”,另外图片数据是一个绑定对象框控件,它只用来存放图片文件数据,不需要显示出来,所以我们要将其“可见性”属性设为“否”。
(这里有一个可能由于ADO的流对象和窗体绑定的DAO记录集兼容性造成的问题:向流对象中写入图片数据时,直接把窗体绑定记录集中“图片数据”字段值中的二进制数据写入时会出错,需要绑定一个“绑定对象控件”,将控件中的二进制数据写入才不会出错。
)
接下来我们需要在单击“添加/更改图片”按钮时将图片以二进制方式写入到数据库中,及以在窗体的记录切换时自动将二进制数据再还原为图片文件,并以链接的方式显示在图像控件中,这些都需要以编程方式来实现,具体实现代码如下:
'添加图片并将图片保存到数据库中
Private Sub cmEdit_Click()
Dim stm As ADODB.Stream '定义流对象变量
Dim strPathName As String '文件名临时变量
'调用Access通用的文件选取对话框来选择一个图片文件(需要最低2003版Access)
With FileDialog(3) 'msoFileDialogFilePicker
'清除原有文件类型筛选
.Filters.Clear
'添加自定义文件类型筛选
.Filters.Add "图片文件", "*.jpg;*.gif;*.png"
'如果对话框未被取消,则将选取的文件名保存到变量
If .Show Then strPathName = .SelectedItems(1)
End With
'如果变量不为空说明对话框没有被取消
If strPathName <> "" Then
'初始化流对象
Set stm = New ADODB.Stream
'设置为二进制处理方式
stm.Type = adTypeBinary
'设置为读写权限模式
stm.Mode = adModeReadWrite
'打开流对象
stm.Open
'从将文件加载到流对象
stm.LoadFromFile strPathName
'将流对象中的二进制数据保存到数据库中
Me!图片数据= stm.Read
'关闭流对象
stm.Close
'在图像控件中显示刚才的图片
Me.imgPic.Picture = strPathName
'将图片的文件名保存到“图片名称”字段,不保存路径
Me!图片名称= Mid$(strPathName, InStrRev(strPathName, "\") + 1)
End If
'销毁对象变量
Set stm = Nothing
End Sub
'从数据库中删除图片
Private Sub cmdDel_Click()
Me!图片数据= Null '清空图片数据字段
Me!图片名称= Null '清空图片名称字段
Me.imgPic.Picture = "" '清除图像控件中显示的图片
End Sub
'通过成为当前事件,实现记录切换时自动显示图片
Private Sub Form_Current()
Dim stm As ADODB.Stream '定义流对象变量
Dim strPathName As String '文件名临时变量
'如果“图片数据”字段不为空
If Not IsNull(Me!图片数据) Then
'根据“图片名称”字段生成一个到操作系统临时文件夹的路径名
strPathName = Environ$("Temp") & "\" & Me!图片名称
'初始化流对象变量
Set stm = New ADODB.Stream
'设置为二进制处理方式
stm.Type = adTypeBinary
'设置为读写权限模式
stm.Mode = adModeReadWrite
'打开流对象
stm.Open
'将数据库中的二进制数据写入流对象变量
stm.Write Me!图片数据
'另存为文件,如果文件存在则覆盖
stm.SaveToFile strPathName, adSaveCreateOverWrite
'关闭流对象
stm.Close
'在图像控件中显示刚才保存的图片
Me.imgPic.Picture = strPathName
Else
'如果当前记录中没有图片数据,则清除图像控件中的显示
Me.imgPic.Picture = ""
End If
'销毁对象变量
Set stm = Nothing
End Sub。