VBA与数据库——ADO

2021-04-26 11:32:24 浏览数 (1)

ADO (ActiveX Data Objects,ActiveX数据对象)和字典Dictionary一样,就是Windows系统做好了的一个东西,是一种叫做COM对象的东西。

打开VBA编辑器,添加引用Microsoft ActiveX Data Objects 2.8(版本可能不同) Library。按F2打开对象浏览器看看它的属性、方法:

非常多,单看这个很难掌握!

建议可以看看《ADO编程技术》这本书,讲的挺详细的。

这里以自己的理解简单说说ADO:

Conection

操作数据库和操作文件类似,像Open读取文件里那样,首先就是要打开文件,获取一个指向文件的指针。

操作数据库也差不多,首先也得打开数据库,ADO里叫做连接数据库,首先New一个Connection类,然后调用Open方法来连接数据库,只有连接成功了才能去操作数据库。

代码语言:javascript复制
Set AdoConn = New ADODB.Connection
AdoConn.Open Provider字符串

然后就可以使用AdoConn,调用它的方法去执行sql语句来操作数据库。

Recordset

ADO读取数据库的数据,不管是使用Connection的Excute、Recordset的Open、Command的Excute,都是读取到Recordset这个类中,之后才能在VBA里进行进一步的操作。

所以,想对数据库读取到的数据进行更多的操作,必须要了解一下这个对象,Recordset的数据也可以想象是一个Excel表格,仍然是有行、列的,但是它不是直接使用行的索引来读取数据,而是内部有一个指针(这个指针我们无法直接操作),这个指针指向了当前行的数据,如果要处理其他行,必须使用Move、MoveNext等移动的操作去移动指针,只有指针指向的数据才能处理。

Excel VBA为了方便操作,在Range对象上实现了CopyFromRecordset 方法,方便使用者直接从Recordset对象中读取数据到单元格,这是Excel VBA使用ADO来操作数据库的一个方便之处,直接从Recordset对象中复制数据,不需要去写循环语句等操作处理。

Command

Command这个类的主要目的就是为了能够重复执行一个类似的操作,使用这个类要处理好Parameters,没接触过是有点不好理解的。

这种使用方式的一种场景是:

需要根据某个字段的值去数据库中查找数据,如果条件数据是在数据库中的,使用Left Join操作就可以,但是如果数据是在VBA的数组中,这时候就需要用到Command,每次循环都只需要改变条件字段的值就可以,可以加快数据库操作的速度。

举个自己理解的例子:

比如工人做零件,在做零件之前,需要打开机床,准备好工具、原材料等等,这些准备工作做好之后才能开始制作零件,如果他只做1个零件,那么做完这1个零件之后,他又要关闭机床,收拾好工具等才算完成了工作。

但是,如果他是做100个零件,那么,那些准备工作以及完工后的收拾的工作他不会傻到去做100遍,而只要做一次。

Command就是为了这种情况准备的,那些准备的工作只会做一遍,所以能够加快数据库操作的速度。

总结

初学者只要掌握一些简单的操作就可以,

  • 连接数据库得到Connection
  • Connection的Execute执行sql语句,update、insert等不需要返回数据的执行完了就结束
  • select语句执行后就需要去操作Recordset
  • 如果是重复执行某些操作,就换成Command去处理

其他更细致、高级的操作要随着使用的深入,对数据库的认识加深再逐步去学习。

0 人点赞