Stream在帮助文档中这么解释:代表二进制数据流或文本流。,二进制大家都知道,数据流或文本流又是什么呢?在1998年由Henzinger在文献87中提出,他将数据流定义为“只能以事先规定好的顺序被读取一次的数据的一个序列”。 后来有人放宽了“一次”的限制,认为:数据流是“只能被读取一次或少数几次的点的有序序列”。为什么在数据流的处理中,强调对数据读取次数的限制呢?因为数据流是以非常高的速度到来的输入数据,因此对数据流数据的传输、计算和存储都将变得很困难。在这种情况下,只有在数据最初到达时有机会对其进行一次处理,其他时候很难再存取到这些数据(因为没有也无法保存这些数据)。这些都不是我们关注的重点,我们所要的是用Stream来存储较大的文件,Stream有两种模式(mode):adtypetext与adTypeBinary ,由于二进制所占空间较小,我个人这样认为,将文件加载到Stream中,条件是:数据流必须是打开(Open)的,,必须指定流的类型(Type),流的模式是二进制(adTypeBinary)。用LoadFromFile方法将文件加载进来,文件如图片文件,视频文件等,这些文件所占空间较大,加载到数据流中,文件已经转换为二进制,再将这个二进制全部或部分取出来存放到数据表中,二进制所占空间很小。当然,存放到数据表用打开记录集的方法,将stream中的二进制赋给记录集的字段(FIeld),取出二进制的方法是Read,有部分取出和全部取出,默认为全部取出adReadAll。
接着就是如何在窗体中将所存的二进制文件还原展示出来,条件也是绑定Stream,模式(Mode)必须具有读写权限:adModeReadWrite 。Stream也是打开(Open),类型(Type)也是二进制(adTypeBinary),将将数据表中的二进制取出,首先也是采用打开记录集的方法,将记录集是二进制文件写进Stream,其方法是Write,再将数据流还原其原来的文件样式,地址随你定,采用的方法正好与LoadFromFile方法相反:SaveToFile,这样可以将窗体上的图片框的Picture属性赋给它,于是就显示出原来的文件,在窗体上展现出来。保存到电脑上的文件也只是暂时的,因为不是一个文件,文件名又是相同,下一个文件要取代它,于是毫不留情地杀死它(KILL),因为数据流只是被子读取一次,所以一次只能显示一个文件,不能批量显示(多张图片)。用这种方法在程序外面看不到图片,做到“来无影去无踪”。下面是以二进制存储图片并在窗体上显示出来的代码:
Dim FileName As String
'将图片以二进制保存到数据表中
Sub SaveImage()
Dim rs As New ADODB.Recordset
Dim Istm As ADODB.Stream
rs.Open "图库", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Set Istm = New ADODB.Stream
If Not IsNull(FileName) Then
With Istm
.Type = adTypeBinary
.Open
.LoadFromFile FileName
End With
End If
rs.AddNew
rs("图片") = Istm.Read
rs.Update
rs.Close
Istm.Close
Set rs = Nothing
Set Istm = Nothing
End Sub
'插入图片以获得图片名
Sub GetFileName()
Dim Result As Integer
With Application.FileDialog(1)
.Title = "选择照片"
.Filters.Clear
.Filters.Add "所有文件", "*.*"
.Filters.Add "JPEGs", "*.jpg"
.Filters.Add "位图文件", "*.bmp"
.FilterIndex = 2
.AllowMultiSelect = False
.InitialFileName = CurrentProject.Path
Result = .Show
FileName = Trim(.SelectedItems.Item(1))
Image1.Picture = FileName
End With
End Sub
'读取二进制文件,并显示到窗体上
Sub FindRecord()
Dim rs As New ADODB.Recordset
Dim Istm As ADODB.Stream
rs.Open "Select 图片 FROM 图库 Where id=" & [Forms]![图库]![id], CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Set Istm = New ADODB.Stream
With Istm
.Mode = adModeReadWrite
.Type = adTypeBinary
.Open
.Write rs("图片")
.SaveToFile "c:\image.jpg"
End With
Me.Image1.Picture = "c:\image.jpg"
rs.Close
Istm.Close
Kill "c:\image.jpg"
Set rs = Nothing
Set Istm = Nothing
End Sub