漫说以Stream对象的二进制存储较大文件-殷小宝
Access软件网QQ交流学习群(群号码198465573),欢迎您的加入!
首页 >技术文章> Access数据库-模块/函数/VBA


漫说以Stream对象的二进制存储较大文件

发表时间:2013/12/29 23:29:48 评论(1) 浏览(9490)  评论 | 加入收藏 | 复制
   
摘 要:采用Stream的二进制方式存储图片等较大文件,所占空间小,而且是嵌入式的.在程序外看不到原文件的.
正 文:
      Stream在帮助文档中这么解释:代表二进制数据流或文本流。,二进制大家都知道,数据流或文本流又是什么呢?在1998年由Henzinger在文献87中提出,他将数据流定义为只能以事先规定好的顺序被读取一次的数据的一个序列 后来有人放宽了“一次”的限制,认为:数据流是只能被读取一次或少数几次的点的有序序列。为什么在数据流的处理中,强调对数据读取次数的限制呢?因为数据流是以非常高的速度到来的输入数据,因此对数据流数据的传输、计算和存储都将变得很困难。在这种情况下,只有在数据最初到达时有机会对其进行一次处理,其他时候很难再存取到这些数据(因为没有也无法保存这些数据)。这些都不是我们关注的重点,我们所要的是用Stream来存储较大的文件,Stream有两种模式(mode):adtypetextadTypeBinary ,由于二进制所占空间较小,我个人这样认为,将文件加载到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


Access软件网交流QQ群(群号:198465573)
 
 相关文章
利用存储过程向SQL Server 2000 的表中写入大二进制文...  【朱亦文  2004/5/11】
[分享]Stream保存外部文件   【andymark  2009/10/13】
二进制合并与拆分图片实例演示(源码)  【江羽  2010/5/3】
文件管理(二进制操作文件实例)  【江羽  2010/5/7】
Form2.Image 控件显示ADO 读取的二进制图片  【--  2010/8/12】
【Access示例】十进制数与二进制数的互相转换  【缪炜  2013/3/15】
解决ADODB.Stream用户类型未定义提示错误   【杜超-2号  2013/4/8】
常见问答
技术分类
相关资源
文章搜索
关于作者

殷小宝

文章分类

文章存档

友情链接