Centrum Skrypciarzy - Microsoft Office

Jak pobrać rekordy z bazy danych programu Microsoft Access za pomocą programu Windows PowerShell?

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 pobrać rekordy z bazy danych programu Microsoft Access za pomocą programu Windows PowerShell?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak pobrać rekordy z bazy danych programu Microsoft Access za pomocą programu Windows PowerShell?

-- SB

Cześć Skrypciarze! Odpowiedź

Cześć, SB! Ciesz się, że załapałeś się na odpowiedź z naszej strony w dniu dzisiejszym, wszystko bowiem wskazuje na to, że będzie to ostatni artykuł z serii „Cześć, Skrypciarze!”. Nie mogę napisać, że nam przykro, byłoby to bowiem kłamstwo. Mogę jedynie napisać, że nie spodziewaliśmy się, że emerytura tak szybko zapuka do naszych drzwi (choć nasz szef sugeruje inaczej, ale zawsze z lekką groźbą w głosie).

Nas to także zaskoczyło, zostaliśmy bowiem powiadomieni o wygranej drogą e-mailową dziś o szóstej rano. Znaczy się o szóstej jeszcze przecieraliśmy oczy i dopiero całą godzinę później, koło siódmej odkryliśmy, co następuje: wygraliśmy milion euro w jakiejś międzynarodowej loterii hiszpańskiej. Mózg ostrzega mnie trochę co prawda („Skrypciarzu, jak można wygrać coś na loterii, w której się w ogóle nie brało się udziału?”), ale skutecznie go zagłuszam poranną muzyką. Do roboty więc, oto pewnie już ostatni skrypt w mojej karierze. Skrypt, dzięki któremu dowiecie się, jak pobrać rekordy z bazy danych Access, używając składni Windows PowerShell:

$adOpenStatic = 3

$adLockOptimistic = 3



$objConnection = New-Object -comobject ADODB.Connection

$objRecordset = New-Object -comobject ADODB.Recordset



$objConnection.Open("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = c:\scripts\sample.mdb")

$objRecordset.Open("Select * from TotalSales", $objConnection,$adOpenStatic,$adLockOptimistic)



$objRecordset.MoveFirst()



do {$objRecordset.Fields.Item("EmployeeName").Value; $objRecordset.MoveNext()} until 

    ($objRecordset.EOF -eq $True)



$objRecordset.Close()

$objConnection.Close()

Zaczynamy w dość mało skomplikowany sposób – od nadania wartości „3” dwóm zmiennym: $adOpenStatic and $adLockOptimistic. Jeżeli nie opanowaliście jeszcze do końca Windows PowerShell (j.ang.) i zastanawiacie się nad nazwami tych zmiennych, to istnieje powód, dla którego zaczynają się one od $: tak po prostu muszą się nazywać. Nie mamy obsesji na punkcie wygranej, która swoją drogą była w euro, nie w dolarach. Nie będziemy omawiać dziś dogłębnie wszystkich aspektów ADODB, dlatego też, jeżeli jesteście zainteresowani tematem, to zapraszam do webcastu Skrypciarzy (j.ang.). Powiemy jedynie, że tych dwóch zmiennych używamy do pobrania informacji z bazy danych.

Po przypisaniu wartości zmiennym korzystamy z Cmdlet-u New-Object i tworzymy odwołanie do obiektów ADODB.Connection oraz ADODB.Recordset:

$objConnection = New-Object -comobject ADODB.Connection

$objRecordset = New-Object -comobject ADODB.Recordset

New-Object używany jest w tym samym celu, co metoda CreateObject skryptu VBScript, a dokładniej jest to ekwiwalent VBScript podczas tworzenia obiektów Connection:

Set objConnection = CreateObject("ADODB.Connection")

Inna składnia, ale ile podobieństw!

Mając teraz do dyspozycji nasze dwa obiekty, możemy połączyć się z bazą danych (C:\Scripts\Sample.mdb), a następnie wysłać kwerendę do tabeli. W naszym przykładowym skrypcie wybieramy wszystkie rekordy z tabeli o nazwie TotalSales:

$objRecordset.Open("Select * from TotalSales", $objConnection,$adOpenStatic,$adLockOptimistic)

Macie rację, są bardzo podobne do pobierania rekordów za pomocą VBScript, z jedną podstawową różnicą (oprócz nazwy) – w VBScript nie dodajemy nawiasów do obiektów przekazywanych metodzie Open:

objRecordSet.Open "Select * From TotalSales", _

    objConnection, adOpenStatic, adLockOptimistic

Tyle VBScript; w Windows PowerShell musicie zawsze pamiętać o nawiasach w trakcie wywoływania jakiejś metody, nawet jeżeli nie wymaga ona żadnych parametrów. Dajmy na to, że możemy tak po prostu wywołać metodę Open bez podawania informacji o kwerendzie. W takim wypadku nasz kod będzie wyglądał w następujący sposób, a po metodzie będzie następował pusty nawias:

$objRecordset.Open()

Gdy zestaw rekordów jest już otwarty, wywołujemy metodę MoveFirst (pamiętajcie, o czym mówiliśmy: zwróćcie uwagę na te puste nawiasy), która umieszcza kursor na początku zestawu rekordów. To sprowadza nas do następującego fragmentu kodu:

do {$objRecordset.Fields.Item("EmployeeName").Value; $objRecordset.MoveNext()} until 

    ($objRecordset.EOF -eq $True)

Tworzymy tutaj pętlę Do Until, która przechodzi przez wszystkie pozycje, aż do ostatniego zestawu rekordów. Jak to działa? Używamy słowa do (z ang. „zrób”), po którym następuje zadanie, jakie należy wykonać, ujęte w nawias klamrowy. W pętli chodzi nam o dwie rzeczy – chcielibyśmy uzyskać echo wartości pola EmployeeName; do tego służy następujący fragment kodu:

$objRecordset.Fields.Item("EmployeeName").Value

Przypominamy, że nie jest to VBScript i że należy dodać .Value po nazwie pola. .Value jest właściwością domyślną podczas pracy z zestawem rekordów. Jeżeli nie określimy dokładnie nazwy właściwości, to VBScript sam automatycznie dodaje tę właściwość domyślną. W Windows PowerShell jest inaczej, tu się niczego nie domyślamy, tylko określamy konkretnie, o co nam chodzi, musimy więc koniecznie dodać .Value. Kropka.

Po pojawieniu się wartości EmployeeName w pierwszym zestawie rekordów przechodzimy do kolejnego rekordu, musimy więc posłużyć się metodą MoveNext:

$objRecordset.MoveNext()

Zauważcie, że tak, jak w przypadku przywołania echa wartości EmployeeName, jak i przechodzenia do kolejnego rekordu, posługujemy się nawiasami klamrowymi. Co więcej, są one oddzielone średnikiem. Średnika używamy oczywiście do oddzielenia poleceń w składni Windows PowerShell.

Tyle, jeżeli chodzi o „do”; teraz zajmiemy się częścią „until” (z ang. „aż do”). Wpisujemy słowo until w celu poinstruowania skryptu, aby kontynuował aż do momentu, w którym właściwość „zestaw rekordów EOF (end-of-file)” osiągnie wartość true:

$objRecordset.EOF -eq $True

Dwie rzeczy, na które należy zwrócić uwagę: po pierwsze nie używamy znaku równości, ale operatora porównania –eq (to kolejna cecha składni PowerShell, do której trzeba się po prostu przyzwyczaić), po drugie używamy znaku $ przed wartością True. Czy trzeba używać wartości takich, jak $True czy $False? Niestety tak.

Tylko tyle. Skrypt przejdzie teraz przez zestaw rekordów, pokazując nazwiska pracowników znajdujące się w tabeli Total Sales. Kiedy właściwość EOF przyjmie wartość True (tzn. kiedy dotrzemy do końca zestawu rekordów), opuścimy pętlę, a następujące dwa wiersze kodu zamkną zestaw rekordów i połączenie z bazą danych:

$objRecordset.Close()

$objConnection.Close()

Czas się zatem żegnać, drodzy Czytelnicy, w końcu to nasz ostatni artykuł... no chyba, że ktoś chciał nas oszukać i tak naprawdę ta cała loteria to jakiś jeden wielki przekręt.

No, ale jakoś nie chce mi się w to wierzyć…

 Do początku strony Do początku strony

Centrum Skrypciarzy - Microsoft Office