Как я могу получить список полей и соответствующих таблиц, используемых в базе данных MS Access 2010?


3

Я знаю, что именно так вы получите список всех таблиц в базе данных (и даже больше, если вы измените критерии:

SELECT *
FROM MSysObjects
WHERE (((MSysObjects.Type)=1) AND ((MSysObjects.Flags)=0));

Но есть ли подобный способ получить список полей и к каким таблицам они принадлежат? Я думаю, что это было бы очень полезно для устранения неполадок и проведения быстрого аудита (т. Е. Ответа «в каких других таблицах используется это поле или группа полей»). Но по какой-то причине не смог найти ответ в интернете.

Если у кого-то есть относительно простой способ сделать это через VBA, это тоже может быть вариантом. Благодарю.


Вы специально ищете только SQL и / или VBA? Вы пробовали документацию базы данных?
CharlieRB

Решение SQL предпочтительнее, но если это невозможно, VBA подойдет. Документатор базы данных - это то, что я использую сегодня (с минимальными параметрами). Но я надеялся, что он будет в табличной форме (меньше шума), как при извлечении из MSysObjects (как показано в моем примере).
daniellopez46

Ответы:


5

К сожалению, имена полей не доступны через хороший, компактный SQL-запрос. Этот код напечатает имя таблицы и каждое поле в отдельной строке в окне отладки.

Private Sub ShowTableFields()

Dim db As Database
Dim tdf As TableDef
Dim x As Integer

Set db = CurrentDb

For Each tdf In db.TableDefs
   If Left(tdf.Name, 4) <> "MSys" Then ' Don't enumerate the system tables
      For x = 0 To tdf.Fields.Count - 1
      Debug.Print tdf.Name & "','" & tdf.Fields(x).Name
      Next x
   End If
Next tdf
End Sub

Спасибо за предоставление этого VBA. Но я попытался запустить его и получил ошибку в строке отладки. Должен ли я что-то изменить до запуска? Я вижу первый параметр в левой функции "tbl_Name" и не вижу, где это определено. Я предполагаю перезаписать это, и тогда это действительно работает только с одной таблицей за раз?
daniellopez46

Я исправил код - tbl_Nameдолжен был прочитать tdf.Name. Debug.Printследует просто отправить вывод в ближайшее окно
SeanC

Я скопировал и вставил ваш отредактированный код, и он все еще выдавал ошибку в той же строке отладки
daniellopez46

Какую ошибку это дает? Я только что сделал копирование и вставку (просто чтобы убедиться, что это не синтаксическая ошибка), и он прошел без проблем. (Я использую Access 2007, но он должен работать на 97 или более поздней
версии

Я вынул стандартную строку «Option Compare Database» вверху, и теперь она работает. Спасибо!
daniellopez46

1

В этом конкретном случае вы можете найти схемы ADO полезными.

Это перечислит поля и некоторые свойства для конкретной таблицы. Будьте осторожны с типами данных, вы можете не получить точное соответствие типам DAO. Вам понадобится ссылка Microsoft ActiveX Data Objects x.x Library, если вы не используете позднюю привязку.

Dim cn As New ADODB.Connection, cn2 As New ADODB.Connection
Dim rs As ADODB.Recordset, rs2 As ADODB.Recordset

   Set cn = CurrentProject.Connection

   Set rs = cn.OpenSchema(adSchemaTables, _
       Array(Empty, Empty, Empty, "tablenamehere"))

   While Not rs.EOF
       Debug.Print rs!table_name; "   desc=  "; rs!Description
       Set rs2 = cn.OpenSchema(adSchemaColumns, _
           Array(Empty, Empty, "" & rs!table_name & ""))
       While Not rs2.EOF
           Debug.Print "     " & rs2!Column_Name
           Debug.Print "     " & rs2!Data_Type
           Debug.Print "     " & rs2!Description
           Debug.Print "     " & rs2!Is_Nullable
           rs2.MoveNext
       Wend
   rs.MoveNext
   Wend
   rs.Close
   Set cn = Nothing

Вы также можете посмотреть на вещи с другой стороны и получить список таблиц, которые содержат определенное поле.

Dim cn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim strTempList As String

   On Error GoTo Error_Trap

   Set cn = CurrentProject.Connection

   'Get names of all tables that have a column called <SelectFieldName>
   Set rs = cn.OpenSchema(adSchemaColumns, _
   Array(Empty, Empty, Empty, SelectFieldName))

   'List the tables that have been selected
   While Not rs.EOF
       'Exclude MS system tables
       If Left(rs!Table_Name, 4) <> "MSys" Then
           strTempList = strTempList & "," & rs!Table_Name
       End If
       rs.MoveNext
   Wend

   ListTablesContainingField = Mid(strTempList, 2)

От: http://wiki.lessthandot.com/index.php/ADO_Schemas

Stackoverflow имеет немало информации на эту тему: https://stackoverflow.com/search?q=%5Bms-access%5D+schema

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.