VBA中连接数据库

前言

数据库的重要性无需多说,稍微正式或复杂一点的应用都需要操纵数据库读写数据。当然这里主要说的是关系数据库,常见的数据库有MS Access (是的, Access是一款桌面性关系数据库)、MS SQL Server、IBM DB2、Oracle等等。
从连接方式上,也分好多种,比如ODBC、ADODB等等。
听起来很复杂,但是实际上在VBA里连接数据库是非常简单的。这里我们介绍结构比较清晰的ADODB,它实际上是通用的,在其它语言里也是一样的用法。

ADODB

关于ADODB概念性的东西,网上有很多资料,就不多介绍了。 这里着重介绍使用。

ADODB使用前的准备

如之前多次介绍,对于各种对象,初学者最简单的办法的先在Reference里引用它。选择"Microsoft ActiveX Data Objects Library", 有很多个版本,不用太纠结,对于日常的简单应用,哪个版本都差不多。
ADODB引用

ADODB的2个核心概念

对ADODB, 有2个非常重要的对象:

  • Connection
    顾名思义, Connection对象建立并维持与目标数据库的连接。要想使用一个数据库,要做的第一件事就是"连接"这个数据库
  • Recordset
    通常连接数据库的目的,是为了读取数据或是写入数据。而取得数据,也就是"记录", 就是通过Recordset来访问。

当然还有Command、Error等其它重要对象,但是对于普通的小项目,学会使用Connection和Recordset 就够用了。

ADODB 读取数据三步曲

  1. 第一步:创建所需的Connection和Recordset对象
  2. 第二步: 使用Connection对象连接上数据库
  3. 第三步: 使用Recordset对象取得数据
Sub Test()
  '第一步: 创建对象
    Dim objConnection As New ADODB.Connection
    Dim objRecordset As New ADODB.Recordset
    
    '第二步: 连接数据库,一次性工作
    With objConnection      '设置参数
        .CursorLocation = adUseClient
        .ConnectionTimeout = 120
        .Provider = "SQLOLEDB"
        .ConnectionString = "Data Source=<myDataSource>;Network Library=DBMSSOCN;Initial Catalog=<Initial Catalog>;User ID=<User Name>;Password=<Password>"
        .Open
    End With
    
    '第三步: 读取数据, 假定数据库里有张表叫User_Table
    '以下设置是一次性的
    With objRecordset
        .ActiveConnection = objConnection
        .CursorLocation = adUseClient
        .LockType = 3
        .CursorType = 1
    End With
    
    '以下代码每读一次数据都需要用一次
    If objRecordset.State = 1 Then objRecordset.Close  '如果Recordset对象已经处于open状态,则关闭它
    objRecordset.Open ("SELECT * FROM User_Table")
End Sub

连接字符串

整个过程中,最重要的是连接字符串。上述示例中使用了With语句,也可以不使用With,而直接将Provider一起写进连接字符串。

objConnection.Open("Provider = "SQLOLEDB"; Data Source=<myDataSource>;Network Library=DBMSSOCN;Initial Catalog=<Initial Catalog>;User ID=<User Name>;Password=<Password>")

这里Open()方法中的参数就是连接字符串。显然它由几个固定的部分组成。
Provider是最重要的,不同的数据库有不同的Provider:

  • SQL Server: SQLOLEDB
  • AS400: IBMDA400.DataSource.1
  • Ms Access / Excel: Microsoft.ACE.OLEDB.12.0

连接Access和Excel通常只需要提供Provider和Data Source就够了。(Excell连接如果失败可以尝试多提供一个Excel版本参数"Extended Properties=Excel 12.0;")

'Access
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Temp\Test.accdb" )
'Excel, 注意Data Source需要完整的路径与文件名
objConnection.Open("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0; Data Source= C:\Temp\Test.xlsx"

连接Excel,将worksheet做数据源的特别事项

  • 如果 连接VBA运行的这个workbook, 可以使用ThisWorkbook.FullName取得完整路径及文件名:

    objConnection.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0; Data Source= " & ThisWorkbook.FullName)
    
  • 一个Excel可以有多张worksheet, 相当于数据库中的多张表。将数据表名和列范围用[]括起来,下例中将Sheet2从B列到C列,第2行到第30行做为数据源。注意第一行会被认为是标题行

    objRecordset.Open ("SELECT * FROM[Sheet2$B2:C30]")
    

    如果将整张worksheet做为数据源,那么无需要指定行列信息

    objRecordset.Open ("SELECT * FROM[Sheet2$]")
    

    空行是不会被统计的,如上例中,虽然查询的是B2:C30, 但是实际只有3行有效数据,返回的数据也只有3行。
    在这里插入图片描述在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_54284125/article/details/120605727