VBA与数据库——写个类操作ADO_读取表名

2021-12-01 20:10:15 浏览数 (1)

ADO的Connection对象有一个OpenSchema方法,能够获取数据库的很多信息,比如表的名称等信息、字段的名称等信息,具体可以查看SchemaEnum枚举类型。

在操作数据库的过程中,很多时候会需要得到一些数据库的信息,这个时候就可以使用OpenSchema,在CADO里面增加一个最基础的获取表的名称的函数:

代码语言:javascript复制
Function GetTablesName(ret() As String) As Long
    On Error GoTo errHandle

    Dim rst As ADODB.Recordset
    Set rst = AdoConn.OpenSchema(adSchemaTables)
    
    Dim k As Long
    Do Until rst.EOF
        '过滤掉系统的一些表
        If rst.Fields("TABLE_TYPE").Value = "TABLE" Then
            ReDim Preserve ret(k) As String
            ret(k) = rst.Fields("TABLE_NAME").Value
            k = k   1
        End If
        
        rst.MoveNext
    Loop
    rst.Close
   
    Exit Function

errHandle:
    StrErr = Err.Description
    GetTablesName = RetCode.RetErr
End Function

上面的方法是通过循环读取Recordset的信息,再判断TABLE_TYPE,最后得到需要的表名,OpenSchema后面还有2个参数,再使用Restrictions进行一个简化处理:

代码语言:javascript复制
Function GetTablesName(ret() As String) As Long
    On Error GoTo errHandle

    Dim rst As ADODB.Recordset
    Dim Restrictions
    Restrictions = Array(Empty, Empty, Empty, "TABLE")
    Set rst = AdoConn.OpenSchema(adSchemaTables, Restrictions)
    
    ReDim ret(rst.RecordCount - 1) As String
    Dim k As Long
    Do Until rst.EOF
        ret(k) = rst.Fields("TABLE_NAME").Value
        k = k   1
        rst.MoveNext
    Loop
    rst.Close
   
    Exit Function

errHandle:
    StrErr = Err.Description
    GetTablesName = RetCode.RetErr
End Function

Restrictions参数的作用就是对Recordset的每一列设置一个筛选条件,TABLE_TYPE位于第4列,所以前面设置3个Empty。

这个函数可以很好的获取Access数据库的表名、Excel表格的Sheet名等,但sqlite数据库似乎不能够获取到,这可能是驱动程序的原因。

不过sqlite数据库可以使用其他方式来读取所需要的信息,并不一定要使用OpenSchema。

至于其他的数据库类型,因为个人较少使用,所以也没有去测试。

0 人点赞