6

封装 ADODB 数据库查询的 Excel VBA 类模块

 3 years ago
source link: https://zhiqiang.org/coding/excel-adodb-class-module.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

封装 ADODB 数据库查询的 Excel VBA 类模块

作者: 张志强

, 发表于 2012-09-28

, 共 1513 字 , 共阅读 0 次

系列:办公自动化

查看该系列所有文章

2014-03-25 更新:我已经将该类修改成函数形式,并增加新功能,参见更新 Excel 的数据库查询函数库

关于 Excel 操纵数据库,我在前面至少写过两篇相关文章:如何利用 Excel 的数据源功能实现多表合并和 SQL 查询以及如何动态修改 Excel 数据源的数据来源和数据源的查询语句。这里再放出一个我平常使用的封装 ADODB 数据库查询的 Excel VBA 类模块。

[download name="Excel 数据库操作类.xlsm"]

上面这个文件里有类模块 Database ,以及一个示例。这里简单介绍这个数据库类的使用方法。在使用之前,先需要声明一个类实例

dim db as New Database

然后再如以下方式使用:

db.QueryToCell sql, connection_string, excel_range

其中参数 sql 是数据库查询语句, excel_range 是 Excel 文件的一个单元格对象(即 Range("A1")这样的)。需要重点拿出来说的是 connection_string(连接字符串),这个参数告诉函数所需要查询的数据库的信息。比如普通的 SQL 数据库的 connection_string 长下面这个样:

"driver={SQL Server};server=ip;uid=username;pwd=password;database=database_name;"

比如如果数据源是 Excel 文件,那么使用下面这个 connection_string :

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=filename;Extended Properties=Excel 12.0;"

类模块内置了该连接字符串。如果省略 connection_string 参数,函数将默认使用本 Excel 文件作为数据源。此时数据表可以是以下形式:

  • 通过名称引用。比如如果定义一个数据区域为 Industry ,那么select * from industry这样是可行的。这种方法最多支持 65535 行数据,当数据行数过多时, Excel 会提示找不到该数据表。同一张工作表里可以有多个数据表,通过定义不同的名称去引用。
  • 通过工作表名引用。比如一个工作表名为 Quotes ,那么select * from `Quotes$`这样是可行的。这里工作表名后面的 \$号表示这是一个工作表。工作表可以包含高达 100 万行数据。但同一个工作表内只能有一个数据表。
  • 可以通过数据表的地址进行引用。比如select * from `Quotes$A1:B10000`
  • 上面的引号可以用中括号代替。比如select * from [Quotes$A1:B10000]
  • 如果数据表不在目前工作的文件内,需要在上面的数据表名前添加数据文件的路径和文件名,比如select * from `D:\test.xlsx`.`Quotes$`

另外,该类模块还包括下面两个函数,用来获取数据在 VB 函数内部进行处理。下面这个函数返回二维数组:

res_array = db.QueryToArray(sql, connection_string);

下面这个函数返回单个结果(非数组),如果数据库查询返回多个结果或多个字段,只有最左上方的字段结果会保留,其余字段和结果全被丢弃:

res_single = db.QueryOne(sql, connection_string);

Q. E. D.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK