Microsoft Access(mdb):列出连接的Oracle表

时间:2018-09-24 08:16:14

标签: oracle ms-access database-connection adox

我们正在Oracle ERP环境中进行开发。有相当多的视图遗留的MDB数据库(数十个),这些视图已与Oracle视图(数百个依赖项)结合在一起。在Oracle中,有一个自定义的800多个视图,这些视图会被修改,设置为已弃用并且将来可能会被删除。

我可以在MDB-Design视图中看到连接的Oracle DB,但是我需要将这些依赖关系写入列表中。有了这样的清单,我可以完成上面概述的软件维护工作。

我有一个基于ADOX的Metadata-Reader,但这没有列出oracle表:

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表。 也许我只需要更改连接字符串?我如何知道正确的连接字符串?我可以在运行MDB的计算机中的某处读取它吗? 您能提供解决方案吗?

这是示例情况的屏幕截图:

enter image description here

我需要列出的表格以绿色标记。

关于LPNO,

附加信息 n 根据Erik的要求,这里是

创建的MSYSOBJECTS表的相关列的摘录
SELECT MSysObjects.Connect, MSysObjects.ForeignName, MSysObjects.Name, MSysObjects.Type INTO Extract_MSYSOBJECTS
FROM MSysObjects
WHERE (((MSysObjects.Connect) Is Not Null));

enter image description here

实际上,“ NAME”列已经列出了我寻找的信息。无论如何,还是要对VBA编码方法表示赞赏,因为有很多mdb数据库需要检查。

2 个答案:

答案 0 :(得分:2)

请勿为此使用ADOX,而应使用DAO。

DAO是Access的本机,可以更轻松地使用链接表。

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也可以通过查询或直接从代码连接到表/视图,这些都不会列出。您可以迭代querydefs来查找查询,但是对于代码而言,它将复杂得多。

使用MSysObjects表的替代方法:

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

答案 1 :(得分:0)

四处搜寻,我发现此MDB-Query完全符合我的要求:

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;