当前课程知识点:数据库技术与程序设计 >  综合练习题库 >  综合练习题库 >  技术分享贴:如何在数据库中保存大量图片

返回《数据库技术与程序设计》慕课在线视频课程列表

技术分享贴:如何在数据库中保存大量图片资料文件与下载

技术分享贴:如何在数据库中保存大量图片

我们将图片保存到数据库中,使用维护起来都变得很简单尤其适用于小型便携式的Access管理系统。但如果直接通过绑定对象框控件的插入对象方法将图片插入的话,非位图图片体积会暴增几十上百倍,从而大大降低了实用性。


一般情况下,如果要将图片保存到数据库中,都是通过绑定对象框的“插入对象”功能来实现,但是这样做会造成数据库体积的明显增大。尤其是在Access 2007之前的版本中所有插入的图上均会被转换成位图,而如果把一个JPG图片转换成位图,我们会发现图片的大小增大了几十上百倍。那么有没有一种办法能够直接把保存源格式的图片到数据库中呢?答案是肯定的,就是ADO中的流对象(Stream)。此处要注意的是,ADO必须是2.5以及更新的版本,老版本中是没有流对象的。


流对象主要有两种用途:一种是处理文档数据,这样可以通过流对象的属性和方法来读取和修改文档内容;另一种就是把其它任意格式的文件以二进制数据流进行处理,不关心文件的格式和内容。在本文中我们讨论的是在数据库中存储图片,所以我们这里主要讨论的就是它的后一种用途。为了更容易理解,我们在此基于一个示例程序来进行说明。


一、创建表

首先我们需要在表中添加至少两个字段,一个用来存放图片的名称,一个用来存放图片的二进制文件数据:

image.png

二、创建窗体

然后我们基于此表来创建窗体,通过窗体实现图片的保存以及将保存的图片显示出来。在此窗体中我们需要手动添加三个控件:

图像控件:名称:imgPic    图片类型:链接

按钮控件:名称:cmdAdd  标题:添加/更改图片   

按钮控件:名称:cmdDel   标题:删除图片           


由于相关的记录修改添加都是通过代码完成,所以我们需要将“图片名称”的“锁定”属性设为“是”,另外图片数据是一个绑定对象框控件,它只用来存放图片文件数据,不需要显示出来,所以我们要将其“可见性”属性设为“否”。

三、添加代码

接下来我们需要在单击“添加/更改图片”按钮时将图片以二进制方式写入到数据库中,及以在窗体的记录切换时自动将二进制数据再还原为图片文件,并以链接的方式显示在图像控件中,这些都需要以编程方式来实现,具体实现代码如下:

'添加图片并将图片保存到数据库中

Private Sub cmEdit_Click()

    Dim stm As ADODB.Stream     '定义流对象变量

    Dim strPathName As String   '文件名临时变量



    '调用Access通用的文件选取对话框来选择一个图片文件(需要最低2003版Access)

    With FileDialog(3) 'msoFileDialogFilePicker

        '清除原有文件类型筛选

        .Filters.Clear

        '添加自定义文件类型筛选

        .Filters.Add "图片文件", "*.jpg;*.gif;*.png"

        '如果对话框未被取消,则将选取的文件名保存到变量

        If .Show Then strPathName = .SelectedItems(1)

    End With



    '如果变量不为空说明对话框没有被取消

    If strPathName <> "" Then

        '初始化流对象

        Set stm = New ADODB.Stream

        '设置为二进制处理方式

        stm.Type = adTypeBinary

        '设置为读写权限模式

        stm.Mode = adModeReadWrite

        '打开流对象

        stm.Open

        '从将文件加载到流对象

        stm.LoadFromFile strPathName

        '将流对象中的二进制数据保存到数据库中

        Me!图片数据 = stm.Read

        '关闭流对象

        stm.Close

        '在图像控件中显示刚才的图片

        Me.imgPic.Picture = strPathName

        '将图片的文件名保存到“图片名称”字段,不保存路径

        Me!图片名称 = Mid$(strPathName, InStrRev(strPathName, "\") + 1)

    End If

    '销毁对象变量

    Set stm = Nothing

End Sub

'从数据库中删除图片

Private Sub cmdDel_Click()

    Me!图片数据 = Null      '清空图片数据字段

    Me!图片名称 = Null      '清空图片名称字段

    Me.imgPic.Picture = ""  '清除图像控件中显示的图片

End Sub

 '通过成为当前事件,实现记录切换时自动显示图片

Private Sub Form_Current()

    Dim stm As ADODB.Stream     '定义流对象变量

    Dim strPathName As String   '文件名临时变量



    '如果“图片数据”字段不为空

    If Not IsNull(Me!图片数据) Then

        '根据“图片名称”字段生成一个到操作系统临时文件夹的路径名

        strPathName = Environ$("Temp") & "\" & Me!图片名称

        '初始化流对象变量

        Set stm = New ADODB.Stream

        '设置为二进制处理方式

        stm.Type = adTypeBinary

        '设置为读写权限模式

        stm.Mode = adModeReadWrite

        '打开流对象

        stm.Open

        '将数据库中的二进制数据写入流对象变量

        stm.Write Me!图片数据

        '另存为文件,如果文件存在则覆盖

        stm.SaveToFile strPathName, adSaveCreateOverWrite

        '关闭流对象

        stm.Close

        '在图像控件中显示刚才保存的图片

        Me.imgPic.Picture = strPathName

    Else

        '如果当前记录中没有图片数据,则清除图像控件中的显示

        Me.imgPic.Picture = ""

    End If

    '销毁对象变量

    Set stm = Nothing

End Sub

四、运行测试

最后,就是测试了,大家快去试一下吧。


资料来源:公众号Access开发

返回《数据库技术与程序设计》慕课在线视频列表

数据库技术与程序设计课程列表:

我们的“新手村”——课程导学文档

-【重磅】课程学案——《数据库技术与程序设计》自学指南

-慕课使用手册——写给学员和开课教师

-知识点拼图+问题求解流程+软件工程开发教学流程——写给翻转课堂开课教师

-资源列表——课程配套教材 & 补充资料 & 数据资源

大英科学博物馆的发现

-大英科学博物馆——二进制的Nested Weights

-大英科学博物馆——奈皮尔的“骨头”

技术分享合集(持续更新中……)

-技术分享贴:非结构化数据存储的解决方案

-技术分享贴:怎么用窗体显示OLE图像文件?

-技术分享贴续篇:怎样用窗体显示一条记录存储的多张OLE图像文件?

-技术分享贴:复杂的SQL自体连接和嵌套查询,涨粉最多的用户ID和涨粉数

-技术分享贴:用函数验证哥德巴赫猜想

-技术分享贴:用十几行VBA代码,编写汉诺塔游戏程序!

-技术分享贴:在窗体设计时,如何插入音乐、视频等不同文件?

-技术分享贴:巧用计时器,让星空闪烁!

-技术分享贴:用宏代码,查表实现登录窗体

-技术分享贴:如何实现运行窗体时,数据库页面最小化?

-技术分享贴:如何实现点击“关闭”按钮,退出界面?

-技术分享贴:带小数点的数据字段类型设计

-技术分享帖:怎样用ActiveX控件创建二维码?

-技术分享帖:用VBA代码解决猴子吃桃问题

-技术分享帖:用CommonDialog控件调取系统拾色器

-技术分享帖:模拟QQ抖动窗口

-技术分享帖:一张表实现组合框联动

-技术分享帖:标题闪烁提醒

-技术分享贴:石头剪刀布

-技术分享帖:数据表窗体中实现动态序号

-技术分享帖:计算环比

-技术分享帖:按年计算同比

-技术分享贴:如何在数据库中保存大量图片

-技术分享贴:根据自定义条件防止删除记录

学员回音壁

-往届学员学习《数据库技术与程序设计》心得体会

【有奖竞赛报名】数据库应用系统设计竞赛

-【有奖竞赛报名】数据库应用系统设计竞赛

-往届竞赛获奖作品展示

--数据库在疫情防控中的试运用

--猪猪公寓物业信息管理系统

--疫情期间线上奶茶星球程序设计研究

--理财产品投资规划数据库系统

--单词记忆巩固拓展与应用

第一章 数据管理技术——数据库

-动画导入:大一新生小南的“数字生活”

-从零开始——第一章知识点拼图

-第一章思维导图

-1.1 数据与数据管理

--1.1.1 数据、信息和数据库

-- 课件1.1.1 数据、信息和数据库

--1.1.2 探索数据管理

--课件1.1.2 探索数据管理

--【拓展阅读】到底什么是IT(Information Technology)

--【拓展阅读】数据管理的前世今生

--【拓展阅读】NoSQL数据库

-1.2 DBS=DB+DBMS

--1.2.1 数据库系统

--课件1.2.1 & 一页导学

--【扩展阅读】数据库统一控制

-1.3 不以六律不能正五音——数据模型

--1.3.1 数据模型

-- 课件1.3.1 数据模型

--【拓展阅读】广义的数据模型

-1.4 数据库系统结构

--1.4.1 数据库的三级模式和两级映像

--【拓展阅读】关于三级模式两级映像的“通俗”解释

-本章小结

--第一章小结

-第一章作业

-【讨论贴:数据库会被区块链替代吗?】

第二章 数据库概念、逻辑结构设计

-动画导入:小南的“混乱社团”

-第二章知识点拼图

-第二章思维导图

-2.1 数据库设计流程

--2.1.1 数据库设计一般流程

--课件 2.1.1 数据库设计流程

-2.2 概念结构设计

--2.2.1 数据库概念结构设计

--课件 2.2.1 数据库概念结构设计

--2.2思考与练习:关键字和外关键字

--【拓展阅读】扩展的ER模型

--【拓展阅读】ER图的其他表示法

--【拓展阅读】统一建模语言UML

--【拓展阅读】概念结构设计重要原则

-2.3 逻辑结构设计

--2.3.1 数据库逻辑结构设计

--课件2.3.1 数据库逻辑结构设计

--2.3.2 关系模型完整性规则

--课件2.3.2 关系模型完整性规则

--2.3.3 ER模型转化成关系模型

--2.3 思考与练习

--课件2.3.3 ER模型转化成关系模型

--【拓展阅读】关系模型的发明

--【拓展阅读】关系规范化——函数依赖

--【扩展阅读】关系规范化——范式

-本章小结

--第二章小结

-第二章作业

-【讨论贴:结构化数据—关系模型,非结构化数据—咋办?】

第三章 数据库物理结构设计与维护

-动画导入:小南的“辩协数据库”

-第三章知识点拼图

-第三章思维导图

-3.1 数据库管理系统

--课件3.1.1 数据库管理系统

--【扩展阅读】数据库技术与产品

--【拓展阅读】Microsoft Office 365

-3.2 创建数据库

--3.2.1 创建数据库和数据表

--课件3.2.1 创建数据库和数据表

--【拓展阅读】关系模式存取方式选择

-3.3 创建数据表

--3.3.1 表字段类型和数据格式

--课件3.3.1 表字段类型和数据格式

--3.3.2 表字段属性

--课件3.3.2 表字段属性

--3.3.3 表的参照完整关系

--课件3.3.3 表的参照完整性关系

--3.3.4 表数据的输入

--课件3.3.4 表数据的输入

--【扩展阅读】用“字段模板”创建数据表

-3.4 维护数据表

--3.4.1 表的维护

--课件3.4.1 表的维护

-本章小结

--第三章小结

-第三章作业

-【讨论帖:南开同学创建数据库遇到了麻烦,来帮帮他吧!】

第四章 常量、变量、表达式与函数

-动画导入:程序设计伊始——“基本语言元素”

-第四章知识点拼图

-第四章思维导图

-4.1 基本数据类型

--4.1.1 数据类型

--课件4.1.1 数据类型、常量与变量

--【扩展阅读】为什么要有数据类型

-4.2 常量

--4.2.1 常量

--【扩展阅读】VB常数

-4.3 变量和数组

--4.3.1 变量

--【拓展阅读】变量在内存中的存储

-4.4 表达式和函数

--4.4.1 数值表达式和字符表达式

--课件4.4.1 数值表达式、字符表达式

--4.4.2 关系表达式、逻辑表达式、运算符优先级

--课件4.4.2 关系表达式、逻辑表达式、运算符优先级

--4.4.3 数值计算函数

--课件4.4.3 数值计算函数

--4.4.4 字符处理函数

--课件4.4.4 字符处理函数

--4.4.5 日期时间函数、类型转换函数、if函数

--课件4.4.5 日期时间函数、类型转换函数、iif函数

--【拓展阅读】VB函数大全

-本章小结

--第四章小结

-第四章作业

-【讨论帖:悬赏!谁能解决Round()函数Banker’s rounding算法的bug?】

第五章 数据检索与查询文件

-动画导入:小南的“大海捞针”

-第五章知识点拼图

-第五章思维导图

-5.1 数据检索方法

--5.1.1 数据检索方法

--课件5.1.1 数据检索方法和查询文件

--【拓展阅读】多级索引

--【拓展阅读】海量数据检索算法

--【拓展阅读】二叉树查找算法

--【拓展阅读】哈希查找算法

-5.2 数据库查询文件

--5.2.1 查询文件

--课件5.2.1 数据检索方法和查询文件

-5.3 选择查询

--5.3.1 选择查询-1

--课件5.3.1 选择查询-1

--5.3.2 选择查询-2

--课件5.3.2 选择查询-2

-5.4 参数查询

--5.4.1 参数查询

--课件5.4.1 参数查询

-5.5 操作查询

--5.5.1 操作查询

--课件5.5.1 操作查询

-本章小结

--第五章小结

-第5章作业

-【讨论帖:当面对海量数据的时候,怎样进行索引规划】

第六章 数据库标准语言SQL

-动画导入:小南的数据库"普通话"

-第六章知识点拼图

-第六章思维导图

-6.1 SQL概述

--6.1.1SQL概述

--课件6.1.1 SQL概述

--【扩展阅读】结构化查询语言发展与版本

-6.2 SQL数据定义语言

--6.2.1 SQL数据定义语言

--课件6.2.1 SQL数据定义语言

-6.3 SQL数据查询语言

--6.3.1 SQL数据查询语言——简单查询(一)

--课件6.3.1 SQL数据查询语言——简单查询(一)

--6.3.2 SQL数据查询语言——简单查询(二)

--课件6.3.2 SQL数据查询语言——简单查询(二)

--6.3.3 SQL数据查询语言——连接查询

--课件6.3.3 SQL数据查询语言——连接查询

--6.3.4 SQL数据查询语言——嵌套查询

--课件6.3.4 SQL数据查询语言——嵌套查询

--6.3.5 SQL数据查询语言——分组查询

--课件6.3.5 SQL数据查询语言——分组查询

--【拓展阅读】使用别名进行自体连接

--【拓展阅读】非等值连接

--【拓展阅读】比较连接查询和嵌套查询

--【拓展阅读】用表达式作分组字段

-6.4 SQL数据操作语言

--6.4.1 SQL数据操作语言

--课件6.4.1 SQL数据操作语言

--【拓展阅读】数据操作语言嵌套数据查询语言

-思考与练习

-本章小结

--第六章小结

-第6章作业

-【讨论帖:你是否听说过“自然语言检索”,你在什么地方见到过,或者使用过“自然语言检索”吗?】

第七章 窗体与报表设计

-动画导入:小南的"界面交互数据库"

-第七章知识点拼图

-第七章思维导图

-7.1 窗体设计

--7.1.1 创建简单窗体

--课件7.1.1 创建简单窗体

--7.1.2 窗体设计器

--课件7.1.2 窗体设计器

--7.1.3 使用窗体控件创建窗体-1

--课件7.1.3 使用窗体控件创建窗体1

--7.1.4 使用窗体控件创建窗体-2

--课件7.1.4 使用窗体控件创建窗体2

--7.1.5 使用窗体控件创建窗体-3

--课件7.1.5 使用窗体控件创建窗体3

--【拓展阅读】窗体控件大全

--【思考与练习】创建图书销售信息窗体

-7.2 报表设计

--7.2.1 报表的结构及创建报表

--课件7.2.1 报表的结构及创建报表

--7.2.2 创建分组报表及高级报表设计

--课件7.2.2 创建分组报表及高级报表设计

--【思考与练习】创建分组报表

--【拓展阅读】秒懂百科-一分钟了解报表

--【拓展阅读】炫酷的可视化报表

-本章小结

--第七章小结

-第七章作业

-【讨论帖:你能总结一下窗体和报表的共性和区别吗?在你的工作、学习或生活中,你都见到过哪些窗体和报表的实际应用?】

第八章 结构化程序设计

-动画导入:小南的“VBA”

-第八章知识点拼图

-第八章思维导图

-8.1 VBA编程基础

--8.1.1 VBA编程环境

--课件8.1.1 VBA编程环境

-8.2 顺序结构及常用命令

--8.2.1 顺序结构及常用命令

--课件8.2.1 顺序结构及常用命令

-8.3 分支结构

--8.3.1 分支选择语句if

--课件8.3.1 分支选择语句if

--8.3.2 多路分支选择语句Select Case 和分支嵌套

--课件8.3.2 多路分支选择语句Select Case 和分支嵌套

-8.4 循环结构

--8.4.1 For循环语句

--课件8.4.1 For循环语句

--8.4.2 Do While循环语句

--课件8.4.2 Do While循环语句

--8.4.3 循环嵌套

--课件8.4.3 循环嵌套

-8.5 函数与过程

--8.5.1 过程与函数

--课件8.5.1 过程与函数

--8.5.2 参数传递

--课件8.5.2 参数传递

--8.5.3 变量与过程的作用范围

--课件8.5.3 变量与过程的作用范围

-8.6 VBA程序调试

--8.6.1 VBA程序调试

--课件8.6.1 VBA程序调试

-8.7 数组

--8.7.1 数组定义

--课件8.7.1 数组定义

--8.7.2 数组处理

--课件8.7.2 数组处理

--【思考练习】利用二维数组,输出杨辉三角

-【拓展阅读】算法-枚举法

-【拓展阅读】算法-递推法

-【拓展阅读】算法-递归法

-【拓展阅读】算法-迭代法

-【拓展阅读】算法-分治法

-【拓展阅读】算法-回溯法

-【拓展阅读】编程算法的复杂性

-本章小结

--第八章小结

-第八章作业

-【讨论帖:我们学习了VBA面向过程的程序设计,你能结合实践,谈谈自己对算法和程序的理解吗?】

第九章 面向对象的程序设计

-动画导入:小黄鸭的故事

-第九章知识点拼图

-第九章思维导图

-9.1 面向对象的基本概念

--9.1.1 什么是面向对象

--课件9.1.1 面向对象

--9.1.2 对象与类

--课件9.1.2 对象与类

--【拓展阅读】DoCmd 对象大全

--【拓展阅读】OOP的发展

--【拓展阅读】秒懂百科-一分钟了解面向对象

-9.2 控件对象的属性和方法

--9.2.1 控件对象的属性、方法、事件

--课件9.2.1 控件对象的属性、方法、事件

-9.3 控件对象的事件

--9.3.1 事件触发顺序

--课件9.3.1 事件触发顺序

-9.4 窗体的面向对象程序设计

--9.4.1 对象的同步

--课件9.4.1 对象的同步

--9.4.2 数据传递-文字格式实例

--课件9.4.2 数据传递-文字格式设置实例

--9.4.3 数据传递-登录界面实例

--课件9.4.3 数据传递-登录界面实例

--9.4.4 面向对象编程中的全局变量

--课件9.4.4 面向对象编程中的全局变量

--9.4.5 连接和访问数据表

--课件9.4.5 连接和访问数据表

--9.4.6 更新数据源

--课件9.4.6 更新数据源

--9.4.7 组合框数据临时存储

--课件9.4.7 组合框数据临时存储

-【拓展阅读】【综合案例】Word中的查找与替换是如何实现的?

-【拓展阅读】【综合案例】无纸化考试系统是如何实现的?

-本章小结

--第九章小结

-第九章作业

-【讨论贴:本章用小黄鸭类比了面向对象的各种概念,你能也用类比的方式谈谈你对面向对象的理解吗?】

第十章 宏

-动画导入:小南的“积木”和“宏”

-第十章知识点拼图

-第十章思维导图

-10.1 宏的基本概念

--10.1.1 什么是宏

--课件10.1.1 什么是宏

--10.1.2 宏的命令与分类

--课件10.1.2 宏的命令与分类

--【拓展阅读】秒懂百科-一分钟了解宏

-10.2 宏的创建与调用

--10.2.1 宏综合实例——操作序列宏

--课件10.2.1 宏综合实例——操作序列宏

--10.2.2 宏综合实例——条件宏

--课件10.2.2 宏综合实例——条件宏

--10.2.3 宏综合实例——宏组

--课件10.2.3 宏综合实例——宏组

--10.2.4 宏综合实例——调用宏

--课件10.2.4 宏综合实例——调用宏

--【拓展阅读】给宏创建快捷键

--【拓展阅读】关于自启动宏

-10.3 数据宏

--10.3.1 宏综合实例——数据宏

--课件10.3.1 宏综合实例——数据宏

--【拓展阅读】为什么使用数据宏

-10.4 宏的调试和转换

--10.4.1 宏的调试和转化

--课件10.4.1 宏的调试和转化

-【拓展阅读】【综合案例】一句代码不敲,就开发了一个航班查询系统?

-本章小结

--第十章小结

-第十章作业

-【讨论帖:王者、LOL、魔兽、DOTA……,说说你在虚拟世界里用宏(超级宏)所向披靡的故事吧!】

第十一章 桌面数据库应用系统开发综合案例

-Congradulations!拼图通关!

-第十一章思维导图

-11.1 数据库应用系统结构

--11.1.1数据库应用系统结构

--课件11.1.1 数据库应用系统结构

-11.2 教学教务管理系统功能需求

--11.2.1 一个典型的信息系统

--课件11.2.1 一个典型的信息系统

-11.3 教学教务管理系统底层数据结构

--11.3.1 系统底层数据结构

--课件11.3.1 系统底层数据结构

-11.4 登录模块实现

--11.4.1 系统登录、注册模块

--课件11.4.1 系统登录、注册模块

-11.5 学生管理模块实现

--11.5.1 从登录窗体获得用户身份

--课件11.5.1 从登录窗体获得用户身份

--11.5.2 一个窗体,两个计时器

--课件11.5.2 一个窗体,两个计时器

--11.5.3 学生管理模块——选课?退课?

--课件11.5.3 学生管理模块——选课?退课?

--11.5.4 学生管理模块——个人信息模块

--课件11.5.4 个人信息模块

--11.5.5 集成选课管理模块

--课件11.5.5 集成选课管理模块

-11.6 教学管理模块实现

--11.6.1管理员客户端

--课件11.6.1 管理员客户端

-11.7 系统测试与发布

--11.7.1 让你的信息系统脱离数据库界面

--课件11.7.1 让你的信息系统脱离数据库界面

-本章小结

--第十一章小结

-课程综合设计

综合练习题库

-综合练习题库

技术分享贴:如何在数据库中保存大量图片笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。