Office中国论坛/Access中国论坛

标题: 【源码示例】“从前有座山,山里有座庙……”——浅谈Access附件的上传与下载 [打印本页]

作者: roych    时间: 2015-9-3 15:22
标题: 【源码示例】“从前有座山,山里有座庙……”——浅谈Access附件的上传与下载
本帖最后由 roych 于 2015-9-3 15:27 编辑

       前几天,群里的夏枯草问及如何保存附件中的文件。第一反应是ADO里的文件流(Stream)应该可以处理,马上推荐他去看红尘如烟关于上传下载的帖子。不过,似乎他没有找到解决办法。那好吧,我看看吧。嗯,我只看看,不说话,{:soso_e120:}——因为对附件字段不熟。
      于是,创建一个附件字段试试,发现有些意思:首先是单击附件字段,发现弹出一个类似于窗体的东西……这、这、这不就是加载项么?
[attach]57154[/attach]
       再设置一个查询,更有意思了:QBE界面是一个树结构。
[attach]57153[/attach]
       这么一来,我们就可以大胆假设:附件字段其实就是一个记录集。而每个附件则是一条由三个字段组成的记录,分别由FileData(估计是长二进制文件)保存数据,FileName(保存附件初始路径),FileType(保存附件的类型)。有了这三个属性,可以很方便地将文件与长二进制数据进行互转。
       这让我想起了很久以前听过的一个故事:
       “从前有座山,山里有座庙,庙里面有个老和尚在给小和尚讲故事,讲的故事是:
        从前有座山,山里有座庙,庙里面有个老和尚在给小和尚讲故事,讲的故事是:
        ……………………………………………………………………………………………………………”
       和故事不同的是,故事里不必分每座山、每座庙……的区别,但Access肯定是需要区分的,不然如何区别普通的记录集与RecordSet、Field等有所区别呢?果然发现多了RecordSet2、Field2【注意:这是2007版本以上的新属性】。然后再看看Filed2的方法。乖乖,SaveToFile、LoadFromFile……这不就是文件流(Stream)的两个重要方法吗?现在,我们大致可以肯定,这应该是封装给附件字段用的。
       接下来就简单多了,大体就是两个嵌套循环的编写过程。外层是普通记录集的的循环,逐条读取记录集的附件字段;内层自然是附件的文件流读写保存过程,还是老规矩,贴代码先(上传附件的代码不再贴,请自行下载附件):
  1. '*********************************************************************************************************************************
  2. '批量保存附件到文件
  3. '函数:SaveAttamentToFile(ByVal strSQL As String, ByVal strAttachFieldName As String)
  4. '
  5. '参数说明:
  6. '
  7. 'strSQL:                   必选。字符串。表,查询或者SQL语句,用于打开记录集
  8. '
  9. 'strAttachFieldName:       必选。字符串。附件字段的名称,用于读取附件。
  10. '
  11. '使用方法:Call SaveAttamentToFile("表1","附件")
  12. '
  13. '作者:Roych
  14. '
  15. '编写日期:2015-09-03
  16. '*********************************************************************************************************************************

  17. Function SaveAttamentToFile(ByVal strSQL As String, ByVal strAttachFieldName As String)
  18. '定义记录集
  19. Dim rst As DAO.Recordset
  20. '定义附件记录集
  21. Dim rstAtt As DAO.Recordset2
  22. '附件属性
  23. Dim FldAttData As DAO.Field2
  24. Dim FldAttPath As DAO.Field2
  25. '定义文件夹拾取器
  26. Dim fd As FileDialog
  27. Set fd = Application.FileDialog(msoFileDialogFolderPicker)

  28. Set rst = CurrentDb.OpenRecordset(strSQL)
  29. With fd
  30.     .Title = "请选择保存的位置"
  31.     .ButtonName = "保存"
  32.     If .Show = -1 Then
  33.         Do Until rst.EOF
  34.             Set rstAtt = rst(strAttachFieldName).Value
  35.             Do Until rstAtt.EOF
  36.                 Set FldAttData = rstAtt.Fields("filedata")
  37.                 Set FldAttPath = rstAtt.Fields("filename")
  38.                 '如果存在旧文件,则删除
  39.                 If Len(Dir(fd.SelectedItems(1) & "" & FldAttPath)) > 0 Then Kill fd.SelectedItems(1) & "" & FldAttPath
  40.                 '保存文件
  41.                 FldAttData.SaveToFile fd.SelectedItems(1) & "" & FldAttPath
  42.                 rstAtt.MoveNext
  43.             Loop
  44.             rstAtt.Close
  45.             rst.MoveNext
  46.         Loop
  47.     End If
  48. End With
  49. rst.Close
  50. Set rstAtt = Nothing
  51. Set rst = Nothing
  52. End Function
复制代码
[attach]57155[/attach]



作者: 风中漫步    时间: 2015-9-3 16:16
谢谢分享
作者: admin    时间: 2015-9-3 22:22
这贴子强!加分了!
作者: xiaowuo2    时间: 2015-9-4 13:08
技术帝的贴,得顶!!!
作者: tmtony    时间: 2015-9-5 11:20
zpy2 回复的内容

Sub addAttachToImageStore()
  
  Dim dbs As DAO.Database
  Dim strSql As String
  Dim strTblName As String
  Dim strFieldName As String
  Dim rs As DAO.Recordset
  Dim rs2 As DAO.Recordset
  'Set dbs = CurrentDb
  'strTblName = "tblStudents"
  strTblName = "ImageStore"
  strSql = "select * from " & strTblName
  Set rs = CurrentDb.OpenRecordset(strSql)
  'rs.Edit
  rs.AddNew
  rs(0) = 10
  rs(1) = 1
  rs(2) = 5
  rs(3) = "c:\testpath\img1.gif"
  ' Add a new attachment.
  Set rs2 = rs.Fields("image_pic").Value
  rs2.AddNew
  rs2.Fields("FileData").LoadFromFile "c:\testpath\img1.gif"    '"c:\ggg\altBackGrd.gif"
  rs2.Update
  rs2.Close
  
  rs.Update
  rs.Close
  Set rs2 = Nothing
  Set rs = Nothing
End Sub
作者: zpy2    时间: 2015-9-5 11:25
http://www.office-cn.net/forum.php?mod=viewthread&tid=120888&fromguid=hot&extra=&mobile=1&simpletype=no
作者: 522650696    时间: 2016-4-14 17:11

技术帝的贴,得顶!!!
作者: p51219    时间: 2016-7-10 00:24
好好好呵呵呵呵呵
作者: p51219    时间: 2016-7-10 00:24
好好好呵呵呵呵呵
作者: 初学者AA    时间: 2018-10-7 09:43
看不懂吖,小白白




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3