暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

VBA与数据库——ADO

VBA 学习 2021-07-30
2704



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方法来连接数据库,只有连接成功了才能去操作数据库。

    Set AdoConn = New ADODB.Connection
    AdoConn.Open Provider字符串

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

    Recordset

    ADO读取数据库的数据,不管是使用ConnectionExcuteRecordsetOpenCommandExcute,都是读取到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

    • ConnectionExecute执行sql语句,update、insert等不需要返回数据的执行完了就结束

    • select语句执行后就需要去操作Recordset

    • 如果是重复执行某些操作,就换成Command去处理


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





    文章转载自VBA 学习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论