如题,注意要求是用户数据表。
我的下面的方法不行:
for each tb in db.tabledefs
    debug.print tb.name
next

解决方案 »

  1.   

    类似这样!自己改改
    Option ExplicitPrivate Const strConnstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    Public conn As ADODB.ConnectionPrivate DBPath As String
    Private Sub Command1_Click()
        If init() = False Then
            Exit Sub
        End If
        
        Dim a As Boolean
        
        a = IsExistTable("E0102")
        
    End Sub'CONN
    Private Function ConnToAccess(ByVal DBStr As String) As Boolean
        ConnToAccess = True
        
        'EXIST DB
        If Dir(DBStr) = "" Then
            MsgBox DBStr & " IS NOT EXIST", vbCritical, "DB Exists"
            Exit Function
        End If
        
        Set conn = New ADODB.Connection
        conn.ConnectionString = strConnstr & DBStr
        conn.Open
        conn.BeginTrans
        
        ConnToAccess = False
    End Function
    Private Function init() As Boolean
        init = False
        
        DBPath = "D:\Mytest\MEDB.mdb"
        'CONN DB
        If ConnToAccess(DBPath) Then
            Exit Function
        End If
        
        init = True
    End Function
    Private Function IsExistTable(ByVal table As String) As Boolean
        Dim Rs As ADODB.Recordset
        Set Rs = CreateObject("ADODB.RECORDSET")
        Set Rs = conn.OpenSchema(adSchemaTables)
        Do Until (Rs.EOF)
            If (UCase(Rs!TABLE_NAME) = UCase(table)) Then
                IsExistTable = True
                Exit Function
            End If
            Rs.MoveNext
        Loop
        IsExistTable = False
    End Function
      

  2.   

    '************************************************** 方法 1
    '要引用Microsoft DAO 3.6Public Sub enumdatabase(dbpath As String)
       Dim db As Database
       Set db = dbengine.OpenDatabase(dbpath)
       Dim Tables As TableDef, fld
       For Each Tables In db.tabledefs
          '这里可以取得表名Tables.name
          'For Each fld In Tables.Fields
             If Left(Tables.Name, 4) <> "MSys" Then Print Tables.Name '& "---" & fld.Name
             '这里可以取得字段名fld.name
          'Next fld
       Next Tables
       db.Close
       Set db = Nothing
    End Sub'************************************************** 方法 2 ADODB
    '引用 Microsoft ADO Ext 2.5 for ddl and security
    '引用 Microsoft ActiveX Data Objects 2.5 LibraryPrivate Sub Command1_Click()
       call OpenConnection
    End SubSub OpenConnection()
       Dim cnn As New ADODB.Connection
       Dim cat As New ADOX.Catalog
       cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= c:\bwscale.mdb;"
       Set cat.ActiveConnection = cnn
       For i = 0 To cat.Tables.Count - 1
          If Left(cat.Tables(i).Name, 4) <> "MSys" Then Print cat.Tables(i).Name
       Next i
    End Sub
    '******************************************************* 方法 3  ADODC
    '引用 Microsoft ADO Ext 2.5 for ddl and security
    '部件 Microsoft Ado Data Control 6.0(OLEDB)Private Sub Command1_Click()
       call OpenConnection
    End SubSub OpenConnection()
       Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "c:\bwscale.mdb;Persist Security Info=False"
       Dim cat As New ADOX.Catalog
       cat.ActiveConnection = Adodc1.ConnectionString
       For i = 0 To cat.Tables.Count - 1
          If Left(cat.Tables(i).Name, 4) <> "MSys" Then Print cat.Tables(i).Name
       Next i
       Adodc1.RecordSource = "select * from bwmain"
       Set DataGrid1.DataSource = Adodc1
    End Sub
      

  3.   

    是不是没有一个像oracle里面一样能直接取得userTable的方法?
      

  4.   

    方法 1  复制不全 补上Private Sub Command1_Click()
       Call enumdatabase("c:\bwscale.mdb")
    End Sub
      

  5.   

        Dim cn As Adodb.Connection
        Dim rs As Adodb.Recordset
        Dim n As Long
        Dim sql
        
        Set cn = New Adodb.Connection
        cn.Open "......"
        Set rs = cn.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "TABLE"))
        While Not rs.EOF
            Debug.Print rs!TABLE_NAME
            rs.MoveNext
        Wend
        Set rs = Nothing
        Set cn = Nothing
      

  6.   

    楼上这个很牛啊!估计可以达到效果,请教一下OpenSchema 的第二个可选参数的作用是什么?
      

  7.   


    这个最好查下ADO手册,参数常数太多,这儿贴的格式全不对,大概:OpenSchema方法,从提供者获取数据库模式信息。语法:Set recordset = connection.OpenSchema (QueryType, Criteria, SchemaID)返回值:返回包含模式信息的 Recordset 对象。Recordset 将以只读、静态游标打开。参数
    QueryType 所要运行的模式查询类型,可以为下列任意常量。Criteria  可选。每个 QueryType 选项的查询限制条件数组,如下所列:
    (格式不对,省略了...)SchemaID   OLE DB 规范没有定义用于提供者模式查询的 GUID。如果 QueryType 设置为 adSchemaProviderSpecific,则需要该参数,否则不使用它。
    说明OpenSchema 方法返回与数据源有关的信息,例如关于服务器上的表以及表中的列等信息。Criteria 参数是可用于限制模式查询结果的值数组。每个模式查询有它支持的不同参数集。实际模式由 IDBSchemaRowset 接口下的 OLE DB 规范定义。ADO 中所支持的参数集已在上面列出。如果提供者定义未在上面列出的非标准模式查询,则常量 adSchemaProviderSpecific 将用于 QueryType 参数。在使用该常量时需要 SchemaID 参数传递模式查询的 GUID 以用于执行。如果 QueryType 设置为 adSchemaProviderSpecific 但是没有提供 SchemaID,将导致错误。提供者不需要支持所有的 OLE DB 标准模式查询,只有 adSchemaTables、adSchemaColumns 和 adSchemaProviderTypes 是 OLE DB 规范需要的。但是对于这些模式查询,提供者不需要支持上面列出的 Criteria 条件约束。远程数据服务用法   OpenSchema 方法在客户端 Connection 对象上无效。注意   在 Visual Basic 中,在由 Connection 对象的 OpenSchema 方法所返回的 Recordset 中有 4 字节无符号整型 (DBTYPE UI4) 的列无法与其他变量比较。有关 OLE DB 数据类型的详细信息,请参阅“Microsoft OLE DB 程序员参考”的第十章和附录 A。