2013-07-09 2 views
11

Мне нужно прочитать свойства более 100 таблиц в базе данных Access 2003 и записать эти данные - имя таблицы, имя поля, тип и размер - в файл для дальнейшей документации ,Как пропустить все таблицы в MS Access DB

Я не могу найти ничего из веб-поиска о чтении свойств поля, только значения полей ...

Может кто-то пожалуйста, скажите мне, что я переменные записей должны объявить (и синтаксис), чтобы перебрать все таблицы в БД и извлечь имя, тип и размер поля из каждого из них? Я буду писать результаты в текстовый файл, но я думаю, что смогу это обработать! :)

Я нахожусь в тупике, пока не смогу разобраться в этом. Мне потребовался день для документирования двух таблиц вручную. Некоторые из таблиц имеют более 100 полей.

ответ

16

Мастер создания базы данных базы данных с этими параметрами должен дать вам то, что вы хотите, с наименьшими усилиями.

enter image description here

Если такой подход не является удовлетворительным, вы можете использовать пользовательский код VBA, чтобы собрать информацию, которую вы хотите. Вы можете получить имена таблиц в своей базе данных, перейдя через коллекцию DAO TableDefs.

Dim db As DAO.Database 
Dim tdf As DAO.TableDef 
Set db = CurrentDb 
For Each tdf In db.TableDefs 
    ' ignore system and temporary tables 
    If Not (tdf.name Like "MSys*" Or tdf.name Like "~*") Then 
     Debug.Print tdf.name 
    End If 
Next 
Set tdf = Nothing 
Set db = Nothing 

Чтобы получить подробную информацию на места, которые вы хотите, адаптировать TableInfo() function ... замещающего заявление записи файлов Аллен Броуна для Debug.Print заявления. Обратите внимание, что функция использует 2 вспомогательные функции, GetDescrip и FieldTypeName, оба из которых включены в эту страницу.

Вот пример выходного выходного окна из TableInfo() для таблицы в моей базе данных --- Я думаю, что она содержит информацию о поле, которую вы хотите.

TableInfo "foo" 
FIELD NAME FIELD TYPE SIZE   DESCRIPTION 
========== ========== ====   =========== 
id   AutoNumber  4    
MyNumber  Long Integer 4    
MyText  Text   255   
bar   Long Integer 4    
========== ========== ====   =========== 

После того как вы адаптировали функции, вызовите его из петли For Each tdf в образце выше, и кормить его каждый tdf.name:

TableInfo tdf.name 
4

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

' Database. 
    Dim dbRep As DAO.Database 
    Dim dbNew As DAO.Database 

    ' For copying tables and indexes. 
    Dim tblRep As DAO.TableDef 
    Dim tblNew As DAO.TableDef 
    Dim fldRep As DAO.Field 
    Dim fldNew As DAO.Field 
    Dim idxRep As DAO.Index 
    Dim idxNew As DAO.Index 

    ' For copying data. 
    Dim rstRep As DAO.Recordset 
    Dim rstNew As DAO.Recordset 
    Dim rec1 As DAO.Recordset 
    Dim rec2 As Recordset 
    Dim intC As Integer 

    ' For copying table relationships. 
    Dim relRep As DAO.Relation 
    Dim relNew As DAO.Relation 

    ' For copying queries. 
    Dim qryRep As DAO.QueryDef 
    Dim qryNew As DAO.QueryDef 

    ' For copying startup options. 
    Dim avarSUOpt 
    Dim strSUOpt As String 
    Dim varValue 
    Dim varType 
    Dim prpRep As DAO.Property 
    Dim prpNew As DAO.Property 

    ' For importing forms, reports, modules, and macros. 
    Dim appNew As New Access.Application 
    Dim doc As DAO.Document 

    ' Open the database, not in exclusive mode. 
    Set dbRep = OpenDatabase(Forms!CMDB_frmUpgrade.TxtDatabase, False) 


    ' Open the new database 
    Set dbNew = CurrentDb 

    DoEvents 

    ' Turn on the hourglass. 
    DoCmd.Hourglass True 

    '******************** 
    Debug.Print "Copy Tables" 
    '******************** 
If Forms!CMDB_frmUpgrade.CkTables = True Then 
    Forms!CMDB_frmUpgrade.LstMessages.addItem "Copying Tables:" 

    ' Loop through the collection of table definitions. 
    For Each tblRep In dbRep.TableDefs 
    Set rec1 = dbRep.OpenRecordset("SELECT MSysObjects.Name FROM MsysObjects WHERE ([Name] = '" & tblRep.Name & "') AND ((MSysObjects.Type)=4 or (MSysObjects.Type)=6)") 

    If rec1.EOF Then 
     XF = 0 
    Else 
     XF = 1 
    End If 

     ' Ignore system tables and CMDB tables. 
     If InStr(1, tblRep.Name, "MSys", vbTextCompare) = 0 And _ 
      InStr(1, tblRep.Name, "CMDB", vbTextCompare) = 0 And _ 
      XF = 0 Then 

      '***** Table definition 
      ' Create a table definition with the same name. 
      Set tblNew = dbNew.CreateTableDef(tblRep.Name) 
      Forms!CMDB_frmUpgrade.LstMessages.addItem "--> " & tblRep.Name & "" 

      ' Set properties. 
      tblNew.ValidationRule = tblRep.ValidationRule 
      tblNew.ValidationText = tblRep.ValidationText 

      ' Loop through the collection of fields in the table. 
      For Each fldRep In tblRep.Fields 

       ' Ignore replication-related fields: 
       ' Gen_XXX, s_ColLineage, s_Generation, s_GUID, s_Lineage 
       If InStr(1, fldRep.Name, "s_", vbTextCompare) = 0 And _ 
        InStr(1, fldRep.Name, "Gen_", vbTextCompare) = 0 Then 

        '***** Field definition 
        Set fldNew = tblNew.CreateField(fldRep.Name, fldRep.Type, _ 
         fldRep.Size) 

        ' Set properties. 
        On Error Resume Next 
        fldNew.Attributes = fldRep.Attributes 
        fldNew.AllowZeroLength = fldRep.AllowZeroLength 
        fldNew.DefaultValue = fldRep.DefaultValue 
        fldNew.Required = fldRep.Required 
        fldNew.Size = fldRep.Size 

        ' Append the field. 
        tblNew.Fields.Append fldNew 
        'On Error GoTo Err_NewShell 
       End If 
      Next fldRep 

      '***** Index definition 

      ' Loop through the collection of indexes. 
      For Each idxRep In tblRep.Indexes 

       ' Ignore replication-related indexes: 
       ' s_Generation, s_GUID 
       If InStr(1, idxRep.Name, "s_", vbTextCompare) = 0 Then 

        ' Ignore indices set as part of Relation Objects 
        If Not idxRep.Foreign Then 

         ' Create an index with the same name. 
         Set idxNew = tblNew.CreateIndex(idxRep.Name) 

         ' Set properties. 
         idxNew.Clustered = idxRep.Clustered 
         idxNew.IgnoreNulls = idxRep.IgnoreNulls 
         idxNew.Primary = idxRep.Primary 
         idxNew.Required = idxRep.Required 
         idxNew.Unique = idxRep.Unique 

         ' Loop through the collection of index fields. 
         For Each fldRep In idxRep.Fields 
          ' Create an index field with the same name. 
          Set fldNew = idxNew.CreateField(fldRep.Name) 
          ' Set properties. 
          fldNew.Attributes = fldRep.Attributes 
          ' Append the index field. 
          idxNew.Fields.Append fldNew 
         Next fldRep 

         ' Append the index to the table. 
         tblNew.Indexes.Append idxNew 
        End If 
       End If 
      Next idxRep 

      ' Append the table. 
      dbNew.TableDefs.Append tblNew 
     End If 
    Next tblRep 
+0

Благодаря вам обоим. Я вижу, что мне нужно делать сейчас. Качественный товар. – Capfka

Смежные вопросы