【问题标题】:Generate a list of all fields in MDB by table按表生成MDB中所有字段的列表
【发布时间】:2013-06-28 17:22:13
【问题描述】:

我有一个保存应用程序设置的 MDB。有时我们使用 SQL 命令更改这些设置。我们经常需要查找数据库中的哪个表包含我们正在寻找的设置,以便构建我们的 SQL 字符串。我们有时不知道该字段的名称,但通常可以通过阅读它们来判断。这非常耗时。

我正在尝试找到一种生成列表的方法(在 excel、access、记事本、读取 MDB 并返回表列表以及每个表的每个字段的任何内容中。(以便可搜索)

类似这样的:

Table1  |  Field1 
Table1  |  Field2 
Table1  |  Field3 
Table2  |  Field1 
Table2  |  Field2 
Table3  |  Field1 
Table3  |  Field2 
Table3  |  Field3 
Table4  |  Field1 
Table4  |  Field2 
...

有谁知道使用 access、excel 甚至一些 vb.net 代码的快速方法? (除了打开每个表并复制字段名称。

我希望将其自动化,以防我们将来添加字段。

【问题讨论】:

    标签: excel ms-access


    【解决方案1】:

    没有必要创建RecordSet,因为TableDef 已经包含Fields 集合,您可能希望忽略系统表。

    以下(访问 VBA 代码)将信息打印到即时窗口;使用 Ctrl-G 查看(从 VB 编辑器)并复制和粘贴。或者,将数据发送到 Access 表或 Excel。

    Sub GetTablesAndFields()
        Dim db As DAO.Database
        Dim td As DAO.TableDef
        Dim fld As DAO.Field
    
        Set db = CurrentDb
        For Each td In db.TableDefs
            If UCase(Left(td.Name, 4)) <> "MSYS" Then
                'ignore system tables
                'Press Ctrl-G to display the Debug (Immediate) Window
                For Each fld In td.Fields
                    Debug.Print td.Name, fld.Name
                Next fld
            End If
        Next td
        Set db = Nothing
    End Sub
    

    使用Debug.Print td.Name; " | "; fld.Name 生成OP 中建议的显示。

    【讨论】:

    • 这是一个更好的答案;我不知道TableDef.Fields 属性。
    • @sigil 谢谢。还有Database Documenter,它会产生更多细节,但最初是作为报告。在 Access 2010(也可能是 2007?)中,我们可以单击“选项”来显着减少它产生的细节量。我不记得这些选项在 Access 2003 中是否可用。
    • 我喜欢这个答案,但我不确定它是否适合我,有一些细节我没能给出足够的重视,因此没有提及。我使用的数据库是 Access 97 格式,但我只能访问 v. 2007 和 2010(我想我可以挖掘 97,但我正在寻找更少的工作)。本来想升级数据库的,但是遇到了问题,在access 97 mdb中不能添加任何VBA。我喜欢这个答案的简单性,但我想我可能不得不选择@barrowc 的答案,因为它是基于 excel 的。还没有尝试。
    【解决方案2】:

    您可以通过遍历CurrentDb.TableDefs 来获取表列表。这是在 VBA 中处理它的一种方法,.NET 将类似:

    sub goThroughTables()
    
    dim tdf as TableDef
    dim rs as DAO.Recordset
    dim fld as Field
    dim index as long
    
    index=1
    
    
    for each tdf in currentdb.tabledefs
     set rs=currentdb.openrecordset(tdf.name)
     for each fld in rs.Fields
       writeToExcelSheet(tdf.name,fld.name,index)
     next
    next
    
    end sub
    

    其中writeToExcelSheet() 是一个函数,它将表名和字段名写入由index 指定的Excel 工作表中的行,应通过ByRef 传递,以便您可以更改writeToExcelSheet() 中的值。

    【讨论】:

    • 我假设这个 VBA 会进入 Access 对吗?这可能很明显,但只是想我会检查一下。
    • 它可以进入 Access 或 Excel。如果你把它放在 Excel 中,而不是使用 CurrentDb,你将拥有一个声明为 Dim myDb as DAO.Database 的变量并使用例如 set myDb=opendatabase("c:\thisFolder\myDb.accdb") 为其赋值。您需要添加对 Microsoft Access 数据库引擎的引用。如果您仍然卡住,请告诉我,我可以发布修改后的代码。
    【解决方案3】:

    在 VBA 中,您可以使用 ADO Connection 对象及其 OpenSchema 方法。这使您可以将许多不同的属性读入 Recordset,然后您可以将其复制到 Excel 工作表中。

    可以列出哪些属性的详细信息是here。使用adSchemaColumns 列出字段及其来自的表。

    在 Excel 中,使用 Tools > References 设置对“Microsoft ActiveX Data Objects 2.8 Library”的引用,然后尝试以下代码:

    Sub show_column_info()
    
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim fld As ADODB.Field
    Dim i As Integer
    
    Set cn = New ADODB.Connection
    
    With cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source='C:\Temp\Example Database.mdb';"
        .Open
    
        Set rs = .OpenSchema(adSchemaColumns)
    End With
    
    i = 0
    With Worksheets("Sheet1")
        .Cells.ClearContents
    
        For Each fld In rs.Fields
            i = i + 1
            .Cells(1, i).Value = fld.Name
        Next fld
    
        .Cells(2, 1).CopyFromRecordset rs
    
        .Cells.Columns.Autofit
    End With
    
    rs.Close
    cn.Close
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      相关资源
      最近更新 更多