小蚂蚁 发表于 2022-1-1 19:30:32

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

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

困难终会过去,成功如期到来,大家对我的反馈让我知道我的工作有创造社会价值。




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

[*]根据商品名称给商品样图命名,并将所有图片放在一个指定的文件夹






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




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




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

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



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.使用演示效果图:

方案小结:这种方案是直接将图片以程序包的方式插入数据库里,可以直接从表里打开图片查看,后续删除本地文件夹的图片也不影响数据库里图片的使用,但会占用较多的数据库体积,数据量大时不建议使用。
不经过窗体直接使用VBA编码将图片数据以长二进制数据保存到OLE字段中
1.新建一个模块,修改模块名称为“批量上传图片”

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,执行后表中数据如下图:

4. 使用表默认生成一个窗体,删除窗体上默认的绑定对象框,换成图像控件

5. 在窗体的Current时间中添加给图像控件赋值的代码:

6. 窗体的显示结果如下图:

方案总结:这种方案是直接将图片以二进制数据的方式插入数据库里,无法直接从表里打开图片查看,需要通过窗体或报表去展示;删除本地文件夹的图片不影响数据库里图片的使用,但同第二种方案一样会占用较多的数据库体积,数据量大时不建议使用。
所需技能分析:

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


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


https://blog.51cto.com/u_14885704/4870652
页: [1]
查看完整版本: 准时下班系列!Access合集之第2集—三种方案批量上传图片到数据库,你会几种?