Как можно искать TableDefs для связанных таблиц?
цикл через набор TableDefs, как можно определить, представляет ли каждый TableDef связанную таблицу, в отличие от локальной таблицы?
2 ответов
для связанной таблицы, тег TableDef.Connect
свойство содержит сведения о соединении. Но для родной таблицы .Connect
свойство является пустой строкой.
таким образом, вы можете сказать, какие из них, изучая Len()
of .Connect
Dim tdf As DAO.TableDef
With CurrentDb
For Each tdf In .TableDefs
If Len(tdf.Connect) > 0 Then
Debug.Print tdf.Name, tdf.Connect
End If
Next
End With
этот подход мне проще запомнить, чем tdf.Attributes And dbAttachedODBC Or tdf.Attributes And dbAttachedTable
, или подход ADOX. Он также намного более лаконичен, чем подход ADOX.
на основе http://p2p.wrox.com/access-vba/37117-finding-linked-tables.html (связанный код привел к бесконечному циклу, поэтому я изменил его):
Dim tdf As DAO.TableDef
With CurrentDb
For Each tdf In .TableDefs
If tdf.Attributes And dbAttachedODBC Or tdf.Attributes And dbAttachedTable Then
' We found a linked table! Now, show its location.
Debug.Print tdf.Connect
End If
Next
End With
взято непосредственно из http://p2p.wrox.com/access-vba/37117-finding-linked-tables.html, аналог ADO (непроверенный код):
Sub ListAllTables(cnn As ADODB.Connection)
Dim cat As ADOX.Catalog
Dim tbl As ADOX.Table
Set cat = New ADOX.Catalog
cat.ActiveConnection = cnn
cat.Tables.Refresh
For Each tbl In cat.Tables
Select Case tbl.Type
Case "ACCESS TABLE"
Debug.Print tbl.Name & " - Access table"
Case "SYSTEM TABLE"
Debug.Print tbl.Name & " - System table"
Case "TABLE"
Debug.Print tbl.Name & " - Native table"
Case "LINK"
Debug.Print tbl.Name & " - Linked table"
Case "PASS-THROUGH"
Debug.Print tbl.Name & " - ODBC DSN Linked table"
End Select
Next tbl
Set tbl = Nothing
Set cat = Nothing
End Sub