Powershell i SQL 02 – Wykorzystanie metod .NET

28-cze-2015

Jedną z największych zalet Powershell jest to, że można w nim wykorzystywać wszelkie klasy/metody z .Net Framework. To fantastyczne patrząc na to z punktu widzenia pracy z SQL, bo właściwie w .NET istnieje zbiór metod pozwalający na pracę z SQL. Przyjrzyjmy się na przykład wywołaniu procedury składowanej sp_helpdb wykonywanej z poziomu powershell.

Zacznijmy od tego, że wcale nie trzeba ładować żadnych dodatkowych bibliotek (porównaj z artykułem „Co to jest SMO„). Tworząc obiekt, wywołujesz po prostu konstruktor danej klasy. Tutaj tworzymy obiekt klasy SqlConnection i wypełniamy jego właściwość ConnectionString, co określa gdzie będziemy się łączyć.

$SqlConnection = New-Object -TypeName System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=localhost;Database=AdventureWorks2014;Integrated Security=True"

Teraz pora na określenie, jakie polecenie ma być uruchomione. Tworzymy obiekt SqlCommand i określamy właściwości CommandText (nazwa procedury do uruchomienia), Connection (wskazujące na wcześniej utworzony obiekt SqlConnection) i CommandTimeout.

$SqlCommand = New-Object -TypeName System.Data.SqlClient.SqlCommand
$SqlCommand.CommandText = "sp_helpdb"
$SqlCommand.Connection = $SqlConnection
$SqlCommand.CommandTimeout = 0

Dane odczytamy dzięki SqlAdapterowi. Jedyna właściwość, jaką trzeba zdefiniować to SelectCommand (wskazujemy na wcześniej zdefiniowany SqlCommand):

$SqlAdapter = New-Object -TypeName System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCommand

Adapter musi gdzieś zapisać dane. Posłuży mu do tego obiekt DataSet. DataSet może składać się z kilku tabel, choć u nas wykorzystamy tylko jedną. W takim przypadku można było wykorzystać nawet sam obiekt DataTable.

$DataSet = New-Object -TypeName System.Data.DataSet

No i pora na uruchomienie polecenia. Jeżeli gdzieś wcześniej mamy jakiś błąd, to zapewne informacja o tym, że coś jest źle pokaże się dopiero tutaj. SqlAdapter wykorzystując SelectCommand połączył się do SqlConnection i dane zapisał w DataSet:

$SqlAdapter.Fill($DataSet)

Po wszystkim połączenie można zamknąć:

$SqlConnection.Close()

A na zakończenie można „skonsumować” wynik. Tutaj pytamy  najpierw o ilość tabel (powinno wyjść 1), a potem wyświetlimy rekordy z tabeli zerowej (numeracja jest od 0).

$DataSet.Tables.Count
$DataSet.Tables[0]

Ponieważ większość/jeśli nie wszystkie czynności można w SQL wykonać za pomocą zapytań i procedur, masz właściwie gotowy przepis na odczytywanie danych z serwera i zmianę jego konfiguracji. Jako wady tego rozwiazania należy wymienić stosunkowo dużą liczbę poleceń do zapisania w skrypcie aby uzyskać wynik oraz niezbędną znajomość klas ADO.NET. A zalety, to stosunkowa „lekkość rozwiązania”. Nie trzeba było ładować żadnych dodatkowych modułów, a co za tym idzie również instalować ich na systemie.

Komentarze:

  1. Mobilo » Blog Archive » Powershell i SQL 08 – informacje o instancji napisał,

    […] W kolejnym przykładzie, spróbujemy uzyskać kilka informacji o instancji. Ponieważ informacje wyciągniemy z serwera wykorzystując zapytanie, przy okazji dowiesz się także jak uruchamiać zapytania na wybranej instancji SQL serwera w inny sposób niż pokazaliśmy to w części drugiej serii. […]

Autor: admin