Platformy Technologiczne ADO.NET

63
PLATFORMY TECHNOLOGICZNE ADO.NET mgr inż. Tomasz Gawron

description

Platformy Technologiczne ADO.NET. mgr inż. Tomasz Gawron. Mainframe. Directory. XML. RDBMS. Email i wiadomo ś ci. ADO. System plik ó w. OLE DB. Architektura ADO.NET. Architektura ADO.NET Obiekty DataSet, Connection, Command, DataAdapter i ich współdziałanie - PowerPoint PPT Presentation

Transcript of Platformy Technologiczne ADO.NET

Page 1: Platformy Technologiczne ADO.NET

PLATFORMY TECHNOLOGICZNEADO.NET

mgr inż. Tomasz Gawron

Page 2: Platformy Technologiczne ADO.NET

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

Page 3: Platformy Technologiczne ADO.NET

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

Page 4: Platformy Technologiczne ADO.NET

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

Page 5: Platformy Technologiczne ADO.NET

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

Page 6: Platformy Technologiczne ADO.NET

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

Page 7: Platformy Technologiczne ADO.NET

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

Page 8: Platformy Technologiczne ADO.NET

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)

Page 9: Platformy Technologiczne ADO.NET

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

Page 10: Platformy Technologiczne ADO.NET

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);

Page 11: Platformy Technologiczne ADO.NET

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 ;}

Page 12: Platformy Technologiczne ADO.NET

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ę

Page 13: Platformy Technologiczne ADO.NET

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}

Page 14: Platformy Technologiczne ADO.NET

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;"

Page 15: Platformy Technologiczne ADO.NET

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

Page 16: Platformy Technologiczne ADO.NET

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

Page 17: Platformy Technologiczne ADO.NET

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

Page 18: Platformy Technologiczne ADO.NET

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!}

Page 19: Platformy Technologiczne ADO.NET

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)

Page 20: Platformy Technologiczne ADO.NET

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;}...

Page 21: Platformy Technologiczne ADO.NET

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();

Page 22: Platformy Technologiczne ADO.NET

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();

…}

Page 23: Platformy Technologiczne ADO.NET

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

Page 24: Platformy Technologiczne ADO.NET

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();

Page 25: Platformy Technologiczne ADO.NET

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

Page 26: Platformy Technologiczne ADO.NET

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

Page 27: Platformy Technologiczne ADO.NET

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);

Page 28: Platformy Technologiczne ADO.NET

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

Page 29: Platformy Technologiczne ADO.NET

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

Page 30: Platformy Technologiczne ADO.NET

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

Page 31: Platformy Technologiczne ADO.NET

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

Page 32: Platformy Technologiczne ADO.NET

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”]

Page 33: Platformy Technologiczne ADO.NET

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”]

Page 34: Platformy Technologiczne ADO.NET

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

Page 35: Platformy Technologiczne ADO.NET

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)

Page 36: Platformy Technologiczne ADO.NET

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

Page 37: Platformy Technologiczne ADO.NET

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());

Page 38: Platformy Technologiczne ADO.NET

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;

Page 39: Platformy Technologiczne ADO.NET

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}

Page 40: Platformy Technologiczne ADO.NET

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"];}

Page 41: Platformy Technologiczne ADO.NET

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;

Page 42: Platformy Technologiczne ADO.NET

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

Page 43: Platformy Technologiczne ADO.NET

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'";

Page 44: Platformy Technologiczne ADO.NET

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)

Page 45: Platformy Technologiczne ADO.NET

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

Page 46: Platformy Technologiczne ADO.NET

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"})

Page 47: Platformy Technologiczne ADO.NET

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()

Page 48: Platformy Technologiczne ADO.NET

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

Page 49: Platformy Technologiczne ADO.NET

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

Page 50: Platformy Technologiczne ADO.NET

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

Page 51: Platformy Technologiczne ADO.NET

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

Page 52: Platformy Technologiczne ADO.NET

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

Page 53: Platformy Technologiczne ADO.NET

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

Page 54: Platformy Technologiczne ADO.NET

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.

Page 55: Platformy Technologiczne ADO.NET

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

Page 56: Platformy Technologiczne ADO.NET

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>

Page 57: Platformy Technologiczne ADO.NET

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>

Page 58: Platformy Technologiczne ADO.NET

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

Page 59: Platformy Technologiczne ADO.NET

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

Page 60: Platformy Technologiczne ADO.NET

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

Page 61: Platformy Technologiczne ADO.NET

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();

Page 62: Platformy Technologiczne ADO.NET

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]);

Page 63: Platformy Technologiczne ADO.NET

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);