Мы развиваемся в среде 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

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

С уважением, 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, которые необходимо проверить по этому поводу.

0
olippuner 24 Сен 2018 в 11:16

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;
0
olippuner 8 Ноя 2018 в 08:29

Не используйте для этого 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 также может подключаться к таблицам / представлениям через запросы или напрямую из кода, они не будут перечислены. Вы можете перебирать querydef для поиска запросов, но для кода это будет значительно сложнее.

Альтернативный подход с использованием таблицы 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
2
Erik A 24 Сен 2018 в 14:57