当前位置:首页 > 问答 > 正文

VB里怎么搞图片数据库读取,文件那些东西咋弄才对?

(来源:VB6编程爱好者常见问题汇总)

VB6里头处理图片数据库,说白了就是两件事:一是怎么把图片塞进数据库里,二是怎么再把它完好无损地取出来显示在界面上,很多人觉得这个挺难的,主要是没搞清楚图片在数据库里其实不是直接存成你看的的样子,而是存成一长串二进制数据,下面我就用最直白的方式,一步一步跟你说清楚该怎么弄。

先把数据库表设计对

(来源:基于ADO控件操作数据库的通用方法) 你想存图片,首先得在数据库里给图片安个“家”,比如用Access数据库,你新建一个表,里面得有一个字段专门用来放图片,这个字段的类型特别重要,不能选“文本”或者“数字”,得选叫“OLE对象”的类型(在Access里叫这个,在SQL Server里可能叫imagevarbinary(max)),你就把它想象成一个能装下任何二进制大数据的“大桶”,图片、文档都能往里扔,除了这个图片字段,你最好再设一个ID字段或者图片名字段,这样以后找起来方便。

把图片存进数据库的关键步骤

(来源:通过ADO Stream对象处理BLOB数据) 光有表还不行,怎么把硬盘上的.jpg、.bmp文件变成数据存进去呢?这里有个好用的工具叫Stream对象(属于ADO库),你把它想象成一个水管,一头接着文件,另一头对着数据库字段。

具体做法是:

  1. 先打开你的数据库连接(Connection)和记录集(Recordset)。
  2. 然后创建一个Stream对象,设置它的类型为二进制(adTypeBinary)。
  3. 用这个Stream的LoadFromFile方法,把你电脑上图片文件的完整路径告诉它,比如"C:\MyPic.jpg",这一步就像打开水龙头,把文件里的二进制数据“吸”到Stream这个“水管”里来了。
  4. 在记录集里添加一条新记录,把Stream对象的.Read方法读出来的全部数据,直接赋值给记录集里那个“OLE对象”字段。
  5. 调用记录集的.Update方法,就把数据真正保存到数据库里了。

要点:这个过程就像搬家,图片文件是家具,Stream是搬运工,它把家具拆成零件(二进制数据),运到新家(数据库字段)再原样拼装回去。

把图片从数据库读出来显示

(来源:使用PictureBox或Image控件显示数据库图片) 存进去不是目的,能完美地显示出来才算成功,读出来的过程,基本上是存进去的逆操作。

  1. 同样是先连接数据库,用SQL语句查询到你要的那条记录。
  2. 关键一步,检查这个图片字段是不是空的(用IsNull函数),如果是空的,你硬要读就会出错。
  3. 如果不是空的,再请出我们的功臣Stream对象,新建一个Stream,类型还是二进制。
  4. 这次是把记录集里图片字段的数据,用.Write方法“灌”进Stream对象里。
  5. 让Stream把“水管”里的数据,用.SaveToFile方法临时保存到你电脑的某个地方,比如临时文件夹里的一个临时文件。为什么要多这一步? 因为VB6里常见的图片显示控件(如PictureBox、Image)它们有个特点:大多数情况下只认识硬盘上的图片文件路径,不太会直接处理二进制数据流,所以我们需要先把它还原成一个临时文件。
  6. 把你得到的这个临时文件的路径,赋值给PictureBox控件的.Picture属性,或者Image控件的.Picture属性,图片就显示出来了。

一个常见的坑和解决办法: (来源:处理资源释放和临时文件清理) 你可能会想,老是生成临时文件,电脑硬盘不就塞满了?对的,所以显示完图片后,等程序不需要用了,记得用Kill语句把这个临时文件删除掉,这是个好习惯,用完了的Stream对象、Recordset对象、Connection对象,都要记得用.Close方法关闭,释放资源。

另一种思路:存路径而不是存图片本身

(来源:基于项目规模和需求的权衡选择) 上面说的存二进制数据的方法,适合图片数量不多、单个图片不大,并且对数据库完整性要求很高的场景,但还有另一种更简单、更常见的办法,尤其适合图片非常多、图片文件很大的情况。

这个办法就是:不把图片本身塞进数据库,只在数据库里存下图片文件的路径,你在表里设一个“文本”类型的字段,里面就写"\Images\photo001.jpg"

这样做的好处非常明显:

  • 数据库变得很小,备份和运行速度都快。
  • 管理灵活,你直接去文件夹里复制、删除、替换图片文件,数据库里的路径不用动(如果文件名不变的话)。
  • 显示简单,读取到路径字符串后,直接把这个路径赋给PictureBox的.Picture属性就行了,省去了用Stream倒腾的麻烦。

但缺点也很突出:

  • 数据不完整,如果你把数据库拷贝到另一台电脑,忘了同时拷贝那个存图片的文件夹,程序就找不到图片了。
  • 管理麻烦,如果图片文件被移动了位置或者删除了,数据库里的路径就失效了,成了“死链接”。

选哪种方法,要看你的具体需求,如果图片是程序核心数据,不容丢失,那就辛苦点用存二进制的方法,如果图片只是辅助展示,数量庞大,那存路径会更方便。

在VB6里搞图片数据库,核心就是理解“二进制流”这个中间桥梁的作用,以及根据实际情况选择最合适的存储策略,多动手试几次,把流程走通,就会发现其实没那么神秘。

VB里怎么搞图片数据库读取,文件那些东西咋弄才对?