Centrum skryptów - Microsoft Office

W jaki sposób dodać zawartość kilku plików tekstowych do bazy 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.

W jaki sposób dodać zawartość kilku plików tekstowych do bazy danych programu Access?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Mam folder, w którym znajdują się setki plików tekstowych. Chcę dodać zapisać każdego z plików jako osobne pole w bazie danych Access. Jak to zrobić?

-- KB

Cześć Skrypciarze! Odpowiedź

Cześć, KB. Kilka lat temu Skrypciarz piszący te słowa prowadził jedną z sesji na konferencji w Orlando na Florydzie. Tak się złożyło, że zabrał ze sobą 10-letniego wówczas syna i jego kolegę. W końcu to żadna frajda jechać na Florydę samemu, poza tym miał wymówkę, by nie uczestniczyć w sesjach innych osób, a zamiast tego byczyć się w World Disney World. Kiedyś trafili tam wieczorem, kiedy już prawie wszyscy goście zabrali się do domu. Poszli zjechać ze Splash Mountain (j. ang.), a potem, ponieważ nie było kolejki, jeszcze raz. I jeszcze raz, i jeszcze, i tak dopóki nie przyszli smutni panowie i nie powiedzieli, że czas zamykać. Morał z tej opowieści? Otóż są takie rzeczy, które się nigdy nie nudzą. Jak się zapewne domyślacie, jedną z nich jest pisanie skryptów – na przykład takich, które służą do obsługi plików tekstowych, jak ten i ten. A już prawdziwy cymes to skrypty do obsługi wszystkich plików tekstowych zawartych w jakimś folderze:

Const ForReading = 1

Const adLockOptimistic = 3



Set objConnection = CreateObject("ADODB.Connection")

Set objRecordSet = CreateObject("ADODB.Recordset")



Set objFSO = CreateObject("Scripting.FileSystemObject")



objConnection.Open _

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

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



objRecordSet.Open "SELECT * FROM TextFiles" , _

    objConnection, adOpenStatic, adLockOptimistic



strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set colFileList = objWMIService.ExecQuery _

    ("ASSOCIATORS OF {Win32_Directory.Name='C:\Archive'} Where " _

        & "ResultClass = CIM_DataFile")



For Each objFile In colFileList

    Set objTextFile = objFSO.OpenTextFile(objFile.Name, ForReading)

    strContents = objTextFile.ReadAll

    objTextFile.Close



    objRecordSet.AddNew

    objRecordSet("FileName") = objFile.Name

    objRecordSet("FileContents") = strContents

    objRecordSet.Update

Next



objRecordSet.Close

objConnection.Close

Teraz chwila na złapanie oddechu i już wyjaśniamy, w jaki sposób to działa. Zaczynamy od zdefiniowania pary stałych: ForReading i adLockOptimistic. Za pomocą stałej ForReading podamy tryb działania (tzn. odczyt) po otwarciu plików tekstowych; adLockOptimistic posłuży nam do wskazania, w jaki sposób zablokujemy zestaw rekordów dla innych użytkowników podczas pracy z bazą danych. (Blokowanie optymistyczne oznacza, że zablokujemy go tylko na czas działania metody Update.) Po zdefiniowaniu tych zmiennych tworzymy dwa obiekty bazodanowe: ADODB.Connection i ADODB.Recordset. Teraz tworzymy wystąpienie obiektu Scripting.FileSystemObject, umożliwiającego odczyt plików tekstowych. Nie będziemy potrzebowali tego obiektu od razu, ale skoro można go już utworzyć, to czemu nie. Nie zając, nie ucieknie.

Uwaga. Zanim zapytacie – nie, nie będziemy dzisiaj wyjaśniać szczegółów obsługi baz danych ani ich obiektów.

Dwa obiekty bazy danych, w przeciwieństwie do FileSystemObject, wykorzystamy od razu. Najpierw użyjemy obiektu Connection do połączenia z bazą C:\Scripts\Test.mdb:

objConnection.Open _

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

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

Teraz używamy obiektu Recordset do pobrania kolekcji wszystkich rekordów znalezionych w tabeli TextFiles:

objRecordSet.Open "SELECT * FROM TextFiles" , _

    objConnection, adOpenStatic, adLockOptimistic

Pewnie się już domyśliliście, że TextFiles to nazwa tabeli, do której dodamy nowe rekordy. Na potrzeby dzisiejszego skryptu zakładamy, że tabela TextFiles już istnieje. Jednak bez większego problemu można zmodyfikować skrypt tak, aby najpierw tworzył tabelę, a potem dodawał do niej rekordy.

Teraz, mając połączenie z bazą danych, możemy pobrać zawartość plików tekstowych. W tym celu łączymy się z usługą WMI komputera lokalnego:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Ze względu na ograniczenia FileSystemObject, nasz skrypt działa tylko na komputerze lokalnym. Nie znaczy to, że nigdy, w żadnym wypadku, nie można odczytywać plików zapisanych na komputerze zdalnym, a tylko tyle, że trzeba go najpierw zmodyfikować. W jaki sposób? No cóż, taki, jak opisaliśmy w tym artykule.

OK; co teraz? Teraz używamy poniższego fragmentu kodu do pobrania kolekcji wszystkich plików znajdujących się w folderze C:\Archive:

Set colFileList = objWMIService.ExecQuery _

    ("ASSOCIATORS OF {Win32_Directory.Name='C:\Archive'} Where " _

        & "ResultClass = CIM_DataFile")

I wreszcie możemy przejść do sedna i zabrać się za dodawanie zawartości plików do bazy danych.

Zauważmy jeszcze, że w przykładzie używamy bardzo prostej bazy, zawierającej jedynie dwa pola:

FileName – pole tekstowe, w którym przechowamy ścieżkę otworzonego pliku.
FileContents – pole noty, w którym przechowamy zawartość pliku.

Teraz już naprawdę zaczynamy dodawać rekordy do bazy. Dzięki kwerendzie WMI uzyskaliśmy kolekcję wszystkich plików znajdujących się w folderze C:\Archive i przechowaliśmy ją w zmiennej colFileList. Pamiętając o tym, uruchamiamy pętlę For Each, która przejdzie przez każdy z plików:

For Each objFile In colFileList

Wewnątrz pętli otwieramy pierwszy plik za pomocą metody OpenTextFile:

Set objTextFile = objFSO.OpenTextFile(objFile.Name, ForReading)

Zwróćmy uwagę, że podajemy metodzie OpenTextFile dwa parametry: objFile.Name, czyli właściwość WMI zwracającą kompletną ścieżkę dostępu do pliku; oraz stałą ForReading, która informuje, że będziemy odczytywać plik. Następnie używamy metody ReadAll do odczytania zawartości pliku i zachowania jej w zmiennej strContents:

strContents = objTextFile.ReadAll

Mając w pamięci zawartość pliku, wywołujemy metodę Close, by go zamknąć.

Dochodzimy teraz do takiego fragmentu kodu:

objRecordSet.AddNew

objRecordSet("FileName") = objFile.Name

objRecordSet("FileContents") = strContents

objRecordSet.Update

To jest właśnie ta najbardziej emocjonująca część dzisiejszego artykułu, na którą wszyscy czekali. Jak widać, wywołujemy tu metodę AddNew obiektu Recordset; w ten sposób w naszej tabeli bazy danych powstanie nowy, pusty rekord. Następnie dodajemy ścieżkę pliku (wartość Name) do pola FileName, a zawartość pliku (wartość strContents) do pola FileContents, używając w tym celu poniższych dwóch wierszy:

objRecordSet("FileName") = objFile.Name

objRecordSet("FileContents") = strContents

Teraz wywołujemy metodę Update, która zapisuje nowy rekord w bazie. To ważny krok – pominięcie tej metody spowoduje, że zmiany nie zostaną zapisane.

Po wywołaniu metody Update dla pierwszego pliku, pętla powtarza działanie dla kolejnego elementu kolekcji. Prędzej czy późnej otworzymy i odczytamy wszystkie pliki. Wtedy pętla For Each automatycznie zakończy działanie, a my zakończymy połączenie z bazą, używając poniższych dwóch wierszy kodu:

objRecordSet.Close

objConnection.Close

Wszystko co dobre, kiedyś się kończy. I to jest właśnie ten moment dla naszego skryptu.

 Do początku strony Do początku strony

Centrum skryptów - Microsoft Office