Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
Platformy Technologiczne ADO.NET
mgr inż. Tomasz Gawron
2
Architektura ADO.NET Architektura ADO.NET LINQ, Entity Framework
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 Mainframe Directory RDBMS i wiadomości System plików ADO OLE DB XML Platformy Technologiczne 2012
3
Architektura ADO.NET DataSet .NET Data Provider Tables Connection
DataTable DataRowCollection DataColumnCollection ConstraintCollection DataRelationCollection .NET Data Provider Connection Transaction Command Parameters DataReader DataAdapter SelectCommand InsertCommand UpdateCommand DeleteCommand ReadXml Database WriteXml XML Platformy Technologiczne 2012
4
Możliwe niepotrzebne zużycie zasobów
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 idle Możliwe niepotrzebne zużycie zasobów busy idle Połączenia Serwery bazodanowe zapewniają dostęp do kursora przechowującego stan aktualnego wiersza Dostęp do danych Przesuwanie się przez MoveNext oraz MovePrevious Tabele Wyniki zapytania Kursor rs Klient Serwer Platformy Technologiczne 2012
5
Tryb połączeniowy Zalety Wady 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 Wady 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 Platformy Technologiczne 2012
6
Zasoby są używane tylko gdy są potrzebne
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 idle Serwer idle Zasoby są używane tylko gdy są potrzebne busy idle Połączenia idle Klienci 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 zapytania Kursor Klient rs Serwer Tabele Platformy Technologiczne 2012
7
Tryb bezpołączeniowy Zalety Wady 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 Wady 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 Platformy Technologiczne 2012
8
Model obiektowy Connection DataSet Command DataTable Parameter
DataReader Transaction DataAdapter DataSet DataTable DataColumn DataRow Constraint DataRelation Klasa Opis Connection Umożliwia nawiązanie połączenia z określonym źródłem danych Command Wywoł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' DataAdapter Wypeł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) Platformy Technologiczne 2012
9
Hierarchia klas Interfejsy Abstrakcyjne klasy bazowe
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 Platformy Technologiczne 2012
10
Tworzenie połączenia Łańcuch połączenia (ang. connection string) - ciąg znaków zawierających parametry konfiguracji połączenia Obiekt 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=.;initial catalog=NewDb;integrated security=true"; SqlConnection conn = new SqlConnection(strConn); Platformy Technologiczne 2012
11
Connection String Umieszczamy w sekcji <connectionStrings> pliku konfiguracyjnego < configuration > ... < connectionStrings > < add name=”Northwind” providerName=”System.Data.SqlClient” connectionString=”server=(local); integrated security=SSPI;database=Northwind” / > < /connectionStrings > < /configuration > 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 ; } Platformy Technologiczne 2012
12
Obiekt 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(); } 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. BeginTransaction – Rozpoczyna tranzakcję Platformy Technologiczne 2012
13
Zarządzanie połączeniami
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 Platformy Technologiczne 2012
14
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;" Platformy Technologiczne 2012
15
Modele programowania Połączeniowy Bezpołą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 obiektem DataSet a serwerem Obiekty DataSet są niezależne od providera Obiekty DataSet są przechowywane oraz przesyłane przez XML Platformy Technologiczne 2012
16
Command Connection - referencja do obiektu połączenia
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 Parameters Parametry, z którymi zostanie wykonane zapytanie Platformy Technologiczne 2012
17
Wywołania Command ExecuteNonQuery ExecuteScalar ExecuteDataReader
Zwraca liczbę wierszy ‘dotkniętych’ przez zapytanie Zapytania DDL and DCL CREATE, ALTER, DROP, GRANT, DENY, REVOKE Zapytania DML INSERT, UPDATE, DELETE ExecuteScalar ExecuteScalar zwraca typ Object ExecuteDataReader Zwraca obiekt DataReader Reader zależny od providera: SqlDataReader, OleDbDataReader DataReader Służy tylko do odczytu, możliwe przesuwanie tylko w przód ExecuteXmlReader ExecuteXmlReader – dostępny tylko dla SQL Server Platformy Technologiczne 2012
18
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! } Platformy Technologiczne 2012
19
Asynchroniczne wywołanie Command
IAsyncResult BeginExecuteReader (AsyncCallback callback) IDataReader EndExecuteReader (AsyncResult result) IAsyncResult BeginExecuteNonQuery (AsyncCallback callback) int EndExecuteNonQuery (IAsyncResult result) IAsyncResult BeginExecuteXmlReader (AsyncCallback callback) IDataReader EndExecuteXmlReader (IAsyncResult result) Platformy Technologiczne 2012
20
Zapytania parametryzowane
Command pozwala na definiowanie parametrów wejściowych i wyjściowych Parameter – pola klasy: Name: nazwa parametru Value: wartość parametru DbDataType: typ danych Direction: kierunek parametru Input Output InputOutput ReturnValue Platformy Technologiczne 2012
21
Zapytania parametryzowane - przykład
Zdefiniowanie zapytania SQL Server: Identyfikacja parametru przez SqlCommand cmd = new SqlCommand(); cmd.CommandText = "DELETE FROM Empls WHERE EmployeeID 2. Dodanie parametru cmd.Parameters.Add( new OleDbType.BigInt)); 3. Przypisanie wartości = 1234; cmd.ExecuteNonQuery(); Platformy Technologiczne 2012
22
Data Reader Służy do odczytu strumienia danych zwróconych przez zapytanie 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 public interface IDataReader { int Depth {get;} bool IsClosed {get;} int RecordsAffected {get;} … void Close(); DataTable GetSchemaTable(); bool NextResult(); bool Read(); } Platformy Technologiczne 2012
23
Data Reader Stwórz obiekt i rozpocznij odczyt
IDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Stwórz obiekt i rozpocznij odczyt 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 Platformy Technologiczne 2012
24
Data Reader Wołanie Read dla każdego rekordu Dostęp do pól
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 // 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(); while (myReader.Read()) { str += myReader[1]; str += myReader["field"]; str += myReader.GetDateTime(2); } Platformy Technologiczne 2012
25
Transakcje Transakcje lokalne Transakcje rozproszone
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 Platformy Technologiczne 2012
26
Poziomy izolacji Definiują blokady na odczyt i zapis
ADO.NET zapewnia różne poziomy izolacji ReadUncommitted Dostęp do zablokowanych danych Dirty reads ReadCommitted Odczyt zablokowanych wierszy zabroniony Brak dirty read, może wystąpić phantom row Non-repeatable reads RepeatableRead ReadCommitted bez non-repeatable reads Serializable Dostęp w seriach Najwyższy poziom izolacji Nie występują phantom rows Platformy Technologiczne 2012
27
Transakcje 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 Platformy Technologiczne 2012
28
Transakcje Platformy Technologiczne 2012 1. Definicja
SqlConnection con = new SqlConnection(connStr); IDbTranaction trans = null; try { con.Open(); trans = con.BeginTransaction(IsolationLevel.ReadCommitted); 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(); 3. Zatwierdzenie lub cofnięcie wyników trans.Commit(); catch (Exception e) { if (trans != null) trans.Rollback(); } finally { try { con.Close(); Platformy Technologiczne 2012
29
Tryb bezpołączeniowy – Data Set
„Baza danych” utrzymywana w pamięci (struktura relacyjna) Tables DataView DataTable DataViewManager Relations DataRelation DataRow(s) DataColumn Constraint(s) DataTable DataColumn DataTable DataRow DataTable DataRelation Platformy Technologiczne 2012
30
Data Set 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 Platformy Technologiczne 2012
31
Data Set vs. Data Reader DataSet DataReader Operacje odczytu i zapisu
Tylko do odczytu Wiele tabel z różnych źródeł Oparty o jedno polecenie SQL Bezpołączeniowy Połą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ęp Szybszy dostęp Wspierany przez narzędzia automatyzujące pracę Wymaga ręcznej implementacji Platformy Technologiczne 2012
32
Data Set - budowa DataSet składa się z DataTable składa się z
Kolecji DataTable Kolekcji DataRelation DataTable składa się z DataTableColumns (= schema definition) DataTableRows (= data) DefaultView (DataTableView) DataRelation Łączy dwa obiekty DataTable definiujue ParentTable i ParentColumns oraz ChildTable i ChildColumns Dostęp do: DataTable DataSet.Tables[0] DataSet.Tables[“tablename”] DataColumn DataTable.Columns[0] DataTable.Columns[“columnna me”] DataRow DataTable.Rows[0] Pola tabeli DataRow[0] DataRow[“columnname”] Platformy Technologiczne 2012
33
Typowany i nietypowany Data Set
Informacje o typach dołączane są do obiektu Możliwy do stworzenia z poziomu VS / poprzez xsd Mniej podatny na błędy Rozwiązanie sztywne Odwołanie: MyDataSet.News[0].Title Nietypowany Data Set Nie posiada wbudowanego schematu Rozwiązanie bardziej elastyczne Odwołanie: MyDataSet.Tables[“News”] .Rows[0][“Title”] Platformy Technologiczne 2012
34
Zdarzenia w Data Table 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 Platformy Technologiczne 2012
35
Data Adapter 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. 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 DataSet Metody: Fill – odświeża DataSet danymi z bazy (używa SELECT) Update – przenosi zmiany z DataSet do bazy (używa INSERT, UPDATE, DELETE) Platformy Technologiczne 2012
36
Data Adapter - polecenia
Tworzone na 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 Stworzenie programowo podczas tworzenia aplikacji Wysoka kontrola i wydajność Brak ograniczeń Narzut na czas implementacji Platformy Technologiczne 2012
37
Command builder 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 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()); Platformy Technologiczne 2012
38
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; Platformy Technologiczne 2012
39
Data Set - tworzenie Ładowanie danych poprzez SelectCommand obiektu DataAdapter Definicja SQL, przez który zostaną załadowane dane SelectCommand jako konstruktor 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 } Platformy Technologiczne 2012
40
Data Set - 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"]; } Platformy Technologiczne 2012
41
Wypełnianie Data Set Wydajność Dane z wielu DataAdapter
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; Platformy Technologiczne 2012
42
Data Set - 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 Platformy Technologiczne 2012
43
Data View 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 = ds.Tables["Authors"].DefaultView; DataView dv = new DataView(ds.Tables["Authors"]); dv.RowFilter = "state = 'CA'"; Platformy Technologiczne 2012
44
Relacje Kolumna rodzica Kolumna dziecka Stworzenie relacji DataSet
DataColumn parentCol = ds.Tables["Customers"].Columns["CustomerID"] childCol = ds.Tables["Orders"].Columns["CustomerID"] parentCol DataRelation Customers table dr = New DataRelation _ („CustOrders", parentCol, _ childCol) ds.DataRelations.Add(dr) childCol DataSet Orders table Platformy Technologiczne 2012
45
Nawigacja poprzez relacje
ds.Tables[index].Rows[index].GetChildRows("relation"); ds.Tables[index].Rows[index].GetParentRow("relation"); Customers Orders GetChildRows GetParentRow DataSet 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 Platformy Technologiczne 2012
46
Modyfikacja danych Wstawianie wiersza Stworzenie wiersza
BeginEdit rozpoczyna edycję danych EndEdit i CancelEdit kończą edycję danych DataRos drEmployee = dtEmployees.Rows(3) drEmployee.BeginEdit() drEmployee("FirstName") = "John" drEmployee("LastName") = "Smith" drEmployee.EndEdit() 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"}) Platformy Technologiczne 2012
47
Modyfikacja danych 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 drEmployee.Delete() Platformy Technologiczne 2012
48
Śledzenie zmian w Data Set
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 Platformy Technologiczne 2012
49
Diagram stanów Data Row
Platformy Technologiczne 2012
50
Row versions CURRENT ORIGINAL PROPOSED White White N/A
White White Brown Brown White N/A dataRow.BeginEdit(); dataRow[ "au_lname" ] = "Brown"; dataRow.EndEdit(); dataRow[ "au_lname", DataRowVersion.Current ] // Brown dataRow[ "au_lname", DataRowVersion.Original ] // White Platformy Technologiczne 2012
51
Modyfikacja źródła danych
Modyfikacja źródła danych przez DataAdapter InsertCommand, UpdateCommand, DeleteCommand Modyfikacje są zapisywane poprzez metodę Update obiektu DataAdapter DataAdapter przeszukuje wiersze pod kątem RowState Wykonuje akcję zgodnie ze stanem wiersza DataRows in DataTable RowState = Modified Use UPDATE command RowState = Unchanged Ignore RowState = Added Use INSERT command RowState = Modified Use UPDATE command RowState = Deleted Use DELETE command Platformy Technologiczne 2012
52
Optymalizacja zmian DataSet oraz DataTable wspierają metodę GetChanges
Wywołanie bezargumentowe 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 Platformy Technologiczne 2012
53
Spójność danych „A” czyta wiersz
„B” zmienia FirstName z "Bob" na "Robert" i zapisuje zmiany „A” zmienia FirstName na "James”i próbuje aktualizować bazę Column name Original value Current value Value in database CustID 101 LastName Smith FirstName Bob Column name Original value Current value Value in database CustID 101 LastName Smith FirstName Bob Robert Column name Original value Current value Value in database CustID 101 LastName Smith FirstName Bob James Robert Platformy Technologiczne 2012
54
Obsługa współbieżnego dostępu
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. Platformy Technologiczne 2012
55
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 Platformy Technologiczne 2012
56
SqlDataSource 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. <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\CDDB.mdf; Integrated Security=True; User Instance=True" ProviderName="System.Data.SqlClient" SelectCommand="SELECT * FROM [Kategorie]"> </asp:SqlDataSource> Platformy Technologiczne 2012
57
SqlDataSource Kofiguracja poleceń bazodanowych
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:PolaczenieDoBazy %>" SelectCommand="SELECT * FROM [Kategorie]" DeleteCommand="DELETE FROM [Kategorie] WHERE [KatID] InsertCommand="INSERT INTO [Kategorie] ([Nazwa]) VALUES UpdateCommand="UPDATE [Kategorie] SET [Nazwa] WHERE [KatID] <DeleteParameters> <asp:Parameter Name="KatID" Type="Int32" /> </DeleteParameters> <UpdateParameters> <asp:Parameter Name="Nazwa" Type="String" /> </UpdateParameters> <InsertParameters> </InsertParameters> </asp:SqlDataSource> Platformy Technologiczne 2012
58
Współpraca XML z Data Set
WriteXML XML File XML File DataAdapter Doc.Save DataSet Object XmlDataDocument Object Database XslTransform Object ReadXML XML File XML or HTML File XSLT File Platformy Technologiczne 2012
59
Dlaczego XML? XML to uniwersalny format wymiany danych między klientami Synchronizacja i transformacja danych Silna integracja pomiędzu XML a DataSet 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 rozproszonych oraz SOA Platformy Technologiczne 2012
60
Metody obsługujące 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 Platformy Technologiczne 2012
61
Przykłady ReadXml WriteXml GetXml 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")); string strXmlDS = ds.GetXml(); Platformy Technologiczne 2012
62
XmlDataDocument Implementuje model DOM w XML
Unifikuje ADO z XML poprzez relacyjną reprezentację danych z DataSet i synchronizację z XML Załadowanie danych Pobranie wierszy jako XML dg.DataSource = objXmlDataDoc.DataSet; XmlElement elem; elem = objXmlDataDoc.GetElementFromRow(ds.Tables[0].Rows[1]); Platformy Technologiczne 2012
63
Synchronizacja danych
Załdadowanie XML Załadowanie DataSet do XML XmlDataDocument objXmlDataDoc = new XmlDataDocument(); objXmlDataDoc.Load(Server.MapPath ("file.xml")); DataSet ds = new DataSet(); //fill in ds objXmlDataDoc = new XmlDataDocument(ds); Platformy Technologiczne 2012
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.