Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Warstwa dostępu do danych Mainframe Directory RDBMS Email i wiadomości System plików ADO OLE DB XML Problemy Modele programistyczne –Połączeniowy (connected)

Podobne prezentacje


Prezentacja na temat: "Warstwa dostępu do danych Mainframe Directory RDBMS Email i wiadomości System plików ADO OLE DB XML Problemy Modele programistyczne –Połączeniowy (connected)"— Zapis prezentacji:

1 Warstwa dostępu do danych Mainframe Directory RDBMS i wiadomości System plików ADO OLE DB XML Problemy Modele programistyczne –Połączeniowy (connected) – oparcie o otwarte połączenia do systemu bazy danych (OLE DB, ADODB) –Bezpołączeniowy (disconnected) – pytanie/odpowiedź, bez-stanowy między zapytaniami (HTTP) Obsługa stanu Architektura ADO.NET Obiekty DataSet, Connection, Command, DataAdapter i ich współdziałanie Praca w trybie połączonym: DataReader Praca w trybie odłączonym: DataSet Modyfikacje źródła danych Obsługa procedur pamiętanych w b.d. Integracja z XML Transakcje LINQ, Entity Framework ADO.NET Data Services

2 Tryb połączeniowy W modelu klient – serwer każdy klient łączy się z bazą podczas startu aplikacji i zwalnia połączenie podczas jej zamykania Serwer musi utrzymywać oddzielne połączenia dla każego klienta Klienci Połączenia Serwer busy idle Możliwe niepotrzebne zużycie zasobów Tabele Wyniki zapytania Kursor rs Klient Serwer Serwery bazodanowe zapewniają dostęp do kursora przechowującego stan aktualnego wiersza –Dostęp do danych –Przesuwanie się przez MoveNext oraz MovePrevious

3 Tryb połączeniowy Połączenie tworzymy tylko raz Możemy ustawiać zmienne powiązane z sesją Szeroki dostęp do mechanizmów zabezpieczajacych dostarczonych przez bazę danych Pierwszy wiersz zapytania dostępny od razu Niepotrzebne zużycie zasobów Problemy ze skalowalnością Nie dostosowany do aplikacji webowych Użytkownicy się nie wylogowują Wahająca się liczba użytkowników Nie dostosowany do aplikacji wielowarstwowych Zalety Wady

4 Tryb bezpołączeniowy Połączenia są zwalniane zaraz po wykorzystaniu Obiekty danych wykorzystywane są również po zwolnieniu połączenia Połączenie jest nawiązywane by zapisać zmiany do bazy Klienci Połączenia Serwer busy idle Zasoby są używane tylko gdy są potrzebne Dane są dostarczane do klienta w jednej operacji Wyniki zapytania przechowywane w pamięci klienta Zasoby serwera są zwalniane Klient zarządza danymi w trybie off- line Ponowne połączenie z bazą by zapisać zmiany Wyniki zapytaniaKursor Klient rs Serwer Tabele

5 Tryb bezpołączeniowy Mniejsze zużycie zasobów serwera Modyfikacja danych jest szybsza i bardziej elastyczna Dane nie związane z połączeniem Łatwe przekazywanie między warstwami Wykorzystywane w aplikacjach wielowarstwowych oraz webowych Otwieranie i zamykanie połączeń jest kosztowne Wczytywanie dużych ilości danych jest czasochłonne Zużycie zasobów po stronie klienta Mniej opcji zarządzania bezpieczeńswem Zalety Wady

6 Architektura ADO.NET Database DataSet Tables DataTable DataRowCollection DataColumnCollection ConstraintCollection DataRelationCollection XML.NET Data Provider Connection Transaction Command Parameters DataReader DataAdapter SelectCommand InsertCommand UpdateCommand DeleteCommand ReadXml WriteXml Update Fill.NET data provider jest to zestaw klas, za pomocą których podłaczamy się do źródła danych oraz pobieramy i aktualizujemy dane

7 ADO.NET Object Model Klasa Opis Connection Umożliwia nawiązanie połączenia z określonym źródłem danych CommandWywołuje polecenie na źródle danych. Udostępnia kolekcję parametrów (Parameters) i zawsze działa w kontekście otwartego połączenia (Connection) DataReader Udostępnia jednokierunkowy (rekord po rekordzie) strumień danych ze źródła, w trybie 'tylko do odczytu' DataAdapterWypełnia DataSet danymi pochodzącymi ze źródła oraz umożliwia aktualizacje danych w źródle na podstawie DataSet-u (kanał łączący obiekt DataSet z dostawcą danych) Connection Command Parameter DataReader Transaction DataAdapter DataSet DataTable DataColumn DataRow Constraint DataRelation.NET Data Provider

8 ADO.NET Class hierarchy Interfejsy IDbConnection IDbCommand IDbTransaction IDataReader Abstrakcyjne klasy bazowe DbConnection DbCommand DbTransaction DbDataReader Implementacja specjalizowana OleDb: implementacja dla OLEDB Sql: implementacja dla SQL Server Oracle: implementacja dla Oracle Odbc: implementacja dla ODBC

9 Tworzenie połączenia SqlConnection Parametry ConnectionString –Connection timeout: dopuszczalny czas uzyskania połączenia –Data source: nazwa instancji SQL Server lub nazwa komputera –Initial catalog: nazwa bazy danych –Integrated security; gdy True połączenie z SQL serwerem na podstawie tożsamości konta procesu ASP.NET –User ID: konto logowania SQL Server –Password: –… string strConn = "data source=localhost; " + "initial catalog=northwind; integrated security=true"; SqlConnection conn = new SqlConnection(strConn); / Łańcuch połączenia (ang. connection string) - ciąg znaków zawierających parametry konfiguracji połączenia

10 Połączenie: Tworzenie połączenia public interface IDbConnection { string ConnectionString {get; set;} int ConnectionTimeout {get;} string Database {get;} ConnectionState State {get;} IDbTransaction BeginTransaction(); IDbTransaction BeginTransaction(IsolationLevel il); void ChangeDatabase(string db); void Close(); IDbCommand CreateCommand(); void Open(); } BeginTransaction – Rozpoczyna tranzakcję Open, Close – Otwieranie i zamykanie połączenia CreateCommand – Tworzy obiekt Command powiązany z połączeniem ConnectionTimeout – Określenie czasu timeoutu połączenia Database – Nazwa bazy dla połączenia State – Zwraca stan aktualnego połączenia: Broken, Closed, Connecting, Executing, Fetching, or Open. ChangeDatabase – Zmiana bazy dla otrawtego połącznia

11 ConnectionString - zarządzanie Umieszczamy w sekcji pliku konfiguracyjnego... < add name=Northwind providerName=System.Data.SqlClient connectionString=server=(local); integrated security=SSPI;database=Northwind / > private DbConnection GetDatabaseConnection ( string name ) { ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings[name]; DbProviderFactory factory = DbProviderFactories.GetFactory(settings.ProviderName ); DbConnection conn = factory.CreateConnection ( ) ; conn.ConnectionString = settings.ConnectionString ; return conn ; }

12 Wydajne używanie połączeń try... catch... finally try { // Open the connection conn.Open(); DoSomething(); } catch ( SqlException ex ) { //Log the exception } finally { conn.Close ( ) ; } Blok using try { using (SqlConnection conn = new SqlConnection(source)) { // Open the connection conn.Open ( ) ; DoSomething(); } catch (SqlException e) { // Log the exception } using – zapewnia wywołanie Dispose() najwcześniej jak to możliwe, poprzez zdeklarowanie używanych obiektów i określeniu przez nawiasy {} zasięgu tych obiektów

13 Pula połączeń Connection pooling – proces utrzymywania otwartych połączeń i ponownego ich reużycia dla uzytkownika lub kontekstu Parametry ConnectionString dla poolingu –Connection Lifetime: długość oczekiwania połączenia na ponowne użycie –Max Pool Size: maksymalna liczba połączeń –Min Pool Size: Minimalna liczba połączeń –Pooling: True/False –… cnNorthwind.ConnectionString = _ "Integrated Security=True;" & _ "Initial Catalog=Northwind;" & _ "Data Source=London;" & _ "Pooling=True;" & _ "Min Pool Size=5;" & _ "Connection Lifetime=120;"

14 ADO.NET – modele programowania ADO.NET zapewnia dostęp do obu typów programowania – Połączeniowy Używa obiektów Command i DataReader DataReader służy do odczytu w przód Zmiany/aktualizacje odbywają się przez obiekt Command – Bezpołączeniowy Używa obiektów DataSet do przechowywania danych u klienta DataAdapter obsługuje komunikację miedzy obiektemDataSet a serwerem Obiekty DataSet są niezależne od providera Obiekty DataSet są przechowywane oraz przesyłane przez XML

15 Obiekt Command Parameters –Parametry, z którymi zostanie wykonane zapytanie public interface IDbCommand { string CommandText {get; set;} int CommandTimeout {get; set;} CommandType CommandType {get; set;} IDbConnection Connection {get; set;} IDbTransaction Transaction {get; set;} UpdateRowSource UpdatedRowSource {get; set;} IDataParameterCollection Parameters {get;} void Cancel(); IDataParameter CreateParameter(); int ExecuteNonQuery(); IDataReader ExecuteReader(); IDataReader ExecuteReader(CommandBehavior cb); object ExecuteScalar(); void Prepare(); // Note ExecuteXmlReader (SqlCommand only) } Connection - referencja do obiektu połączenia CommandType - typ polecenia –Text – wyrażenie SQL –StoredProcedure CommandText - w zależności od wyboru typu plecenia: –Text – treść polecenia SQL –StoredProcedure – nazwa procedury

16 Metody wywołania obiektu Command Zapytanie nie zwraca wierszy – Wywołanie ExecuteNonQuery Zwraca liczbę wierszy dotkniętych przez zapytanie – Zapytania DDL and DCL CREATE, ALTER, DROP, GRANT, DENY, REVOKE – Zapytaia DML INSERT, UPDATE, DELETE Zapytanie zwraca pojedynczą wartość – Wywołanie ExecuteScalar ExecuteScalar zwraca typ Object Zapytanie zwraca wiersz – Metoda ExecuteReader Zwraca obiekt DataReader Reader zależny od providera: SqlDataReader, OleDbDataReader – DataReader Służy tylko do odczytu, możliwe przesuwanie tylko w przód Zapytanie zwraca XML – ExecuteXmlReader – dostępny tylko dla SQL Server

17 Command - przykład private void Demo() { SqlConnection con = new SqlConnection( "Server=localhost; Database=Pubs; Integrated Security=SSPI" ); SqlCommand cmd = new SqlCommand( "SELECT COUNT( * ) FROM Authors", con ); con.Open(); Console.WriteLine( cmd.ExecuteScalar() ); // Writes '23' con.Close(); // Important! }

18 Asynchroniczne wywołanie Command ADO.NET 2.0 wspiera tryb asynchroniczny Wykonanie poleceń w tle IAsyncResult BeginExecuteReader (AsyncCallback callback) IDataReader EndExecuteReader (AsyncResult result) IAsyncResult BeginExecuteNonQuery (AsyncCallback callback) int EndExecuteNonQuery (IAsyncResult result) IAsyncResult BeginExecuteXmlReader (AsyncCallback callback) IDataReader EndExecuteXmlReader (IAsyncResult result)

19 Asynchroniczny Command - przykład... public class Async { SqlCommand cmd; //---- command which should be executed asynchronously public void CallCmdAsync() { SqlConnection conn = new SqlConnection( "Data Source=(local)\\NetSDK...; Asynchronous Processing=true"); cmd = new SqlCommand("MyLongRunningStoredProc", conn); cmd.CommandType = CommandType.StoredProcedure; conn.Open(); //---- start asynchronous execution of command cmd.BeginExecuteNonQuery(new AsyncCallback(AsyncCmdEnded), null);... } //---- callback method called at the end of the execution of command public void AsyncCmdEnded(IAsyncResult result) { //---- process result of command int affectedRows = cmd.EndExecuteNonQuery(result);... } Callback when query is finished

20 Zapytania parametryzowane Command pozwala na definiowanie parametrów wejściowych i wyjściowych Parameter - pola –Name: nazwa parametru –Value: wartość parametru –DbDataType: typ danych –Direction: kierunek parametru -Input -Output -InputOutput -ReturnValue IDataParameterCollection Parameters {get;}

21 Zapytania parametryzowane - przykład 2.Dodanie parametru cmd.Parameters.Add( new OleDbType.BigInt)); SqlCommand cmd = new SqlCommand(); cmd.CommandText = "DELETE FROM Empls WHERE EmployeeID 1.Zdefiniowanie zapytania SQL Server: Identyfikacja parametru 3.Przypisanie wartości = 1234; cmd.ExecuteNonQuery();

22 Tryb połączeniowy: DataReader Tylko do odczytu w przód Szybki dostęp Praca w trybie połączeniowym Programista zarządza połączeniem i danymi Małe zużycie zasobów Użycie DataReader: 1.Stwórz i otwórz połączenie 2.Stwórz obiekt Command 3.Stwórz DataReader dla obiektu Command 4.Odczytaj dane 5.Zamknij DataReader 6.Zamknij połączenie Użycie w bloku Try…Catch…Finally public interface IDataReader { int Depth {get;} bool IsClosed {get;} int RecordsAffected {get;} … void Close(); DataTable GetSchemaTable(); bool NextResult(); bool Read(); … } DataReader – Odczyt strumienia danych zwróconych przez zapytanie NextResult - Przejście do kolejnego zestawu wyników Read – Przechodzi do następnego rekordu

23 Praca z IDataReader - przykład object[ ] dataRow = new object[reader.FieldCount]; int cols = reader.GetValues(dataRow); Przeczytaj kolumny do tablicy object val0 = reader[0]; object nameVal = reader["LastName"]; Odczyt za pomocą indekserów string firstName = reader.getString(2); Odczyt za pomocą metod } reader.Close(); Zamknięcie obiektu IDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Stwórz obiekt i rozpocznij odczyt

24 Odczyt danych z obiektu DataReader Wołanie Read dla każdego rekordu –Zwraca false gdy brak danych Dostęp do pól –Dostęp poprzez indeks lub nazwę –Funkcje Get… - najlepsza wydajność Zamknięcie DataReader Zamkniecie połączenia while (myReader.Read()) { str += myReader[1]; str += myReader["field"]; str += myReader.GetDateTime(2); } while (myReader.Read()) { str += myReader[1]; str += myReader["field"]; str += myReader.GetDateTime(2); } // Open Connection and create command SqlConnection conn = new SqlConnection("data source=localhost; initial catalog=pubs; integrated security=true"); SqlCommand cmdAuthors = new SqlCommand("select * from Authors", conn); conn.Open(); // Create DataReader and read data SqlDataReader dr; dr = cmdAuthors.ExecuteReader(); while (dr.Read()) { lstBuiltNames.Items.Add(dr["au_lname"] + ", " + dr["au_fname"]); } // Close DataReader and Connection dr.Close(); conn.Close();

25 Transakcje Transakcje lokalne – Dostęp z jednego połączenia – Udostępnione przez ADO.NET Transakcje rozproszone – Wykonywane na wielu połączniacj – Użycie Microsoft Distributed Transaction Component (MSDTC) – namespace System.Transaction

26 Transkacje lokalne ADO.NET wspiera tranzakcyjność –Transakcję rozpoczynamy poprzez metodę BeginTransaction która zwraca obiekt transakcji. –Transakcja wspiera metody wykonujące zmiany na bazie danych – polecenia (Command) Transakcja jest –Zatwierdzana poprzez Commit –Wycofywana poprzez Rollback

27 Transakcje - przykład 2.Stworzenie obiektów IDbCommand cmd1 = con.CreateCommand(); cmd1.CommandText = "DELETE [OrderDetails] WHERE OrderId = 10258"; cmd1.Transaction = trans; cmd1.ExecuteNonQuery(); IDbCommand cmd2 = con.CreateCommand(); cmd2.CommandText = "DELETE Orders WHERE OrderId = 10258"; cmd2.Transaction = trans; cmd2.ExecuteNonQuery(); SqlConnection con = new SqlConnection(connStr); IDbTranaction trans = null; try { con.Open(); trans = con.BeginTransaction(IsolationLevel.ReadCommitted); 1. Definicja trans.Commit(); catch (Exception e) { if (trans != null) trans.Rollback(); } finally { try { con.Close(); } 3. Zatwierdzenie lub cofnięcie wyników

28 Poziomy izolacji Definiują blokady na odczyt i zapis ADO.NET zapewnia różne poziomy izolacji ReadUncommittedDostęp do zablokowanych danych Dirty reads ReadCommittedOdczyt zablokowanych wierszy zabroniony Brak dirty read, może wystąpić phantom row Non-repeatable reads RepeatableReadReadCommitted bez non-repeatable reads SerializableDostęp w seriach Najwyższy poziom izolacji Nie występują phantom rows public enum IsolationLevel { ReadUncommitted, ReadCommitted, RepeatableRead, Serializable,... }

29 2.3.3 Tryb bezpołączeniowy: use DataSet Database 4.Zwraca DataSet do klienta 5.Zmiana danych przez użytkownika 2.Tworzenie obiektów SqlConnection i SqlDataAdapter 3.Wypełnienie DataSet z DataAdapter i zamknięcie połączenia SqlDataAdapter SqlConnection List-Bound Control 1.Klient tworzy żądanie wyświetlenia strony Aktualizacja danych DataSet 7.Użycie SqlDataAdapter do otwarcia połączenia SqlConnection, aktualizacja danych w bazie i zamknięcie połączenia Client Web server DataSet

30 Czym jest DataSet? DataSet zawiera wiele DataTables Relacje są reprezentowane poprzez DataRelation Można wymusić Constrainst Dostęp do danych w tabelach poprzez DataRow i DataColumn DataTable DataColumn DataRow DataRelation Tables DataTable Relations DataRelation DataRow(s) DataColumn Constraint(s) DataTable DataViewManager DataView DataSet – baza danych utrzymywana w pamięci(struktuwa relacyjna)

31 Stosowanie obiektu DataSet gdy dane muszą być edytowane lub gdy do bazy trzeba dodawać i usuwać rekordy. gdy zachodzi potrzeba organizowania danych - filtrowania, sortowania czy wyszukiwania gdy rekordy pobrane z bazy danych będą przetwarzane w wielu iteracjach gdy wynikowy zbiór danych pomiędzy kolejnymi odwołaniami do tej samej strony musi zostać zachowany w obiekcie Session lub Cache. do przekazywania wyników działania obiektów warstwy biznesowej i usług Web Service – odłączony obiekt DataSet może być serializowany do postaci XML i przesyłany z wykorzystaniem protokołu HTTP

32 DataSet vs. DataReader DataSetDataReader Operacje odczytu i zapisuTylko do odczytu Wiele tabel z różnych źródełOparty o jedno polecenie SQL BezpołączeniowyPołączeniowy Źródło dla wielu kontrolekŹródło dla jednej kontrolki Przesuwanie się w przód i tyłPrzesuwanie tylko do przodu Wolniejszy dostępSzybszy dostęp Wspierany przez narzędzia automatyzujące pracęWymaga ręcznej implementacji

33 Diagram klasy DataSet

34 Klasa DataSet Dostęp do: DataTable – DataSet.Tables[0] – DataSet.Tables[tablename] DataColumn – DataTable.Columns[0] – DataTable.Columns[columnname] DataRow – DataTable.Rows[0] Pola tabeli – DataRow[0] – DataRow[columnname] DataSet składa się z –Kolecji DataTable –Kolekcji DataRelation DataTable składa się z –collection of DataTableColumns (= schema definition) –collection of DataTableRows (= data) –DefaultView (DataTableView) DataRelation –Łączy dwa obiekty DataTable –definiujue ParentTable i ParentColumns oraz ChildTable i ChildColumns

35 Typowany i nietypowany DataSet Typowany dataset jest datasetem, który dziedziczony jest z bazowej klasy DataSet, a następnie na podstawie informacji z bazy danych generuje nową klasę. Informacje o typach (tabele, kolumny, relacje, …) są dołączane do obiektu. – VS daje możliwość automatyczniej generacji typowanych datasetów – Może zostać zbudowany w oparciu o dane z pliku XSD – Mniej podatne na błędy – Mniejsza elastyczność Nietypowany dataset nie posiada wbudowanego schematu. Zawiera również tabele, wiersze, kolumny, jednak są one udostępniane jako zwykłe kolekcje – Rozwiązanie bardziej elastyczne, umożliwia pracę z nieznannym źródłem Porównanie: – Poprawne dla obu typów: MyDataSet.Tables[News].Rows[0][Title] – Poprawne tylko dla typowanego DataSet + zwraca dane we właściwym formacie MyDataSet.News[0].Title

36 Zdarzenia w DataTable Podział na trzy kategorie: Dla kolumn: ColumnChanging, ColumnChanged – DataColumnChangeEventsArgs: Column, ProposedValue, Row Dla wierszy: RowChanging, RowChanged, RowDeleting, RowDeleted – DataRowChangeEventArgs: Action (Add, Change, ChangeCurrentAndOriginal, ChangeOriginal, Commit, Delete, Nothing, Rollback), Row Dla tabel: TableClearing, TableCleared, TableNewRow – DataTableClearEventArgs: Table, TableName, TableNamespace – DataTableNewRowEventArgs key member: Row

37 Wypełnianie DataSet: DataAdapter DataAdapter służy jako most pomiędzy DataSetem a źródłem danych pozwalający na wymianę danych. DataAdapter reprezentuje zestaw poleceń oraz połączenie bazodanowe które są uzywane do wypełnia DataSet oraz aktualizacji bazy. Dane są wymieniane poprzez zapytania SQL lub procedury składowane. DataAdapter - właściwości: –SelectCommand – odczytuje dane ze źródła –InsertCommand – zapisuje dane z DataSet do bazy –UpdateCommand – aktualizuje dane w bazie danymi z DataSet –DeleteCommand – usuwa dane z DataSer DataAdapter – metody: –Fill – odświeża DataSet danymi z bazy (używa SELECT) –Update – przenosi zmiany z DataSet do bazy (używa INSERT, UPDATE, DELETE)

38 DataAdapter - polecenia Tworzone w trzy sposoby – Użycie obiektu CommandBuilder by stworzyć Command podczas wykonania Proste do realizacji, narzut na wykonanie Ograniczenie do Select dla jednej tabeli – Poprzez Visual Studio w trakcie tworzenia aplikacji Proste do realizacji, brak narzutu na wykonanie Ograniczenie do Select dla jednej tabeli – Stworzenie programowo podczas tworzenia aplikacji Wysoka kontrola i wydajność Brak ograniczeń Narzut na czas implementacji

39 CommandBuilder DataTable dt= ds.Tables["movies"]; // Use command builder to generate update commands SqlCommandBuilder sb = new SqlCommandBuilder(da); // Add movie to table DataRow drow = dt.NewRow(); drow["movie_Title"] = "Taxi Driver"; drow["movie_Year"] = "1976"; dt.Rows.Add(drow); // Delete row from table dt.Rows[4].Delete(); // Edit Column value dt.Rows[5]["movie_Year"] = "1944"; // Update underlying Sql Server table int updates = da.Update(ds, "movies"); MessageBox.Show("Rows Changed: " +updates.ToString()); Obiekt CommandBuilder generuje polecenia wymagane do aktualizacji źródła danych po wprowadzeniu zmian w obiekcie DataSet. Ograniczenia: polecenie Select dotyczy pojedynczej tabeli tabela w bazie musi mieć klucz główny lub unikatową kolumnę zawartą w oryginalnym poleceniu Select

40 Data Adapter - tworzenie Zapisanie zapytania w DataAdapter Konstruktor ustawia wartość SelectCommand Gdy wymagane, utworzenie InsertCommand, UpdateCommand, DeleteCommand SqlDataAdapter da = new SqlDataAdapter ("select * from Authors",conn); da.SelectCommand.CommandText; da.SelectCommand.Connection;

41 DataSet - tworzenie private void Demo() { SqlDataAdapter da = new SqlDataAdapter( "SELECT City FROM Authors", "Server=localhost; Database=Pubs; Integrated Security=SSPI" ); DataSet ds = new DataSet(); da.Fill( ds, "Authors" ); // Opens and closes a connection foreach ( DataRow dr in ds.Tables[ "Authors" ].Rows ) Console.WriteLine( dr[ "City" ] ); // Writes list of cities } Ładowanie danych poprzez SelectCommand obiektu DataAdapter –Definicja SQL, przez który zostaną załadowane dane –SelectCommand jako konstruktor

42 DataSet - tworzenie Tworzenie i załadowanie danymi DataTable –Fill wywołuje SelectCommand obiektu DataAdapter Dostęp do DataTable DataSet ds = new DataSet(); da.Fill(ds, "Authors"); ds.Tables["Authors"].Rows.Count; string str=""; foreach(DataRow r in ds.Tables["Authors"].Rows) { str += r[2]; str += r["au_lname"]; }

43 Wypełnianie DataSet Wydajność Zdefiniowanie schematu przed wypełnieniem DataSet –DataTables, DataColumns, DataRelations są znane przed załadowaniem danych –Zwiększenie wydajności Tworzenie typowanych DataSet : -dsCustomers.Customers.BeginLoadData(); -daCustomers.Fill(dsCustomers.Customers); -dsCustomers.Customers.EndLoadData(); -dataGrid1.DataSource = dsCustomers.Customers.DefaultView;; Dane z wielu DataAdapter DataSet może przechowywać dane z wielu obiektów DataAdapter –1 DataAdapter = 1 DataTable Wywołanie metody Fill –Określenie tabeli -daCustomers.Fill(dsCustomerOrders.Customers); -daOrders.Fill(dsCustomerOrders.Orders); -dataGrid1.DataSource = dsCustomerOrders.Customers.DefaultView;

44 DataSet - podsumowanie DataSet może: – Przechowywać dane w wielu powiązanych tabelach – Modelować zależności między tabelami – Zarządza constrainami – Daje dostęp do widoków celem bardziej efektywnego wyświetlania danych – Być przesyłany pomiędzy procesami i warstwami DataSet i XML: – XML może zostać załadowany do DataSet – DataSet może zostać przesłany jako XML – DataSet może wczytywać xsd

45 DataView DataView służy modyfikowaniu DataTable celem wyświetlenia potrzebych danych DefaultView zwraca standardowy widok dla DataTable Modyfikacja widoku z DataSet poprzez filtry DataView dv = new DataView(ds.Tables["Authors"]); dv.RowFilter = "state = 'CA'"; DataView dv = ds.Tables["Authors"].DefaultView; Trzy parametry opcjonalne Filter, "City='London'" Sort, "CompanyName ASC" DataViewRowState

46 Relacje Kolumna rodzica Kolumna dziecka Stworzenie relacji dr = New DataRelation _ (CustOrders", parentCol, _ childCol) ds.DataRelations.Add(dr) DataColumn parentCol = ds.Tables["Customers " ].Columns["CustomerID " ] childCol = ds.Tables["Orders " ].Columns["CustomerID " ] Orders table Customers table DataSet parentCol childCol DataRelation DataRelation definiuje relację na potrzeby nawigacji

47 Nawigacja poprzez relacje Customers Orders GetChildRows GetParentRow DataSet ds.Tables[index].Rows[index].GetChildRows("relation"); ds.Tables[index].Rows[index].GetParentRow("relation"); DataView tableView; DataRowView currentRowView; tableView = new DataView(ds.Tables["Customers"]); currentRowView = tableView[dgCustomers.SelectedIndex]; dgChild.DataSource = currentRowView.CreateChildView("CustOrders"); Customers Orders CreateChildView DataRowView DataView DataSet

48 Modyfikacja danych w DataTable BeginEdit rozpoczyna edycję danych EndEdit i CancelEdit kończą edycję danych Wstawianie wiersza Stworzenie wiersza DataRow drNewEmployee = dtEmployees.NewRow() Wypełnienie danymi drNewEmployee("EmployeeID") = 11 drNewEmployee("LastName") = "Smith" Dodanie do DataTable dtEmployees.Rows.Add(drNewEmployee) Jednowierszowo dtEmployees.Rows.Add( New Object() {11, "Smith"}) DataRos drEmployee = dtEmployees.Rows(3) drEmployee.BeginEdit() drEmployee("FirstName") = "John" drEmployee("LastName") = "Smith" drEmployee.EndEdit()

49 Modyfikacja danych w DataTable Usuwanie wiersza Metoda Remove –Usuwa wiersz z kolekcji –Przykład: dtEmployees.Rows.Remove(drEmployee) Metoda Delete klasy DataRow –Oznacza wiersz jako usunięty –Wiersz staje się ukryty, możemy uzyskać do niego dostęp –Przykład: drEmployee.Delete()

50 Śledzenie zmian w DataSet DataRow może przechowywać wiele wersji wiersza: – DataRowVersion.Current Aktualna wartość – DataRowVersion.Original Wartość przed dokonaniem zmian – DataRowVersion.Proposed Wartość w trakcie cyklu BeginEdit / EndEdit – DataRowVersion.Default Wartość standardowa

51 RowVersion - stany CURRENTORIGINALPROPOSED WhiteWhiteN/A WhiteWhiteBrown BrownWhiteN/A dataRow.BeginEdit(); dataRow[ "au_lname" ] = "Brown"; dataRow.EndEdit(); dataRow[ "au_lname", DataRowVersion.Current ] // Brown dataRow[ "au_lname", DataRowVersion.Original ] // White

52 Diagram stanów obiektu DataRow DataRow może być w różnych stanach public DataRowState RowState {get;} public enum DataRowState { Added, Deleted, Detached, Modified, Unchanged }

53 Modyfikacja źródła danych Modyfikacja źródła danych przez DataAdapter – InsertCommand, UpdateCommand, DeleteCommand RowState = Modified RowState = Unchanged RowState = Added RowState = Modified RowState = Deleted Use UPDATE command Ignore Use INSERT command Use UPDATE command Use DELETE command DataRows in DataTable Modyfikacje są zapisywane poprzez metodę Update obiektu DataAdapter –DataAdapter przeszukuje wiersze pod kątem RowState –Wykonuje akcję zgodnie ze stanem wiersza

54 Optymalizacja zmian DataSet oraz DataTable wspierają metodę GetChanges – GetChanges bez argumentów Pobiera wiersze, których RowState jest inny niż Unchanged Wykorzystanie podczas przekazywania między warstwami dsChanges = ds.GetChanges(); – GetChanges z argumentem RowState Wiersze, które mają określony RowState Pozwala zarządzać kolejnością aktualizacji changes = ds.GetChanges( DataRowState.Added ); Medota Merge pozwala na scalenie danych

55 Obsługa współbieżnego dostępu do danych Tryb bezpołączeniowy używa podejścia optymistycznego (optimistic concurrency) –Zwalnianie blokad podczas rozłączania Możliwość konfliktów –Dane mogły zostać zmienione -Usunięcie wiersza -Zmiana wartości w polu wiersza Wykrywanie konfliktów Data Adapter Configuration Wizard pozwala generować zapytania SQL wykrywające konflikty Podczas aktualizacji: –Porównanie bieżących wartości z oryginalnymi (where …) –Różnice powodują konflikt Dodanie do tabeli pola timestamp - aktualizacja pola przy zmianie wartości.

56 Naruszenie spójności danych Column nameOriginal valueCurrent valueValue in database CustID101 LastNameSmith FirstNameBob Column nameOriginal valueCurrent valueValue in database CustID101 LastNameSmith FirstNameBobRobertBob Column nameOriginal valueCurrent valueValue in database CustID101 LastNameSmith FirstNameBobJamesRobert User1 czyta wiersz User2 zmienia FirstName z "Bob" na "Robert" i zapisuje zmiany User1 zmienia FirstName na "Jamesi próbuje aktualizować bazę

57 Wykrywanie konfliktów // Visual C#: How the Data Adapter Configuration Wizard Supports Optimistic Concurrency this.cmUpdate.CommandText = "UPDATE Customers " + "SET " + " WHERE (CustomerID " + " AND (CompanyName " + "SELECT CustomerID, CompanyName FROM Customers " + " WHERE (CustomerID this.cmUpdate.Parameters.Add(new SqlParameter( SqlDbType.NChar, 5, ParameterDirection.Input, false, 0, 0, "CustomerID", DataRowVersion.Current, null)); this.cmUpdate.Parameters.Add(new SqlParameter( SqlDbType.NVarChar, 40, ParameterDirection.Input, false, 0, 0, "CompanyName", DataRowVersion.Current, null)); this.cmUpdate.Parameters.Add(new SqlParameter( SqlDbType.NChar, 5, ParameterDirection.Input, false, 0, 0, "CustomerID", DataRowVersion.Original, null)); this.cmUpdate.Parameters.Add(new SqlParameter( SqlDbType.NVarChar, 40, ParameterDirection.Input, false, 0, 0, "CompanyName", DataRowVersion.Original, null)); this.cmUpdate.Parameters.Add(new SqlParameter( SqlDbType.NChar, 5, ParameterDirection.Input, false, 0, 0, "CustomerID", DataRowVersion.Current, null));

58 Rozwiązywanie konfliktów Właściwość HasErrors –Sprawdza DataSet, DataTable, DataRow Jedna ze strategii: –Last in wins – zmiany są zapisywane niezależnie od stanu –Zatrzymanie wartości w DataSet i aktualizacja później –Odrzut konfliktów i wypełnienie ich danymi z DataSet –Odrzut konfliktów i wypełnienie ich danymi z bazy

59 Kontrolki źródła danych ObjectDataSourceUmożliwia połączenie z obiektami logiki biznesowej i innych klas i służy do tworzenia aplikacji webowych które bazują na obiektach warstwy pośredniej do zarządzania danymi. Wspiera zaawansowane sortowania i dzielenie na strony niedostępne w innych kontrolkach źródeł danych. SqlDataSource Umożliwia połączenie do serwerów baz danych takich jak Microsoft SQL Server czy Oracle. We współpracy z serwerem SQL Server wspiera zaawansowane możliwości buforowania. Kontrolka wspiera również sortowanie, filtrowanie i dzielenie na strony, jeśli dane są zwracane jako obiekt DataSet. AccessDataSource Umożliwia współpracę z bazami danych zapisanymi w Microsoft Access. Kontrolka wspiera sortowanie, filtrowanie i dzielenie na strony, jeśli dane są zwracane jako obiekt DataSet XmlDataSource Umożliwia pobieranie danych zapisanych w plikach XML, szczególnie dla hierarchicznych kontrolek serwerowych ASP.NET takich jak TreeView. Wspiera filtrowanie przy użyciu wyrażeo XPath i umożliwia stosowanie transformacji danych przy użyciu XSLT. Umożliwia również aktualizację danych przez zapisanie całego dokumentu XML ze zmianami. SiteMapDataSource Używana w ASP.NET do nawigacji na stronie LinqDataSource Umożliwia użycie języka LINQ na stronach ASP.NET poprzez model deklaratywny do pobrania i modyfikowania danych z obiektów danych takich jak tabele w bazie czy kolekcje w pamięci serwera. Wspiera automatyczne generowanie poleceń wybierania, aktualizacji, dodawania i usuwania danych. Kontrolka wspiera sortowanie, filtrowanie i dzielenie na strony EntityDataSource Umożliwia połączenie z danymi pochodzącymi z modelu Entity Data Model (EDM). Wspiera automatyczne generowanie poleceń wybierania, aktualizacji, dodawania i usuwania danych. Kontrolka wspiera sortowanie, filtrowanie i dzielenie na strony.

60 Połączenie i tworzenie zapytań przy pomocy SqlDataSource Określić atrybuty kontrolki SqlDataSource: ConnectionString – łańcuch połączenia. ProviderName – nazwa dostawcy danych. SelectCommand – polecenie SQL zawierające treść zapytania do bazy danych lub nazwa procedury składowanej do wykonania. W bloku pliku Web.config lub

61 Połączenie i tworzenie zapytań przy pomocy SqlDataSource Konfiguracja treści zapytania do bazy

62 XML i Dataset XML File DataSet Object DataSet Object XmlDataDocument Object XmlDataDocument Object XslTransform Object XslTransform Object XML or HTML File Database DataAdapter ReadXML Doc.Save WriteXML XSLT File XML File

63 Dlaczego używać XML z Dataset XML to uniwersalny format wymiany danych między klientami Synchronizacja i transformacja danych Human Readable Mainframe Readable XML File Or Stream Browser Readable Web Server DataSet Firewall Silna integracja –serializacjaDataSet do XML –XML jako źródło danych dla DataSet –Schema dla DataSets zdefiniowana jako XML schemas –Typowane DataSet generowane z XML schema –Dostęp do DataSet poprzez interfejs XML-DOM Integracja w systemach rozproszon

64 Metody klasy DataSet do obsługi danych i schematów XML ReadXML – Ładowanie XML WriteXml - zapis DataSet do strumienia XML WriteXmlSchema – wygenerowanie schemy z DataSet ReadXmlSchema – załadowanie XML Schema InferXmlSchema – stworzenie schemy DataSet na podstawie XML GetXml i GetXmlSchema – zwraca ciąg XML lub XML Schema

65 Metody klasy DataSet do obsługi danych i schematów XML Use ReadXml to load data from a file or stream Use WriteXml to write XML data to a file or stream Use GetXml to write data to a string variable DataSet ds = new DataSet(); ds.ReadXml(Server.MapPath("filename.xml")); DataSet ds = new DataSet(); ds.ReadXml(Server.MapPath("filename.xml")); DataSet ds = new DataSet(); SqlDataAdapter da = new SqlDataAdapter("select * from Authors", conn); da.Fill(ds); ds.WriteXml(Server.MapPath("filename.xml")); DataSet ds = new DataSet(); SqlDataAdapter da = new SqlDataAdapter("select * from Authors", conn); da.Fill(ds); ds.WriteXml(Server.MapPath("filename.xml")); string strXmlDS = ds.GetXml();

66 Synchronizacja DataSet z XmlDataDocument Załadowanie XML Data do XmlDataDocument XmlDataDocument objXmlDataDoc = new XmlDataDocument(); objXmlDataDoc.Load(Server.MapPath ("file.xml")); DataSet ds = new DataSet(); //fill in ds objXmlDataDoc = new XmlDataDocument(ds); Załadowanie DataSet do XmlDataDocument

67 Praca z XmlDataDocument Załadowanie danych Pobranie wierszy jako XML Metody XML DOM –XmlDataDocument dziedziczy z XmlDocument XmlElement elem; elem = objXmlDataDoc.GetElementFromRow(ds.Tables[0].Rows[1]); XmlElement elem; elem = objXmlDataDoc.GetElementFromRow(ds.Tables[0].Rows[1]); dg.DataSource = objXmlDataDoc.DataSet;


Pobierz ppt "Warstwa dostępu do danych Mainframe Directory RDBMS Email i wiadomości System plików ADO OLE DB XML Problemy Modele programistyczne –Połączeniowy (connected)"

Podobne prezentacje


Reklamy Google