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。
至于其他的数据库类型,因为个人较少使用,所以也没有去测试。