设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 6410|回复: 9
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2015-9-3 15:22:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 roych 于 2015-9-3 15:27 编辑

       前几天,群里的夏枯草问及如何保存附件中的文件。第一反应是ADO里的文件流(Stream)应该可以处理,马上推荐他去看红尘如烟关于上传下载的帖子。不过,似乎他没有找到解决办法。那好吧,我看看吧。嗯,我只看看,不说话,{:soso_e120:}——因为对附件字段不熟。
      于是,创建一个附件字段试试,发现有些意思:首先是单击附件字段,发现弹出一个类似于窗体的东西……这、这、这不就是加载项么?

       再设置一个查询,更有意思了:QBE界面是一个树结构。

       这么一来,我们就可以大胆假设:附件字段其实就是一个记录集。而每个附件则是一条由三个字段组成的记录,分别由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
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1经验 +18 收起 理由
admin + 18 优秀源创,加分了!

查看全部评分

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享分享 分享淘帖1 订阅订阅
2#
发表于 2015-9-3 16:16:14 | 只看该作者
谢谢分享
回复

使用道具 举报

点击这里给我发消息

3#
发表于 2015-9-3 22:22:15 | 只看该作者
这贴子强!加分了!
4#
发表于 2015-9-4 13:08:11 | 只看该作者
技术帝的贴,得顶!!!

点击这里给我发消息

5#
发表于 2015-9-5 11:20:14 | 只看该作者
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

点击这里给我发消息

6#
发表于 2015-9-5 11:25:36 来自手机 | 只看该作者
http://www.office-cn.net/forum.php?mod=viewthread&tid=120888&fromguid=hot&extra=&mobile=1&simpletype=no
7#
发表于 2016-4-14 17:11:59 | 只看该作者

技术帝的贴,得顶!!!
8#
发表于 2016-7-10 00:24:14 | 只看该作者
好好好呵呵呵呵呵
9#
发表于 2016-7-10 00:24:30 | 只看该作者
好好好呵呵呵呵呵
10#
发表于 2018-10-7 09:43:43 | 只看该作者
看不懂吖,小白白
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-19 19:00 , Processed in 0.104108 second(s), 37 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表