R12-T.DOC

(376 KB) Pobierz
Szablon dla tlumaczy

Rozdział 12.
Zastosowanie zaawansowanych technik obsługi danych

Bardzo szybko poznawałeś różne metody dostępu do danych. Teraz, kiedy już opanowałeś podstawy, nadszedł czas aby przejść na kolejny, bardziej zaawansowany poziom. W tym rozdziale skoncentrujemy się na technikach bardziej zaawansowanych w porównaniu z tymi, przedstawionymi w poprzednich częściach niniejszej książki. Poznasz w nim nowe bazy danych oraz nowe metody operowania na danych XML, które umożliwią Ci tworzenie profesjonalnych aplikacji internetowych.

W pierwszej kolejności przyjrzymy się metodom pobierania informacji przy użyciu parametrów i procedur zachowanych. Parametry pozwalają na tworzenie zapytań w sposób bardziej efektywny. Procedury zachowane są natomiast przygotowywanymi wcześniej poleceniami SQL, których wykorzystanie przynosi wiele korzyści, do których należy zaliczyć zwiększenie szybkości działania aplikacji oraz poprawienie jej przejrzystości. Dowiesz się także, w jaki sposób, poprzez wykorzystanie transakcji, można zapewnić, że polecenia SQL będą wykonywane poprawnie.

W drugiej części tego rozdziału znajdziesz dodatkowe informacje na temat języka XML. Poznasz klasę XmlNavigator, której można używać podobnie  jak klasy XmlDocument. Wykorzystując obiekty tej klasy, można zadawać pytania XPath oraz wykonywać przekształcenia XSL. XPath to języka zapytań stosowany wraz z językiem XML, natomiast XSL to język pozwalający na przekształcanie plików XML do postaci wszelkich innych dokumentów strukturalnych, takich jak na przykład dokumenty HTML. Aby stać się ekspertem w dziedzinie ASP.NET koniecznie należy poznać wiele różnych sposobów umożliwiających uzyskanie tego samego rezultatu. Po przeczytaniu tego rozdziału będziesz już znał kilka różnych sposobów pobierania informacji z baz danych oraz plików XML.

W tym rozdziale omówione zostaną następujące zagadnienia:

·         Czym są zapytania parametryzowane oraz jak należy je stosować.

·         Czym są procedury zachowane oraz jak należy je stosować.

·         Jak wykorzystywać transakcje.

·         Jakie są inne sposoby odczytywania zawartości dokumentów XML.

·         Sposoby przeszukiwania plików XML.

·         Sposoby przekształcania plików XML.

Zaawansowane techniki obsługi baz danych

Jak na razie wszelkie operacje związane z wykorzystaniem baz danych były wykonywane przy użyciu obiektów OleDbDataAdapter, OleDbCommand, DataSet oraz kilku innych. Dostarczają one wszelkich możliwości funkcjonalnych potrzebnych przy tworzeniu aplikacji ASP.NET. Jednak nie poznałeś jeszcze wszystkich możliwości jakie obiekty te dają, w szczególności chodzi tu o parametry, procedury zachowane oraz transakcje.

Parametry są nowym sposobem tworzenia dynamicznych poleceń SQL. Otóż zamiast tworzyć pytanie SQL składając je z fragmentów pochodzących z wielu różnych źródeł, można wykorzystać parametry, które poinformują bazę danych jakie informacje należy zwrócić. Takie rozwiązanie jest nie tylko prostsze, lecz także bardziej eleganckie. Procedury zachowane są natomiast przygotowywanymi wcześniej poleceniami SQL, które mogą poprawić efektywność działania aplikacji. Wykorzystanie procedur zachowanych wraz z parametrami stanowi doskonały sposób przeszukiwania i pobierania informacji z baz danych. Transakcje pozwalają natomiast na zapewnienie integralności i poprawności informacji poprzez wykonywanie operacji na bazach danych zgodnie z paradygmatem „wszystko albo nic”. Oznacza to, że zostaną wprowadzone wszystkie modyfikacje lub nie zostanie wprowadzona żadna z nich. Poznasz także kilka najczęstszych sytuacji, w których są wykorzystywane transakcje.

Dzięki tym zaawansowanym technikom obsługi baz danych będziesz w stanie tworzyć aplikacje o znacznie większych możliwościach, a jednocześnie poprawić efektywność ich działania.

Zapytania sparametryzowane

Wyobraź sobie proces budowy domu. Konieczna jest przy tym szczegółowa znajomość wymiarów elementów konstrukcyjnych oraz miejsc, w których należy ich użyć. Jednym ze sposobów realizacji tego zagadnienia byłoby zebranie wszystkich elementów i zapisanie wszystkich informacji bezpośrednio na nich. Na wszystkich panelach podłogowych, oknach, ościeżnicach, rurach i wszelkich innych elementach, zostałyby zapisane wymiary oraz docelowe położenie. Taka metoda mogłaby spełnić swoje zadanie, lecz jednocześnie jest bardzo niedokładna i może stać się przyczyną wielu problemów. Zamiast niej, można jednak wykorzystać plan — kartkę papieru, która informuje gdzie mają być umieszczone poszczególne elementy i jak je należy połączyć.

Podobnie rzecz się ma z dostępem do danych. Gdy tworzone jest polecenie SQL, można zebrać poszczególne jego elementy i połączyć je ze sobą w jeden łańcuch znaków, zapisując jednocześnie informacje o tym za co odpowiadają jego poszczególne części. Można jednak wykorzystać bardziej zorganizowaną metodę określenia, gdzie należy umieścić poszczególne informacje. Ta druga metoda wykorzystuje parametry — fragmenty informacji tworzone niezależnie od polecenia SQL i używane w nim. Bazy danych posługują się parametrami w taki sam sposób, w jaki budowniczy korzystają z planów.

Parametry wykorzystywane są w raz z obiektami OleDbCommand w celu podania dodatkowych informacji, takich jak dane, które należy zwrócić lub sposób ich zapisania w obiekcie DataSet. Przypomnij sobie informacje dotyczące poleceń SQL podane w rozdziale 10, pt.: „Korzystanie z baz danych za pomocą obiektów ADO.NET”. Aby dynamicznie stworzyć zapytanie, niejednokrotnie trzeba pobierać informacje z różnych elementów kontrolnych wykorzystywanych na stronach ASP.NET. Przykładowo, wyobraź sobie następujące zapytanie:

strSQL = "select * from tblUsers where UserID = 1"

 

Wartość UserID mogłaby pochodzić z pola tekstowego wyświetlonego na stronie. A zatem, można by stworzyć zapytanie w następujący sposób (zakładając, że tbId jest nazwą pola tekstowego):

strSQL = "select * from tblUsers where UserID = " & tbId.Text

 

Powyższa metoda spełnia swoje zadanie jeśli chodzi o zapewnienie możliwości dynamicznego stworzenia zapytania SQL, jednak nie jest „zorganizowana”. Co by się bowiem stało gdyby na stronie były inne pola tekstowe? Wtedy mogłyby się pojawić problemy z określeniem, które z pól powinno zawierać jakie informacje; największe problemy mieliby inni programiści próbujący przeanalizować kod strony.

Nowe określenie

Jednak bardziej efektywną metodą jest użycie parametrów. Parametr jest wartością przekazywaną do, bądź zwracaną przez zapytanie. Wykorzystanie parametrów pozwala na zachowanie przejrzystości informacji i ułatwia analizę stosowanych zapytań. Zastąpmy zatem poprzednie zapytanie, zapytaniem sparametryzowanym:

strSQL = "select * from tblUsers where UserID = @ID"

 

Jak widać dynamicznie tworzona część łańcucha znaków została zastąpiona parametrem zapytania, oznaczonym przy użyciu symbolu @. Zauważ, iż parametr ten stanowi część zapytania SQL. Teraz, w jakimś miejscu, należy podać wartość tego parametru. Wartości parametrów określane są przy użyciu kolekcji Parameters obiektu OleDbCommand (więcej informacji na jego temat znajdziesz w rozdziale 10). Przykład wykorzystania sparametryzowanych zapytań SQL przedstawiłem na listingu 12.1.

 

Listing 12.1.              Określanie wartości parametrów zapytania SQL — fragment kodu

1           dim objCmd as OleDbCommand = new OleDbCommand _

2             ("select * from tblUsers where UserID = @ID", Conn)

3            

4           dim objParam as OleDbParameter

5           objParam = objCmd.Parameters.Add("@ID", OleDbType.Integer)

6           objParam.Direction = ParameterDirection.Input

7           objParam.Value = tbId.Text

 

Analiza

W wierszach 1. oraz 2., w normalny sposób jest tworzony obiekt OleDbCommand (zakładam przy tym, że został już utworzony obiekt OleDbConnection o nazwie Conn). Warto zwrócić uwagę na wiersz 2., w którym tworzone jest zapytanie sparametryzowane. W wierszu 4. tworzony jest obiekt OleDbCommand, który zostanie wykorzystany do przekazania wartości parametru do zapytania SQL. W wierszu 5. parametr użyty w zapytaniu jest dodawany do obiektu OleDbCommand, a jednocześnie określana jest jego nazwa i typ. Nazwa parametry podana w wywołaniu metody Add musi odpowiadać parametrowi użytemu w zapytaniu SQL (w tym przypadku musi ona mieć postać @ID). Typ jest wartością OleDbType i reprezentuje typ przekazywanej wartości parametru. Najczęściej stosowane wartości typów przedstawione zostały w tabeli 12.1.

 

Tabela 12.1.              Najczęściej stosowane wartości OleDbType

Typ

Opis

Binary

Strumień bajtów (odpowiada tablicy bajtów)

Boolean

Wartość logiczna

BSTR

Łańcuch znaków (odpowiada wartości typu String)

Char

Łańcuch znaków (odpowiada wartości typu String)

Currency

Wartość monetarna (odpowiada wartości typu Decimal)

Date

Data (odpowiada wartości typu DateTime)

Decimal

Wartość typu Decimal

Double

Wartość typu Double

Empty

Brak wartości

Error

32-bitowy kod błędu (odpowiada wartości typu Exception)

Integer

32-bitowa liczba całkowita (odpowiada wartości typu Integer)

LongVarChar

Długi łańcuch znaków (odpowiada wartości typu String)

VarChar

Łańcuch znaków (odpowiada wartości typu String)

Variant

Specjalny typ danych, który może reprezentować dane dowolnego typu, jeśli żaden typ nie został określony (odpowiada wartości typu Object)

 

W wierszu 6. określany jest rodzaj parametru[1]. W tym przypadku parametr będzie wykorzystywany jako element zapytania SELECT, a zatem jego wartość będzie przekazywana do zapytania. Stąd też, właściwości określającej rodzaj zostanie przypisana wartość Input. Gdyby wartość była zwracana i zapisywana w parametrze, to jego rodzaj należałoby określić jako Output. Więcej informacji na temat kierunków przekazywania informacji przez parametry podam w dalszej części rozdziału, poświęconej procedurom zachowanym.

W końcu, w wierszu 7., określana jest wartość parametru; w tym przypadku zostaje jej przypisana zawartość pola tekstowego tbId. Dowolne informacje podane w tym polu tekstowym zostaną zatem przekazane jako parametr do zapytania select. Przeanalizuj teraz pełny kod przykładu, podany na listingu 12.2.

 

Listing 12.2.              Wykorzystanie parametrów do pobierania informacji z baz danych

1           <%@ Page Language="VB" %>

2           <%@ Import Namespace="System.Data" %>

3           <%@ Import Namespace="System.Data.OleDb" %>

4            

5           <script runat="server">

6              dim Conn as new OleDbConnection("Provider=" & _

7                       "Microsoft.Jet.OLEDB.4.0;" & _

8                       "Data Source=C:\ASPNET\Data\banking.mdb")

9             

10           sub GetData(obj as Object, e as EventArgs)

11              dim objCmd as OleDbCommand = new OleDbCommand _

12                ("select * from tblUsers where UserID = @ID", Conn)

13              dim objReader as OleDbDataReader

14              dim objParam as OleDbParameter

15             

16              objParam = objCmd.Parameters.Add("@ID", _

17                OleDbType.Integer)

18              objParam.Direction = ParameterDirection.Input

19              objParam.Value = tbId.Text

20             

21              try

22                objCmd.Connection.Open()

23                objReader = objCmd.ExecuteReader

24              catch ex as OleDbException

25                Label1.Text = "Błąd pobierania informacji z bazy danych....

Zgłoś jeśli naruszono regulamin