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去处理
其他更细致、高级的操作要随着使用的深入,对数据库的认识加深再逐步去学习。