Hi,各位同学好!我是吴明课堂的答疑老师之一陈婉。2022年到来了,祝大家一切安好!

今天是新年的第一天,在本期的职场应用案例分享之前,我想分享一个真实发生过的故事。(不感兴趣的同学可以直接跳到分隔线之后看案例)

前几天有个我印象中很努力向上的老学员跟我说:“陈老师,我觉得努力没用。”我问他为什么有这样的想法,他反问我:“你努力了,口袋里有想要的东西吗?”

这个问题要较真回复,需要从多个维度去阐述,比如努力的方向和目标、努力的方法和策略、成功的定义和衡量标准等。在这里我就不去花大篇幅陈述别人的研究成果,仅分享一下个人体会。

因为个人家庭原因,我在2017-2019年三年都荒废度日,到2019年底的时候,终于有机会回到职场,但是三年的时间消磨完了我的自信。

我打算从零开始,先给自己充一下电,学点东西再去投简历。就这样碰到了吴老师的课程(纯粹是因为当时更的少,学习压力小),老师讲课逻辑清晰、直白易懂,很大程度上提升了我的自信心。

到了2020年3月中旬的时候,遇到了对我影响巨大的课程—《思维导图》,似乎思路一下子被打通了。我很激动,照着画了一张自我分析图,然后发给了老师,得到了老师的肯定和鼓励。我有勇气去更新简历准备找工作了。

3月底,突然收到了老师的私聊,他说注意到我的自我分析图上写了最近要找工作,问我有没有兴趣来做答疑老师。然后就一直做到了现在,再过3个月我在这个职位上就要干满2年了。

答疑老师这份工作可以简单的做,只回复课程里的内容。认真做所面临的压力是巨大的,在VBA编程课和Access数据库刚上线时,零基础开始的我曾经压力大到失眠,怀疑自己是否能胜任。

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

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

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


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

十分感谢所有给过我支持的学员们,你们的反馈是我保持学习和进步的最大动力。

因着这份工作,我不得不持续努力了近两年,很累。收入一般,如果“口袋里的”以金钱来衡量,我确实没有获得很多。但是这两年,我状态很好。荒废的三年,让我严重怀疑自己的社会价值,看不到未来。而现在,我收获了积极向上的心态,充满希望的生活,还有在市场上具有竞争力的技能水平,最重要的是养成了学习的习惯。

不管未来我到哪里,这两年的经历都会让我终身受益,人会因为虚度光阴而遗憾,却不会因为努力过而后悔。

以上就是我对那位同学问题的答复,希望能对有同样疑问的同学们有所帮助。



接下来进入今天的主题,无论是Excel还是Access,批量处理图片都是一个常见问题。今天我将教大家三种在Access中的解决方案。

把图片放在指定文件夹中,在数据库中保存图片路径:

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

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


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


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

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


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

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

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


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

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

借助窗体和表的关联关系,使用窗体编程实现批量上传图片程序包到表中:

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

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


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

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

方案小结:这种方案是直接将图片以程序包的方式插入数据库里,可以直接从表里打开图片查看,后续删除本地文件夹的图片也不影响数据库里图片的使用,但会占用较多的数据库体积,数据量大时不建议使用。

不经过窗体直接使用VBA编码将图片数据以长二进制数据保存到OLE字段中

1.新建一个模块,修改模块名称为“批量上传图片”

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

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

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

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

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

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

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

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

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

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

所需技能分析:

  • 需要对数据库的窗体和控件使用非常熟悉
  • 会用简单的SQL
  • 需要查阅API的能力
  • 需要一定的编码和调试能力

上述所需技能均在吴明老师的《Access零基础到应用系统教程》中可以学到,如需系统学习Access,可查看以下课程:

​https://edu.51cto.com/course/27250.html​

该课程可以使学员以最少的学习时间搭建最完善的数据库和Access窗体编程知识架构。


案例文档获取链接:

​​https://pan.baidu.com/s/1G0rGZN7X8dtTO7tnaTazdQ​​​

提取码:wmkt