Microsoft Access (mdb):列出连接的 Oracle 表
Microsoft Access (mdb) : List connected Oracle tables
我们在Oracle ERP环境下开发。有相当多的视图遗留 MDB 数据库(数十个)连接到 Oracle 视图(数百个依赖项)。在 Oracle 中有一个自定义的 800 多个视图,这些视图可能会被重新设计、设置为弃用并且将来可能会被删除。
我可以在 MDB-Design 视图中看到连接的 Oracle DB,但我需要将这些依赖项写入列表。有了这样的列表,我就可以完成上面概述的软件维护工作了。
我有一个基于 ADOX 的元数据-Reader,但这没有列出 oracle tables:
Public Sub ADOX_Oracle_Metadata()
'To reference ADO from Microsoft Access
'In Microsoft Access, select or create a module from the Modules tab in the Database window.
'On the Tools menu, select References....
'Verify that at least the following libraries are selected:
'
'Microsoft ActiveX Data Objects x.x Library
'ADO Ext. 2.7 for DDL and Security (ADOX)
'
Dim cn As ADODB.Connection
Dim ct As ADOX.Catalog
Dim tb As ADOX.Table
Dim strDB As String
Dim ws As Worksheet
Set cn = New ADODB.Connection
Set ct = New ADOX.Catalog
strDB = "L:\Applikationen\Access\DepreciationOutputMail.mdb"
cn.ConnectionString = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & strDB & ";"
cn.Open
Set ct.ActiveConnection = cn
For Each tb In ct.Tables
' Tables can be of type TABLE, ACCESS TABLE, SYSTEM TABLE or VIEW
Debug.Print tb.Type & " " & tb.Name
Next tb
cn.Close
Set ct = Nothing
Set cn = Nothing
End Sub
无论如何,这不会列出连接的 oracle tables。
也许我只需要更改连接字符串?我怎么知道正确的连接字符串?我可以在运行 MDB 的计算机中的某个地方读取它吗?
你能提供解决方案吗?
这是示例情况的屏幕截图:
我需要列出的 table 标记为绿色。
此致,LPNO
插件信息n
应 Erik 的要求,这里是 MSYSOBJECTS table 的相关列的摘录,使用
创建
SELECT MSysObjects.Connect, MSysObjects.ForeignName, MSysObjects.Name, MSysObjects.Type INTO Extract_MSYSOBJECTS
FROM MSysObjects
WHERE (((MSysObjects.Connect) Is Not Null));
实际上,NAME 栏已经列出了我查找的信息。无论如何,VBA 编码方法仍然会受到赞赏,因为有许多 mdb 数据库需要对此进行检查。
不要为此使用 ADOX,而是使用 DAO。
DAO 更适合 Access,可以更轻松地使用链接的 table。
Dim db As DAO.Database
Dim td As DAO.TableDef
Set db = DBEngine.OpenDatabase("L:\Applikationen\Access\DepreciationOutputMail.mdb")
For Each td In db.TableDefs
Debug.Print td.Name; td.SourceTableName, td.Connect
Next
请注意,Access 也可以通过查询或直接从代码连接到 tables/views,这些不会列出。您可以迭代 querydefs 来查找查询,但对于代码来说,它会复杂得多。
使用 MSysObjects 的替代方法 table:
Dim db As DAO.Database
Set db = DBEngine.OpenDatabase("L:\Applikationen\Access\DepreciationOutputMail.mdb")
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset("SELECT * FROM MSysObjects WHERE Type = 4")
Do While Not rs.EOF
Debug.Print rs!Name; rs!ForeignName
rs.MoveNext
Loop
四处搜索,我发现这个 MDB 查询完全符合我的要求:
SELECT MSysObjects.Name, MSysObjects.Type, MSysObjects.Flags
FROM MSysObjects
WHERE (((MSysObjects.Type)=6) AND ((MSysObjects.Flags)=2097152)) OR (((MSysObjects.Type)=1) AND ((MSysObjects.Flags)=0))
ORDER BY MSysObjects.Flags;
我们在Oracle ERP环境下开发。有相当多的视图遗留 MDB 数据库(数十个)连接到 Oracle 视图(数百个依赖项)。在 Oracle 中有一个自定义的 800 多个视图,这些视图可能会被重新设计、设置为弃用并且将来可能会被删除。
我可以在 MDB-Design 视图中看到连接的 Oracle DB,但我需要将这些依赖项写入列表。有了这样的列表,我就可以完成上面概述的软件维护工作了。
我有一个基于 ADOX 的元数据-Reader,但这没有列出 oracle tables:
Public Sub ADOX_Oracle_Metadata()
'To reference ADO from Microsoft Access
'In Microsoft Access, select or create a module from the Modules tab in the Database window.
'On the Tools menu, select References....
'Verify that at least the following libraries are selected:
'
'Microsoft ActiveX Data Objects x.x Library
'ADO Ext. 2.7 for DDL and Security (ADOX)
'
Dim cn As ADODB.Connection
Dim ct As ADOX.Catalog
Dim tb As ADOX.Table
Dim strDB As String
Dim ws As Worksheet
Set cn = New ADODB.Connection
Set ct = New ADOX.Catalog
strDB = "L:\Applikationen\Access\DepreciationOutputMail.mdb"
cn.ConnectionString = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & strDB & ";"
cn.Open
Set ct.ActiveConnection = cn
For Each tb In ct.Tables
' Tables can be of type TABLE, ACCESS TABLE, SYSTEM TABLE or VIEW
Debug.Print tb.Type & " " & tb.Name
Next tb
cn.Close
Set ct = Nothing
Set cn = Nothing
End Sub
无论如何,这不会列出连接的 oracle tables。 也许我只需要更改连接字符串?我怎么知道正确的连接字符串?我可以在运行 MDB 的计算机中的某个地方读取它吗? 你能提供解决方案吗?
这是示例情况的屏幕截图:
我需要列出的 table 标记为绿色。
此致,LPNO
插件信息n 应 Erik 的要求,这里是 MSYSOBJECTS table 的相关列的摘录,使用
创建SELECT MSysObjects.Connect, MSysObjects.ForeignName, MSysObjects.Name, MSysObjects.Type INTO Extract_MSYSOBJECTS
FROM MSysObjects
WHERE (((MSysObjects.Connect) Is Not Null));
实际上,NAME 栏已经列出了我查找的信息。无论如何,VBA 编码方法仍然会受到赞赏,因为有许多 mdb 数据库需要对此进行检查。
不要为此使用 ADOX,而是使用 DAO。
DAO 更适合 Access,可以更轻松地使用链接的 table。
Dim db As DAO.Database
Dim td As DAO.TableDef
Set db = DBEngine.OpenDatabase("L:\Applikationen\Access\DepreciationOutputMail.mdb")
For Each td In db.TableDefs
Debug.Print td.Name; td.SourceTableName, td.Connect
Next
请注意,Access 也可以通过查询或直接从代码连接到 tables/views,这些不会列出。您可以迭代 querydefs 来查找查询,但对于代码来说,它会复杂得多。
使用 MSysObjects 的替代方法 table:
Dim db As DAO.Database
Set db = DBEngine.OpenDatabase("L:\Applikationen\Access\DepreciationOutputMail.mdb")
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset("SELECT * FROM MSysObjects WHERE Type = 4")
Do While Not rs.EOF
Debug.Print rs!Name; rs!ForeignName
rs.MoveNext
Loop
四处搜索,我发现这个 MDB 查询完全符合我的要求:
SELECT MSysObjects.Name, MSysObjects.Type, MSysObjects.Flags
FROM MSysObjects
WHERE (((MSysObjects.Type)=6) AND ((MSysObjects.Flags)=2097152)) OR (((MSysObjects.Type)=1) AND ((MSysObjects.Flags)=0))
ORDER BY MSysObjects.Flags;