【问题标题】:Microsoft Access (mdb) : List connected Oracle tablesMicrosoft Access (mdb):列出连接的 Oracle 表
【发布时间】:2019-02-27 17:13:47
【问题描述】:

我们正在 Oracle ERP 环境中开发。有相当多的视图遗留 MDB 数据库(数十个)与 Oracle 视图(数百个依赖项)相连。在 Oracle 中有一个自定义的 800 多个视图,这些视图可能会被重新设计,设置为不推荐使用,并且将来可能会被删除。

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

我有一个基于 ADOX 的元数据阅读器,但它没有列出 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 的计算机的某处读取它吗? 你能提供一个解决方案吗?

这是一个示例情况的截图:

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

问候,LPNO

插件信息n 应 Erik 的要求,这里是 MSYSOBJECTS 表的相关列的摘录,使用

创建
SELECT MSysObjects.Connect, MSysObjects.ForeignName, MSysObjects.Name, MSysObjects.Type INTO Extract_MSYSOBJECTS
FROM MSysObjects
WHERE (((MSysObjects.Connect) Is Not Null));

实际上 NAME 列已经列出了我查找的信息。无论如何,VBA 编码方法仍然会受到赞赏,因为有许多 mdb 数据库需要检查。

【问题讨论】:

    标签: oracle ms-access database-connection adox


    【解决方案1】:

    不要为此使用 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
    

    【讨论】:

    • 嗨,Erik,我首先尝试了这种方法。这不起作用!它没有列出连接到 microsoft access 的外部表。它只是列出内部 mdb 表。
    • @olippuner 当然可以。我已经测试过了。如前所述,您可以通过不同方式连接到表。
    • 我在上面添加了一个截图。以绿色标记的表格未按照您建议的方法列出。请记住,这些表只是连接的,它们并不驻留在 MS-Access 中。
    • 从那张截图我看不出什么。如果您提供 MSysObjects 表的转储(或引用这些表的相关行),我可能会提供更多信息(通过转到导航选项并检查显示系统对象来显示该表)
    • 嗨,Eric,我添加了您在上面要求的插件信息。
    【解决方案2】:

    四处搜索我发现这个 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多