PLATFORMY TECHNOLOGICZNE ADO.NET mgr inż. Tomasz Gawron
Feb 23, 2016
PLATFORMY TECHNOLOGICZNEADO.NET
mgr inż. Tomasz Gawron
Platformy Technologiczne 2012
2
Architektura ADO.NET 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
Mainframe
Directory
RDBMS
Email iwiadomości
System plikówADO
OLE DB
XML
Platformy Technologiczne 2012
3
Architektura ADO.NET
Database
DataSet
Tables
DataTable
DataRowCollection
DataColumnCollection
ConstraintCollection
DataRelationCollection
XML
.NET Data Provider
ConnectionTransaction
Command
Parameters
DataReader
DataAdapter
SelectCommand
InsertCommand
UpdateCommand
DeleteCommand
ReadXmlWriteXml
Platformy Technologiczne 2012
4
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
• Serwery bazodanowe zapewniają dostęp do kursora przechowującego stan aktualnego wiersza
– Dostęp do danych– Przesuwanie się przez MoveNext
oraz MovePrevious
Połączenia
busy
idle
idleMożliwe
niepotrzebne zużycie zasobów
TabeleWyniki
zapytaniaKursor
rsKlientSerwer
5
Platformy Technologiczne 2012
Tryb połączeniowy Zalety
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
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
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 rsSerwer
Tabele
idleZasoby są używane tylko gdy są
potrzebne
Klienci
Połączenia
Serwer
busy
idle
idleidle
7
Platformy Technologiczne 2012
Tryb bezpołączeniowy Zalety
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 obiektowyConnection
Command
Parameter
DataReader
Transaction
DataAdapter
DataSet
DataTable
DataColumn
DataRow
Constraint
DataRelationKlasa 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
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
IDbConnection
IDbCommand
IDbTransaction
IDataReader
DbConnection
DbCommand
DbTransaction
DbDataReader
OleDbConnection SqlConnection OracleConnection
...
OleDbCommand SqlCommand OracleCommand
OleDbTransaction SqlTransaction OracleTransaction
OleDbDataReader SqlDataReader OracleDataReader
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łączeniapublic 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łączeniamitry . . . 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;"
15
Platformy Technologiczne 2012
Modele 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 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
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
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
<<interface>>IDbCommand
<<interface>>IDataParameter
<<interface>>IDbDataParameter
//----- PropertiesDbType DbType {get; set;}ParameterDirection Direction {get; set;}string ParamterName {get; set;}object Value {get; set;}...
//----- Propertiesint Size {get; set;}...
Parameters *
...IDataParameterCollection
Parameters {get;}...
Platformy Technologiczne 2012
21
Zapytania parametryzowane - przykład
1. Zdefiniowanie zapytania SQL Server: Identyfikacja parametru przez „@”(przykład: "@name")
SqlCommand cmd = new SqlCommand(); cmd.CommandText = "DELETE FROM Empls WHERE EmployeeID = @ID";
2. Dodanie parametrucmd.Parameters.Add( new OleDbParameter("@ID", OleDbType.BigInt));
3. Przypisanie wartości
cmd.Parameters["@ID"].Value = 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
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
Platformy Technologiczne 2012
Data Reader• 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);}
// Open Connection and create commandSqlConnection 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 dataSqlDataReader dr;dr = cmdAuthors.ExecuteReader();while (dr.Read()){lstBuiltNames.Items.Add(dr["au_lname"] + ", " + dr["au_fname"]);}
// Close DataReader and Connectiondr.Close();conn.Close();
Platformy Technologiczne 2012
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
Platformy Technologiczne 2012
26
Poziomy izolacji Definiują blokady na odczyt i zapis ADO.NET zapewnia różne poziomy
izolacjiReadUncommitted • Dostęp do zablokowanych danych
• Dirty readsReadCommitted • 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
<<interface>>IDbCommand
<<interface>>IDbTransaction
<<interface>>IDbConnection
//----- PropertiesIDbConnection Connection {get;}IsolationLevel IsolationLevel {get;}// Methodsvoid Commit();void Rollback();...
Transaction 1
...IDbTransaction Transaction {get; set;}...
Connection 1
…IDbTransaction BeginTransaction();IDbTransaction BeginTransaction (IsolationLevel lvl);
Platformy Technologiczne 2012
28
Transakcje
2. Stworzenie obiektówIDbCommand 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
Platformy Technologiczne 2012
29
Tryb bezpołączeniowy – Data Set „Baza danych” utrzymywana w pamięci
(struktura relacyjna)
DataTable
DataColumn
DataRow
DataRelation
TablesDataTable
Relations
DataRelationDataRelation
DataRow(s)
DataColumn
Constraint(s)
DataTable
DataTable
DataViewManagerDataView
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 DataReaderOperacje odczytu i zapisu Tylko do odczytuWiele 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 kontrolkiPrzesuwanie się w przód i tył Przesuwanie tylko do przoduWolniejszy dostęp Szybszy dostępWspierany przez narzędzia automatyzujące pracę
Wymaga ręcznej implementacji
32
Platformy Technologiczne 2012
Data Set - budowa DataSet 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[“colum
nname”] DataRow
DataTable.Rows[0] Pola tabeli
DataRow[0] DataRow[“columnname”]
33
Platformy Technologiczne 2012
Typowany i nietypowany Data Set Typowany 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”].R
ows[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 Ograniczenie do Select dla jednej tabeli
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 SelectDataTable dt= ds.Tables["movies"]; // Use command builder to generate update commandsSqlCommandBuilder sb = new SqlCommandBuilder(da);// Add movie to tableDataRow drow = dt.NewRow();drow["movie_Title"] = "Taxi Driver";drow["movie_Year"] = "1976";dt.Rows.Add(drow);// Delete row from tabledt.Rows[4].Delete();// Edit Column valuedt.Rows[5]["movie_Year"] = "1944";// Update underlying Sql Server tableint 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ść
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
Orders table
Customers table
DataSet
parentCol
childCol
DataRelation
DataColumn parentCol = ds.Tables["Customers"].Columns["CustomerID"]
childCol = ds.Tables["Orders"].Columns["CustomerID"]
dr = New DataRelation _ („CustOrders", parentCol, _ childCol)ds.DataRelations.Add(dr)
Platformy Technologiczne 2012
45
Nawigacja poprzez relacjeds.Tables[index].Rows[index].GetChildRows("relation");ds.Tables[index].Rows[index].GetParentRow("relation");
Customers Orders
GetChildRows
GetParentRowDataSet
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• 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 wierszaDataRow drNewEmployee = dtEmployees.NewRow()
Wypełnienie danymidrNewEmployee("EmployeeID") = 11drNewEmployee("LastName") = "Smith"
Dodanie do DataTabledtEmployees.Rows.Add(drNewEmployee)
JednowierszowodtEmployees.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 Przykład:
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
Detached
Deleted
Unchanged Modified
row =table.NewRow
table.Row.Add(row) Reject-
Changesrow.Delete
Accept-Changes
row.Delete
RejectChanges
row.Delete
Accept-Changes
Accept-Changes
Reject-Changes
row[..] = ..
table.Rows.Remove(row)
Added
Platformy Technologiczne 2012
50
Row versionsCURRENT ORIGINAL
PROPOSEDWhite 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
RowState = ModifiedRowState = UnchangedRowState = AddedRowState = ModifiedRowState = Deleted
Use UPDATE command
IgnoreUse INSERT commandUse UPDATE commandUse DELETE command
DataRows in DataTable
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 101 101 LastName Smith Smith Smith FirstName Bob Bob Bob
Column name Original value Current value Value in database
CustID 101 101 101 LastName Smith Smith Smith FirstName Bob Robert Bob
Column name Original value Current value Value in database CustID 101 101 101 LastName Smith Smith 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] = @KatID" InsertCommand="INSERT INTO [Kategorie] ([Nazwa]) VALUES (@Nazwa)" UpdateCommand="UPDATE [Kategorie] SET [Nazwa] = @Nazwa WHERE [KatID] = @KatID"> <DeleteParameters> <asp:Parameter Name="KatID" Type="Int32" /> </DeleteParameters> <UpdateParameters> <asp:Parameter Name="Nazwa" Type="String" /> <asp:Parameter Name="KatID" Type="Int32" /> </UpdateParameters> <InsertParameters> <asp:Parameter Name="Nazwa" Type="String" /> </InsertParameters> </asp:SqlDataSource>
Platformy Technologiczne 2012
58
Współpraca XML z Data SetXML File
DataSetObject
XmlDataDocumentObject
XslTransformObject
XML or HTML File
Database
DataAdapter
ReadXML
Doc.Save
WriteXML
XSLT File
XML File
XML 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 * fromAuthors", 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 dsobjXmlDataDoc = new XmlDataDocument(ds);