准时下班系列!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]