我有一个MDB,用于保存应用程序的设置。有时我们使用SQL命令更改这些设置。通常我们需要查找数据库中的哪些表包含我们正在寻找的设置以构建我们的SQL字符串。我们有时候不知道该字段的名称,但通常可以通过阅读它们来判断。这非常耗时。
我正在尝试找到一种生成列表的方法(在excel,access,notepad中,无论是什么读取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代码快速执行此操作的方法? (除了打开每个表并复制字段名称。
如果我们将来添加字段,我希望自动化它。
答案 0 :(得分:3)
没有必要创建RecordSet
作为TableDef
已包含Fields
集合,您可能希望忽略系统表。
以下(Access 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中建议的显示。
答案 1 :(得分: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传递,以便您可以更改{{1}中的值}}
答案 2 :(得分:1)
在VBA中,您可以使用ADO Connection
对象及其OpenSchema
方法。这使您可以将许多不同的属性读入Recordset
,然后您可以将其复制到Excel工作表中。
可列出的属性详情为here。使用adSchemaColumns
列出字段及其来源表。
在Excel中,使用工具&gt;引用设置对“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