评论

收藏

[python] 准时下班系列!Access合集之第2集—三种方案批量上传图片到数据库,你会几种?

编程语言 编程语言 发布于:2022-01-01 19:30 | 阅读数:735 | 评论:0

Hi,各位同学好!我是吴明课堂的答疑老师之一陈婉。2022年到来了,祝大家一切安好!
今天是新年的第一天,在本期的职场应用案例分享之前,我想分享一个真实发生过的故事。(不感兴趣的同学可以直接跳到分隔线之后看案例)
前几天有个我印象中很努力向上的老学员跟我说:“陈老师,我觉得努力没用。”我问他为什么有这样的想法,他反问我:“你努力了,口袋里有想要的东西吗?”
这个问题要较真回复,需要从多个维度去阐述,比如努力的方向和目标、努力的方法和策略、成功的定义和衡量标准等。在这里我就不去花大篇幅陈述别人的研究成果,仅分享一下个人体会。
因为个人家庭原因,我在2017-2019年三年都荒废度日,到2019年底的时候,终于有机会回到职场,但是三年的时间消磨完了我的自信。
我打算从零开始,先给自己充一下电,学点东西再去投简历。就这样碰到了吴老师的课程(纯粹是因为当时更的少,学习压力小),老师讲课逻辑清晰、直白易懂,很大程度上提升了我的自信心。
到了2020年3月中旬的时候,遇到了对我影响巨大的课程—《思维导图》,似乎思路一下子被打通了。我很激动,照着画了一张自我分析图,然后发给了老师,得到了老师的肯定和鼓励。我有勇气去更新简历准备找工作了。
3月底,突然收到了老师的私聊,他说注意到我的自我分析图上写了最近要找工作,问我有没有兴趣来做答疑老师。然后就一直做到了现在,再过3个月我在这个职位上就要干满2年了。
答疑老师这份工作可以简单的做,只回复课程里的内容。认真做所面临的压力是巨大的,在VBA编程课和Access数据库刚上线时,零基础开始的我曾经压力大到失眠,怀疑自己是否能胜任。
DSC0000.png
困难终会过去,成功如期到来,大家对我的反馈让我知道我的工作有创造社会价值。
DSC0001.png


DSC0002.png
十分感谢所有给过我支持的学员们,你们的反馈是我保持学习和进步的最大动力。
因着这份工作,我不得不持续努力了近两年,很累。收入一般,如果“口袋里的”以金钱来衡量,我确实没有获得很多。但是这两年,我状态很好。荒废的三年,让我严重怀疑自己的社会价值,看不到未来。而现在,我收获了积极向上的心态,充满希望的生活,还有在市场上具有竞争力的技能水平,最重要的是养成了学习的习惯。
不管未来我到哪里,这两年的经历都会让我终身受益,人会因为虚度光阴而遗憾,却不会因为努力过而后悔。
以上就是我对那位同学问题的答复,希望能对有同样疑问的同学们有所帮助。
接下来进入今天的主题,无论是Excel还是Access,批量处理图片都是一个常见问题。今天我将教大家三种在Access中的解决方案。
把图片放在指定文件夹中,在数据库中保存图片路径:

  • 根据商品名称给商品样图命名,并将所有图片放在一个指定的文件夹
DSC0003.png


DSC0004.png


2. 使用SQL批量更新样品图片字段的图片路径
DSC0005.png


DSC0006.png
3. 在窗体中展示商品图片
DSC0007.png


DSC0008.png
方案小结:分开存放图片和商品数据是实际应用中最常用的方法,简单易懂,学完了Access课程的同学都可以自己实现;路径是文本格式,不会占用太多数据库体积,但需要注意维护图片和路径的对应关系,不能轻易改变其中任何一方。
借助窗体和表的关联关系,使用窗体编程实现批量上传图片程序包到表中:

  • 根据表自动生一个窗体,删除ID、商品名称控件,在窗体上添加一个文本框,一个按钮,用来选择待上传图片的路径
DSC0009.png


2.给上传图片添加click事件,实现图片的上传操作,代码如下:
Option Compare Database
Option Explicit
'需引用Microsoft Scripting Runtime库
Dim FSO As New FileSystemObject
Private Sub Command17_Click()
  uploadPics
End Sub
'选择图片所在文件夹
Sub uploadPics()
  Dim fd As FileDialog, selectedFile As String
  '选择图片所在文件夹
  Set fd = FileDialog(msoFileDialogFolderPicker)
  If (fd.Show) Then
    '用户点确定按钮
    selectedFile = fd.SelectedItems.Item(1)
    Me.filepath = selectedFile
    updateTablePics (selectedFile)
  Else
    '用户点取消,清空上传图片的路径
    Me.filepath = ""
  End If
End Sub
'将图片上传到窗体控件并保存到表里
Function updateTablePics(selectedFile As String)
  Dim picFile As String, successCount As Integer
  picFile = Dir(selectedFile & "")
  Do While picFile <> ""
    If (picFile Like "*.jpg") Then
      Dim picName As String
      picName = VBA.Replace(picFile, ".jpg", "")
      '出错则跳过这张图
      On Error GoTo ErrorHandler
      
      DoCmd.SearchForRecord acForm, "商品表_保存图片程序包窗体", acFirst, "商品名称='" & picName & "'"
      Me.样品图片.SourceDoc = selectedFile & "" & picFile
      Me.样品图片.OLETypeAllowed = acOLEEmbedded
      '要求控件是可见状态
      Me.样品图片.Action = acOLECreateEmbed
      DoCmd.Save acForm, "商品表_保存图片程序包窗体"
      successCount = successCount + 1
    End If
ErrorHandler:
    picFile = Dir
  Loop
  
  MsgBox "上传成功" & successCount & "张图片"
End Function
3.使用演示效果图:
DSC00010.gif
方案小结:这种方案是直接将图片以程序包的方式插入数据库里,可以直接从表里打开图片查看,后续删除本地文件夹的图片也不影响数据库里图片的使用,但会占用较多的数据库体积,数据量大时不建议使用。
不经过窗体直接使用VBA编码将图片数据以长二进制数据保存到OLE字段中
1.新建一个模块,修改模块名称为“批量上传图片”
DSC00011.png
2. 在模块中编写如下代码:
Option Compare Database
Option Explicit
'需引用Microsoft Scripting Runtime库
Dim FSO As New FileSystemObject
Sub uploadPics()
  Dim fd As FileDialog, selectedFile As String
  '选择图片所在文件夹
  Set fd = FileDialog(msoFileDialogFolderPicker)
  If (fd.Show) Then
    '用户点确定按钮
    selectedFile = fd.SelectedItems.Item(1)
    updateTablePics (selectedFile)
  End If
End Sub
'将图片数据以二进制流方式保存进表里
Function updateTablePics(selectedFile As String)
  Dim rs As Recordset
  Dim db As Database
  ' 需引用Microsoft ActiveX Data Objects Library库
  Dim adoStream As ADODB.Stream
  Set db = Application.CurrentDb
  Set adoStream = New ADODB.Stream
  
  Set rs = db.OpenRecordset("商品表_保存图片Blob", dbOpenDynaset, dbSeeChanges)
  rs.MoveFirst
  Dim n As Integer
  Do Until rs.EOF
    If FSO.FileExists(selectedFile & "" & rs("商品名称") & ".jpg") Then
       Dim picFile As String, pic As Object
      picFile = selectedFile & "" & rs("商品名称") & ".jpg"
      adoStream.Type = adTypeBinary
      adoStream.Open
      adoStream.LoadFromFile picFile
      
      rs.Edit
      rs("样品图片") = adoStream.Read
      rs.Update
      n = n + 1
      adoStream.Close
    End If
    rs.MoveNext
  Loop
  rs.Clone
  db.Close
  Set adoStream = Nothing
  Set rs = Nothing
  Set db = Nothing
  MsgBox "成功上传" & n & "张图片"
End Function
3. 执行子程序uploadPics,执行后表中数据如下图:
DSC00012.png
4. 使用表默认生成一个窗体,删除窗体上默认的绑定对象框,换成图像控件
DSC00013.png
5. 在窗体的Current时间中添加给图像控件赋值的代码:
DSC00014.png
6. 窗体的显示结果如下图:
DSC00015.png
方案总结:这种方案是直接将图片以二进制数据的方式插入数据库里,无法直接从表里打开图片查看,需要通过窗体或报表去展示;删除本地文件夹的图片不影响数据库里图片的使用,但同第二种方案一样会占用较多的数据库体积,数据量大时不建议使用。
所需技能分析:

  • 需要对数据库的窗体和控件使用非常熟悉
  • 会用简单的SQL
  • 需要查阅API的能力
  • 需要一定的编码和调试能力
上述所需技能均在吴明老师的《Access零基础到应用系统教程》中可以学到,如需系统学习Access,可查看以下课程:
​​https://edu.51cto.com/course/27250.html​​
该课程可以使学员以最少的学习时间搭建最完善的数据库和Access窗体编程知识架构。


案例文档获取链接:
​​​​https://pan.baidu.com/s/1G0rGZN7X8dtTO7tnaTazdQ​​​​
提取码:wmkt


关注下面的标签,发现更多相似文章