Artykuł pochodzi w serii przygotowań do egzaminu 70-562 ASP.NET.
W ostatnich trzech artykułach z serii przygotowań do egzaminu 70-562 opisywane były sposoby pracy nad danymi przy wykorzystaniu ADO.NET. Klasy przedstawione w tych wpisach pokazywały jak programista może zrobić sobie za ich pomocą abstrakcyjną warstwę dostępu do danych. Jednak często, w szczególności przy prostych aplikacja www wykorzystywanie ADO.NET jest czasochłonne i nie wygodne. Na szczęście ASP.NET udostępnia zbiór kontrolek dostępu do danych, za pomocą których w sposób deklaratywnych można uzyskać dostęp do danych. Kontrolki te stanowią opakowanie kod ADO.NET, dzięki czemu pracuje się z nimi w miarę prosto i wygodnie. W artykule zostaną opisane następujące kontrolki: ObjectDataSource, SqlDataSource, LinqDataSource, AccessDataSource, XmlDataSource, SiteMapDataSource.
Zrozumieć kontrolki źródła danych
Kontrolki źródła danych ASP.NET zarządzają zadaniami takimi jak wyciąganie, aktualizacja, dodawanie, usuwanie danych na stronie. Kontrolki źródła danych w docelowym kodzie html stronie nie mają swojego odwzorowania. Odpowiadają tylko za zarządzanie danymi. W celu wyświetlania danych programista musi skorzystać z innych kontrolek stworzonych w tym celu (np. DetailsView, GridView, które będę opisane w następnym artykule).
Wszystkie kontrolki źródła danych znajdują się w przestrzeni nazw System.Web.UI.WebControls, a poniżej znajduje się rysunek z strukturą klas.
Praca z wszystkimi kontrolkami źródła danych jest bardzo podobna. Pierw, aby skorzystać z kontrolki musimy ją przeciągnąć z toolboxa na formatkę strony, następnie skonfigurować, a na koniec podpiąć do kontrolki, która zaprezentuje użytkownikowi dane. Skonfigurować kontrolkę można na dwa sposobu: ustawiając odpowiednie atrybuty kontrolki w znacznika ASP.NET lub skorzystać z kreatora znajdującego się w Visual Studio (poniżej zrzut z jednego z widoków kreatora).
ObjectDataSource
Pierwszą kontrolką, którą opisze to ObjectDataSource. Kontrolkę tą można użyć w przypadku, gdy już mamy napisaną warstwę dostępu do danych (w ogólności klasę z metodą, która zwraca jakieś dane) i z niej operować na danych. Przykładowo mamy klasę Customer, a w niej metodę GetAllCustomer, która zwraca wszystkich klientów. Przykładowy kod poniżej:
1: public class Customer
2: {
3: private static string connectionString;
4:
5: public static DataTable GetAllCustomers()
6: {
7: SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Customer;", connectionString);
8:
9: DataSet dataSet = new DataSet("Customers");
10:
11: adapter.Fill(dataSet);
12:
13: return dataSet.Tables[0];
14: }
15: }
Aby skorzystać z kontrolki ObjectDataSource wystarczy ją dodać do formatki strony oraz ustawić dwie właściwości: TypName (określa typ jaki ma być wykorzystany przy wyciąganiu danych – przykładowo klasa Customer) oraz SelectMethod (określa metodę z typu, która ma być wywołana – GetAllCustomers). Poniżej kod ASP kontroli z ustawionymi oboma atrybutami:
1: <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" TypeName="Customer" SelectMethod="GetAllCustomers">
2: </asp:ObjectDataSource>
Kontrolki źródła danych umożliwiają nie tylko wyciąganie danych ale również dodawanie danych do źródła, ich aktualizację oraz usuwanie. W przypadku kontrolki ObjectDataSource, gdy mamy klasę robiące powyższe czynności wystarczy ustawić odpowiednie nazwy metoda dla odpowiednich atrybutów (DeleteMethod – metoda usuwające dane, InsertMethod – metoda dodająca dane oraz UpdateMethod – metoda aktualizująca dane).
Kontrolkę ObjectDataSource można tak skonfigurować, aby przekazywała parametry do metod (np. id klienta, który ma zostać usunięty). Parametry mogą pochodzić z różnych źródeł. Poniższa tabelka przedstawia dostępne opcje:
I tak jak chcemy przekazać do metody usuwającej klienta jego id, to do kontrolki dodajemy odpowiedni znacznik jak poniżej:
1: <DeleteParameters>
2: <asp:QueryStringParameter Name="id" QueryStringField="CustomerId" Type="Int32" />
3: </DeleteParameters>
I jak widać na listingu powyższym, parametr będzie pochodzi z adresu URL (znacznik QueryStringParameter), nazwę parametru z adresu URL ustawiamy za pomocą atrybutu QueryStringFiels (w przykładzie CustomerId), typ parametru za pomocą atrybutu Type (przykład Int32) oraz za pomocą atrybutu Name ustawiamy nazwę parametru w metodzie (w przykładzie id). Podobnie robimy dla pozostałych typów metod.
Kontrola ObjectDataSource umożliwia jeszcze kilka ciekawych rzeczy: filtrowanie danych, sortowanie, stronicowanie oraz keszowanie danych. Wystarczy ustawić odpowiednie właściwości kontrolki, aby wykorzystywać powyższe funkcje.
W przypadku filtrowania ustawiamy do właściwości kontroli FilterExpression wyrażenie filtrujące. Parametry do filtrowania możemy przekazać podobnie jak inne parametry. Przykład:
1: <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" TypeName="Customer" SelectMethod="GetAllCustomers"
2: FilterExpression="city='{0}'">
3: <FilterParameters>
4: <asp:QueryStringParameter Name="city" QueryStringField="city" Type="string" />
5: </FilterParameters>
6: </asp:ObjectDataSource>
W przypadku sortowania oraz stronicowania, to aby skorzystać z tych funkcjonalności metoda, która jest wykorzystywana do wyciągania danych (właściwość SelectMethod kontrolki ObjectDataSource) musi przyjmować trzy dodatkowe parametry: kolumnę do sortowania, numer indeksu, od które maja zostać wciągane wiersze danych oraz ilość wierzy do wyciągnięcia. Mając już poprawną metodę wystarczy ustawić odpowiednie właściwości kontrolki: EnablePaging na true, SortParameterName na nazwę parametru z metody, która określa kolumnę do sortowania, StartRowIndexParameterName na nazwę parametru z metody, który określa numer wiersza, od którego mają być pobierane dane oraz MaximumRowsParameterName na nazwę parametru metody, który określa ilość wierszy do wyciągnięcia.
Natomiast, aby wykorzystać keszowanie przy wyciąganiu danych za pomocą kontrolki wystarczy ustawić dwa atrybuty: EnableCaching na true oraz CacheDuration na ilość sekund przez jaki czas dane mają nie być wyciągane z źródła.
Z pozostałymi kontrolkami pracy wygląda bardzo podobnie i chęć elementów są identyczne, dlatego w opisie kolejnych kontrolkach będą zaznaczał te aspekty, które się różnią.
SqlDataSource
Kontrolka SqlDataSource służy do dostępu do danych znajdujących się w relacyjnych bazach danych takich jak SQL Server czy Oracl. Dodatkowo kontrolka umożliwia połączenia się z Open Database Connectivity (ODBC) oraz Object Linking and Embedding (OLE).
W przypadku SqlDataSource nie mamy właściwości typu SelectMethod jak w ObjectDataSource ale mamy właściwości typu [nazwaoperacji]Command (np. SelectCommand). Dodatkowo musimy ustawić jeszcze kilka właściwości: ConnectionString, w której jest zapisana informacja o sposobie połączenia z bazą danych, DataSourceMode, która ma dwie wartości DataReader oraz DataSet, informuje kontrolkę jakiego obiektu ADO.NET użyć do połączenia z bazą danych. Na koniec trzeba jeszcze ustawić typ komendy (np. SelectCommandType), tutaj również mamy dwie możliwości: Text oraz StoredProcedure.
Przykład zastosowania kontrolki SqlDataSource:
1: <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectingStrings:ConnectionString %>"
2: SelectCommandType="Text" SelectCommand="Select * from Customer where city=@city"
3: DataSourceMode="DataReader">
4: <SelectParameters>
5: <asp:SessionParameter SessionField="city" Name="city" Type="String" />
6: </SelectParameters>
7: </asp:SqlDataSource>
AccessDataSource
AccessDataSource służy do wyciągania danych z pliku Access, który jest elementem pakietu Microsoft Office. Jak widać na wcześniej załączonym rysunku AccessDataSource bezpośrednio dziedziczy z SqlDataSource, więc pracuje się z nią praktycznie identycznie. Różnica polega na tym, że zamiast właściwości ConnectionString ustawia się właściwość DataFile.
XmlDataSource
Kontrolka XmlDataSource służy do operacji na danych znajdujących się w pliku xml. Niestety kontrolka ta służy tylko do wyciągania danych z pliku. Nie wspiera operacji typu dodawanie, usuwanie, aktualizacja danych w pliku. Jeśli chcemy wykonywać takie operacje musimy napisać swój własny kod (metody pracy z plikami xml były opisywane w poprzedniej lekcji).
W celu pracy z kontrolką musimy ustawiać właściwość DataFile, na ścieżkę do pliku xml z danymi. Dodatkowo mają plik Extensible Stylesheet Language (XSL) możemy go podpiąć do kontrolki i za jego pomocą zmienić kształt oraz zawartość danych. Ścieżkę do pliku xsl ustawiamy za pomocą właściwości TransformFile.
LinqDataSource
ASP.NET umożliwia operacje na danymi za pomocą Linq. Deklaracja kontrolki LinqDataSource jest trochę inna od pozostałych kontrolek, co najlepiej zobaczyć na przykładzie:
1: <asp:LinqDataSource ContextTypeName="ExampleDataContext" TableName="Products" Where="Price > 50"
2: ID="LinqDataSource1" EnableUpdate="true" EnableInsert="true" EnableDelete="true"
3: runat="server">
4: </asp:LinqDataSource>
Najważniejszą właściwością w przypadku kontrolki LinqDataSource jest ContextTypeName, do której przekazujemy nazwę klasy, która została wygenerowana przez Linq i za pomocą, której wykonujemy wszystkie operacja na danych.
SiteMapDataSource
W aplikacjach ASP.NET istnieje specjalny plik Web.sitemap, w którym programista może zapisać strukturę aplikacji, na podstawie której można zbudować menu aplikacji. Plik Web.sitemap może wyglądać mniej więcej tak:
1: <?xml version="1.0" encoding="utf-8" ?>
2: <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
3: <siteMapNode url="default.aspx" title="Strona główna" description="Strona główna">
4: <siteMapNode url="customers.aspx" title="Klienci" description="Lista klientów" />
5: <siteMapNode url="products.aspx" title="Produkty" description="Lista produktów" />
6: </siteMapNode>
7: </siteMap>
Sama kontrolka
SiteMapDataSource nie wymaga specjalnej konfiguracji, aby działa.