Centrum Skryptów - Systemy operacyjne

Jak użyć odłączonego zestawu rekordów w programie 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 użyć odłączonego zestawu rekordów w programie Windows PowerShell?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak użyć odłączonego zestawu rekordów w programie Windows PowerShell? Mogę bez problemu utworzyć zestaw rekordów, ale nie wiem, jak odwołać się do pól i wartości w tym zestawie rekordów?

-- JVDL

Cześć Skrypciarze! Pytanie

Cześć, JVDL. Jestem pełen podziwu. Zimowa Olimpiada Skrypciarska 2008 (j.ang.) rozpoczęła się tak niedawno i kiedy wszyscy gorączkowo analizują wytyczne dotyczące wydarzeń i pobierają pakiet Competitors Pack (j.ang.), JDVL spokojnie, jak gdyby nigdy nic, zadaje pytanie o zastosowanie odłączonego zestawu rekordów w programie Windows PowerShell. Jestem naprawdę pod wrażeniem.

Być może ktoś odkrył, że w jednej z rozgrywek dotyczących programu Windows PowerShell używamy odłączonego zestawu rekordów? Czy stąd się wzięło Twoje pytanie, JVDL? Zadajesz pozornie niewinne pytanie, mając nadzieję, że przypadkiem ujawnię informacje, które mogą okazać się bezcenne dla uczestników Olimpiady? Taki masz plan?

Jeżeli tak, to całkiem dobry plan. W końcu wyczerpująco opowiem Wam, jak użyć odłączonego zestawu rekordów w programie Windows PowerShell.

Nie, nie powiem, w której konkurencji używamy odłączonego zestawu rekordów. Tortury też się na nic nie przydadzą. Nic nie powiem.

Ale mogę zdradzić Wam inny sekret: pisząc rozwiązania dla wszystkich wydarzeń, rzadko kiedy dążymy do rozwiązania „optymalnego”. Chodzi nam natomiast o dwie rzeczy: rozwiązania, które łatwo wyjaśnić oraz możliwość wypróbowania kilku technik, których w innym przypadku nigdy byśmy nie użyli. Może trudno w to uwierzyć, ale zazwyczaj nie ma potrzeby używania odłączonych zestawów rekordów w skryptach programu Windows PowerShell. Olimpiada to dla Skrypciarzy świetna okazja, żeby je wykorzystać.

Do roboty zatem! Teraz wszyscy chcą wiedzieć, jak używać odłączonych zestawów rekordów w programie Windows PowerShell. Oto rozwiązanie:

$adDouble = 5

$adFldIsNullable = 32



$objRecordset = New-Object -com "ADOR.Recordset"

$objRecordset.Fields.Append("Score", $adDouble, $Null, $AdFldIsNullable)

$objRecordset.Open()



for ($i = 1; $i -le 10; $i++)

    {

        $objRecordset.AddNew()

        $objRecordset.Fields.Item("Score") = $i

    }



$objRecordset.Sort = "Score DESC"

$objRecordset.MoveFirst();



do 

    {

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

        $objRecordset.MoveNext()

    }

until ($objRecordset.EOF)

Zobaczmy, jak ten skrypt działa. Na początek przypisujemy wartość 5 do zmiennej o nazwie $adDouble; zastosujemy tę zmienną w celu utworzenia pola numerycznego dla naszego odłączonego zestawu rekordów. (Czyli pola z rzeczywistym typem danych.). Na wypadek, gdyby ktoś się zastanawiał, odłączone zestawy rekordów służą nam do pobierania danych i ich sortowania pod względem pól numerycznych. Dlatego w naszym zestawie rekordów używamy pola numerycznego. Oczywiście w większości przypadków chcielibyśmy utworzyć pole wariantu. Wtedy zdefiniowalibyśmy zmienną o nazwie $adVarChar:

$adVarChar = 200

Po zdefiniowaniu zmiennej $adDouble określamy inną zmienną - $adFldIsNullable – i nadajemy jej wartość 32. Ta zmienna umożliwia nam utworzenie pola zawierającego wartość zerową (Null). Innymi słowy to pole, do którego nie musimy wprowadzać żadnych danych. Nie dotyczy to naszego skryptu przykładowego, ale może być użyteczne w innych przypadkach. Dlatego zdecydowałem się je tutaj uwzględnić.

W końcu nie mam przed Wami żadnych tajemnic, nieprawdaż?

Z wyjątkiem informacji o tym, w którym wydarzeniu wykorzystano odłączony zestaw rekordów.

Kiedy już mamy dwie zmienne, używamy polecenia New-Object w celu utworzenia wystąpienia obiektu ADOR.Recordset:

$objRecordset = New-Object -com "ADOR.Recordset"

Zauważcie, że musimy dodać tutaj parametr –com; a to dlatego, że mamy do czynienia z obiektem COM zamiast klasą .NET Framework.

Po utworzeniu obiektu zestawu rekordów możemy do zestawu dodać pole za pomocą następującego wiersza kodu:

$objRecordset.Fields.Append("Score", $adDouble, $Null, $AdFldIsNullable)

Jak widać, wywołujemy tylko metodę Append z następującymi po niej czterema parametrami:

  • Score. Jest to nazwa nadana polu.
  • $adDouble. Typ danych w polu. Używamy tutaj zmiennej $adDouble w celu określenia, że chodzi nam o rzeczywisty typ danych.
  • $Null. Parametr 3 jest używany do określenia maksymalnej liczby znaków, które mogą zostać zachowane w polu. Nie ma znaczenia w przypadku pola numerycznego, ale program PowerShell wymaga, abyśmy coś w tym miejscu umieścili. Dlatego też używamy wartości zerowej ($Null), która spowoduje, że skrypt zostawi ten parametr w stanie niezmienionym.
  • $adFldIsNullable. Jak już mówiłem, nie jest potrzebny w naszym skrypcie. Jednak ten parametr umożliwia określenie, że pole Score nie musi zawierać żadnych danych. Ten parametr byłby użyteczny w przypadku zestawów rekordów zawierających wiele pól. Przykładowo, możemy mieć informacje na temat personelu, w których mamy pole dla numeru telefonu komórkowego użytkownika. Możemy określić to pole jako niewymagane (nullable) na wypadek – chociaż trudno w to uwierzyć – gdyby użytkownik nie posiadał telefonu komórkowego.

W naszym przykładowym skrypcie dodajemy po prostu jedno pole. Gdybyśmy chcieli dodać dodatkowe pola, wywołalibyśmy metodę Append tyle razy, ile potrzeba, za każdym razem określając odpowiednie informacje. Po zdefiniowaniu wszystkich pól możemy wywołać metodę Open w celu umożliwienia działania naszego odłączonego zestawu rekordów:

$objRecordset.Open()

Teraz dochodzimy do tej części, która sprawiała JVDL problemy: praca z zestawem rekordów. (A konkretniej odnoszenie się do pól w zestawie rekordów.) W celu pokazania, że możemy dodawać dane do odłączonego zestawu rekordów, najpierw użyjemy następującego wiersza kodu w celu uruchomienia pętli for, która przejdzie przez elementy z zakresu od 1 do 10:

for ($i = 1; $i -le 10; $i++)

Wewnątrz tej pętli wywołujemy metodę AddNew w celu dodania nowego rekordu do naszego zestawu rekordów:

$objRecordset.AddNew()

Teraz przechodzimy do następującego wiersza kodu:

 

$objRecordset.Fields.Item("Score") = $i

W ten sposób odnosimy się do pola w odłączonym zestawie rekordów, przynajmniej w programie Windows PowerShell. W VBScript dodalibyśmy taki sam wiersz kodu:

objRecordset("Score") = i

Jednak to nie działa w programie Windows PowerShell. Musimy określić kompletną ścieżkę obiektu: $objRecordset.Fields.Item("Score"). To nas zabierze tam, gdzie trzeba i w tym przypadku ustawi wartość pola Score naszego nowego rekordu jako wartość zmiennej pętli $i.

Po zakończeniu działania pętli for stosujemy następujące dwa wiersze kodu w ceku uporządkowania zestawu rekordów w porządku malejącym, a następnie przechodzimy do pierwszego rekordu w tym uporządkowanym zestawie:

$objRecordset.Sort = "Score DESC"

$objRecordset.MoveFirst();

Nie, wcale nie musieliśmy tego robić. Jednakże, sortując dane w porządku malejącym pokażemy, że naprawdę możemy pracować w danymi numerycznymi.

O to przecież chodziło JVDL od samego początku.

Jak więc pokażemy, że możemy pracować z danymi numerycznymi w naszym odłączonym zestawie rekordów? Cóż, na początek uruchamiamy pętlę do, która będzie działać, dopóki nie dotrze do końca zestawu rekordów; czyli dopóki wartość True właściwości EOF (end-of-file – koniec pliku) zestawu rekordów się nie zmieni. Wewnątrz tej pętli wywołujemy echo wartości pierwszego rekordu w zestawie rekordów, po raz kolejny używając kompletnej ścieżki w celu odniesienia się do pola Score: $objRecordset.Fields.Item("Score").Value. Po zakończeniu wywołujemy metodę MoveNext i powtarzamy cały proces dla następnego rekordu w zestawie rekordów.

Te wszystkie czynności wymagają fragmentu kodu nie bardziej skomplikowanego, niż ten poniższy:

do 

    {

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

        $objRecordset.MoveNext()

    }

until ($objRecordset.EOF)

W taki właśnie sposób używamy odłączonego zestawu rekordów w programie Windows PowerShell.

Na razie to wszystko, nie zatrzymuję Was dłużej. W końcu wszyscy są bardzo zajęci w związku z rozgrywkami Olimpiady Skrypciarskiej (j.ang.). Pamiętajcie o harmonogramie, to naprawdę ważne, żeby zadania były oddawane na czas. Jeżeli nie zdobędziecie maksymalnej liczby punktów, to i tak wygrywacie jedną w wielu niesamowitych nagród (j.ang.). Nie musicie nawet poprawnie wykonać zadania, żeby ją otrzymać.

 Do początku strony Do początku strony

Centrum Skryptów - Systemy operacyjne