Microsoft Access (mdb): список подключенных таблиц Oracle - PullRequest
0 голосов
/ 24 сентября 2018

Мы разрабатываем в среде Oracle ERP.Существует довольно много представлений баз данных MDB (десятки), которые допущены к представлениям Oracle (сотни зависимостей).В Oracle существует более 800 пользовательских представлений, которые подлежат переработке, устарели и, возможно, будут удалены в будущем.

Я вижу подключенную БД Oracle в представлении MDB-Design, но мне нужно записать эти зависимости в список.С таким списком я мог бы выполнить работу по сопровождению программного обеспечения, описанную выше.

У меня есть считыватель метаданных на основе ADOX, но в нем нет таблиц оракулов:

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

В любом случае это происходитне перечислять связанные таблицы оракула.Может мне просто поменять строку подключения?Как мне узнать правильную строку подключения?Могу ли я прочитать это где-нибудь на компьютере, на котором работает MDB?Можете ли вы предоставить решение?

Это снимок экрана примера ситуации:

enter image description here

Таблицы, которые мне нужно перечислить, отмечены зеленым.

regards, LPNO

Дополнительная информация n по запросу Эрика, вот выдержка из соответствующих столбцов таблицы 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 голосов
/ 08 ноября 2018

В поисках я обнаружил, что этот 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;
0 голосов
/ 24 сентября 2018

Не используйте 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
...