Centrum skryptów - Microsoft office

Jak utworzyć listę wszystkich pól i typów danych istniejących w bazie danych programu Access?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak utworzyć listę wszystkich pól i typów danych istniejących w bazie danych programu Access?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! W jednym z archiwalnych artykułów omawialiście tworzenie listy wszystkich tabel znajdujących się w bazie danych programu Access. Jak utworzyć listę wszystkich pól znajdujących się w tych tabelach wraz z typami danych?

-- MF

Cześć Skrypciarze! Odpowiedź

Cześć, MF. Być może nie wiecie, ale w Microsofcie jest pewien człowiek, niejaki Gordon Bell, który postanowił poświęcić się tworzeniu „pełnego dziennika życia”. Używa w tym celu aparatów fotograficznych, kamer, skanerów, dyktafonów i innych podobnych urządzeń. Pisali o nim nawet w New Yorkerze (j.ang.).

Jest to bardzo ciekawe dla wszystkich Skrypciarzy. Niektórzy z nas zaczęli się nawet zastanawiać, czy się nie przyłączyć do tej szlachetnej inicjatywy, ale przecież w życiu Skrypciarzy nie dzieje się nic wartego zapisania, a i tak wszystko zapisujemy w naszych artykułach. No cóż, do dzieła więc:

Const adSchemaTables = 20

Const adSchemaColumns = 4



Set objConnection = CreateObject("ADODB.Connection")

Set objRecordSet = CreateObject("ADODB.Recordset")



objConnection.Open _

    "Provider = Microsoft.Jet.OLEDB.4.0; " & _

        "Data Source = 'C:\Scripts\Test.mdb'" 



Set objRecordSet = objConnection.OpenSchema(adSchemaTables)



Do Until objRecordset.EOF

    strTableName = objRecordset("Table_Name")

    Set objFieldSchema = objConnection.OpenSchema(adSchemaColumns, _

        Array(Null, Null, strTableName))

    Wscript.Echo UCase(objRecordset("Table_Name"))



    Do While Not objFieldSchema.EOF

        Wscript.Echo objFieldSchema("Column_Name") & ", " & objFieldSchema("Data_Type")

        objFieldSchema.MoveNext

    Loop



    Wscript.Echo

    objRecordset.MoveNext

Loop

Teraz, skoro i tak nie mamy nic lepszego do roboty, możemy się zająć wyjaśnieniem, jak ten skrypt działa. Zaczynamy od zdefiniowania dwu stałych, adSchemaTables i adSchemaColumns. Jedna z nich posłuży nam do poinstruowania skryptu, by pobrał informacje o tabelach, natomiast druga do pobrania informacji o kolumnach (czyli polach). Ciekawe, czy domyślacie się, której zmiennej użyjemy do czego.

Po zdefiniowaniu zmiennych tworzymy wystąpienia obiektów ADODB.Connection i ADODB.Recordset, a następnie za pomocą poniższego wiersza kodu otwieramy bazę danych C:\Scripts\Test.mdb:

objConnection.Open _

    "Provider = Microsoft.Jet.OLEDB.4.0; " & _

        "Data Source = 'C:\Scripts\Test.mdb'"

Po nawiązaniu połączenia z bazą danych możemy pobrać listę tabel, używając jednego wiersza kodu i metody OpenSchema, której przekazujemy jeden parametr – adSchemaTables:

Set objRecordSet = objConnection.OpenSchema(adSchemaTables)

Teraz zaczyna się ostra jazda: możemy uruchomić pętlę, która przejdzie przez kolekcję tabel, pobierając listę wszystkich znajdujących się w nich pól i typ danych każdego z nich. No dobra, może nie była to naprawdę ostra jazda, ale w życiach Skrypciarzy i tak nie ma bardziej emocjonujących momentów. W tym celu konfigurujemy pętlę Do Until, która będzie działać, dopóki nie przejdzie przez wszystkie rekordy w zestawie (tzn. dopóki właściwość EOF zestawu nie przyjmie wartości True). W pętli spoglądamy najpierw na rekord 1, pobieramy wartość właściwości Table_Name, a następnie przechowujemy tę wartość w zmiennej o nazwie strTableName:

strTableName = objRecordset("Table_Name")

Znając nazwę pierwszej tabeli, możemy za pomocą poniższego wiersza kodu pobrać drugi zestaw rekordów, zawierający tym razem wszystkie pola (kolumny) znajdujące się w tabeli:

Set objFieldSchema = objConnection.OpenSchema(adSchemaColumns, _

    Array(Null, Null, strTableName))

Jak widzimy, ponownie wywołujemy metodę OpenSchema, za pomocą której uzyskujemy dostęp do schematu bazy danych. Tym razem musimy jednak podać kilka dodatkowych parametrów. Najpierw podajemy stałą adSchemaColumns, która po prostu instruuje skrypt, że chcemy zwrócić informacje o kolumnach. Następnie podajemy tablicę „kolumn granicznych”. Składa się ona z następujących wartości:

  • Wartość Null, oznaczająca katalog tabel.
  • Wartość Null, oznaczająca schemat tabel.
  • Zmienna strTableName, oznaczająca nazwę tabeli, z którą chcemy się połączyć.

Na razie nie ma się co przejmować katalogiem ani schematem tabel. Wystarczy się upewnić, że w trzecim elemencie tablicy podano nazwę tabeli, a wszystko będzie działać jak trzeba.

Po pobraniu drugiego zestawu rekordów (objFieldSchema), możemy rozpocząć wyświetlanie danych związanych z pierwszą z tabel bazy danych. W tym celu najpierw wywołujemy echo nazwy tabeli, używając przy tym funkcji UCase, która sprawi, że nazwa zostanie podana dużymi literami:

Wscript.Echo UCase(objRecordset("Table_Name"))

Następnie uruchamiamy drugą pętlę Do Until, która tym razem przejdzie przez kolekcję pól w tabeli 1:

Do While Not objFieldSchema.EOF

Co zamierzamy osiągnąć za pomocą tej pętli? Dwie rzeczy. Po pierwsze, wywołamy echo wartości właściwości Column_Name i Data_Type:

Wscript.Echo objFieldSchema("Column_Name") & ", " & objFieldSchema("Data_Type")

Po drugie, wywołamy metodę MoveNext, która przeniesie nas z pierwszego rekordu w zestawie do kolejnego. Po wyświetleniu informacji o każdym z elementów w zestawie, wyświetlamy na ekranie pusty wiersza, po czym ponownie wywołujemy metodę MoveNext, tym razem po to, by przejść do kolejnego rekordu w pierwszym zestawie, czyli kolejnej tabeli. Po zakończeniu uzyskujemy raport, wyglądający mniej-więcej tak (w zależności od tabel i pól znajdujących się w bazie danych):

COMPUTERS

ComputerName, 130

SerialNumber, 130



DISKDRIVES

Drive, 130

DriveSize, 2

SerialNumber, 130

Type, 130



EMPLOYEES

Bonus, 6

Department, 130

Division, 130

EmployeeID, 5

EmployeeName, 130

Salary, 6

Dobre pytanie: co to za liczby pojawiają się po nazwach pól? No cóż, jak się okazuje, typy danych przechowywane są jako wartości numeryczne. Można to sprawdzić na liście DatatypeEnum (j.ang.); np. numer 6 wskazuje, że typ danych to waluta. Być może powinniśmy byli uwzględnić to w naszym skrypcie, ale wyglądałby na dużo groźniejszy i trudniejszy, niż jest w istocie.

Swoją drogą – nie trzeba wcale sprawdzać od razu wszystkich tabel w bazie. Załóżmy np., że interesują nas tylko informacje o polach w tabeli Employees:

Const adSchemaColumns = 4



Set objConnection = CreateObject("ADODB.Connection")

Set objRecordSet = CreateObject("ADODB.Recordset")



objConnection.Open _

    "Provider = Microsoft.Jet.OLEDB.4.0; " & _

        "Data Source = 'C:\Scripts\Test.mdb'" 



Set objRecordSet = objConnection.OpenSchema(adSchemaColumns, _

    Array(Null, Null, "Employees"))



Do Until objRecordset.EOF

    Wscript.Echo objRecordset("Column_Name") & ", " & objRecordset("Data_Type")

    objRecordset.MoveNext

Loop

Mamy nadzieję, że to wystarczy, MF. Jeśli nie, to cóż, Twoja strata – my lecimy na krótką przerwę na pączki. To dopiero druga dziś rano!

 Do początku strony Do początku strony

Centrum skryptów - Microsoft office