Platformy Technologiczne ADO.NET

Report
PLATFORMY
TECHNOLOGICZNE
ADO.NET
mgr inż. Tomasz Gawron
Architektura ADO.NET
2

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
XML
RDBMS
Email i
wiadomości
ADO
OLE DB
Platformy Technologiczne 2014
System plików
Architektura ADO.NET
3
.NET Data Provider
DataSet
Tables
Connection
Transaction
SelectCommand
DataTable
Command
InsertCommand
DataRowCollection
Parameters
UpdateCommand
DataReader
DeleteCommand
DataAdapter
DataColumnCollection
ConstraintCollection
DataRelationCollection
ReadXml
WriteXml
XML
Database
Platformy Technologiczne 2014
Tryb połączeniowy
4


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
Klient
– Dostęp do danych
– Przesuwanie się przez MoveNext oraz
MovePrevious
Serwer
rs
Kursor
Platformy Technologiczne 2014
Wyniki
zapytania
Tabele
Tryb połączeniowy
5

Zalety

Wady

Połączenie tworzymy tylko raz

Niepotrzebne zużycie zasobów

Możemy ustawiać zmienne
powiązane z ‘sesją’

Problemy ze skalowalnością

Nie dostosowany do aplikacji
webowych


Szeroki dostęp do mechanizmów
zabezpieczajacych
dostarczonych przez bazę
danych
Pierwszy wiersz zapytania
dostępny od razu


Użytkownicy się nie wylogowują

Wahająca się liczba użytkowników
Nie dostosowany do aplikacji
wielowarstwowych
Platformy Technologiczne 2014
Tryb bezpołączeniowy
6

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
idle
Zasoby są używane tylko gdy są potrzebne
Serwer
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
Serwer
Klient
rs
Kursor
Platformy Technologiczne 2014
Wyniki
zapytania
Tabele
Tryb bezpołączeniowy
7

Zalety

Wady

Mniejsze zużycie zasobów
serwera

Otwieranie i zamykanie połączeń
jest kosztowne

Modyfikacja danych jest szybsza
i bardziej elastyczna

Wczytywanie dużych ilości
danych jest czasochłonne

Dane nie związane z
połączeniem

Zużycie zasobów po stronie
klienta

Łatwe przekazywanie między
warstwami

Mniej opcji zarządzania
bezpieczeńswem

Wykorzystywane w aplikacjach
wielowarstwowych oraz
webowych
Platformy Technologiczne 2014
Model obiektowy
8
Connection
DataSet
Command
DataTable
Parameter
DataColumn
DataReader
DataRow
Transaction
Constraint
DataAdapter
Klasa
DataRelation
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 2014
Hierarchia klas
9
• Interfejsy




IDbConnection
IDbConnection
IDbCommand
IDbTransaction
IDataReader
IDbCommand
IDbTransaction
IDataReader
• Abstrakcyjne klasy bazowe




DbConnection
DbCommand
DbTransaction
DbDataReader
DbConnection
DbCommand
DbTransaction
DbDataReader
...
• Implementacja specjalizowana




OleDb:
Sql:
Oracle:
Odbc:
implementacja dla OLEDB
implementacja dla SQL Server
implementacja dla Oracle
implementacja dla ODBC
OleDbConnection
SqlConnection
OleDbCommand
OleDbTransaction
OleDbDataReader
Platformy Technologiczne 2014
OracleConnection
SqlCommand
SqlTransaction
SqlDataReader
OracleCommand
OracleTransaction
OracleDataReader
Tworzenie połączenia
10


Łańcuch połączenia (ang. connection string) - ciąg znaków zawierających
parametry konfiguracji połączenia
Obiekt SqlConnection:
string strConn = "data source=.;initial catalog=NewDb;integrated security=true";
SqlConnection conn = new SqlConnection(strConn);

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:
…
Platformy Technologiczne 2014
Connection String
11

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 2014
Obiekt połączenia
12
public interface IDbConnection
{
string ConnectionString {get; set;}
int
ConnectionTimeout {get;}
string Database
{get;}
ConnectionState State
{get;}
IDbTransaction
IDbTransaction
void
void
IDbCommand
void
BeginTransaction();
BeginTransaction(IsolationLevel il);
ChangeDatabase(string db);
Close();
CreateCommand();
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 2014
Zarządzanie połączeniami
13
try . . . catch . . . finally
try
{
// Open the connection
conn.Open();
DoSomething();
}
catch ( SqlException ex )
{
//Log the exception
}
finally
{
Blok using
try
{
using (SqlConnection conn =
new SqlConnection(source))
{
// Open the connection
conn.Open ( ) ;
DoSomething();
}
}
catch (SqlException e)
{
// Log the exception
}
conn.Close ( ) ;
}
Platformy Technologiczne 2014
Pula połączeń
14

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 2014
Modele programowania
15

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 2014
Command
16
public interface IDbCommand
{
string
CommandText
int
CommandTimeout
CommandType
CommandType
IDbConnection
Connection
IDbTransaction Transaction
UpdateRowSource UpdatedRowSource
IDataParameterCollection Parameters
{get; set;}
{get; set;}
{get; set;}
{get; set;}
{get; set;}
{get; set;}
{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 2014
Wywołania Command
17

ExecuteNonQuery


Zwraca liczbę wierszy ‘dotkniętych’ przez zapytanie
Zapytania DDL and DCL


Zapytania DML


ExecuteScalar zwraca typ Object
ExecuteDataReader



Zwraca obiekt DataReader
Reader zależny od providera: SqlDataReader, OleDbDataReader
DataReader


INSERT, UPDATE, DELETE
ExecuteScalar


CREATE, ALTER, DROP, GRANT, DENY, REVOKE
Służy tylko do odczytu, możliwe przesuwanie tylko w przód
ExecuteXmlReader

ExecuteXmlReader – dostępny tylko dla SQL Server
Platformy Technologiczne 2014
Command - przykład
18
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 2014
Asynchroniczne wywołanie Command
19
IAsyncResult
IDataReader
BeginExecuteReader (AsyncCallback callback)
EndExecuteReader (AsyncResult result)
IAsyncResult
int
BeginExecuteNonQuery (AsyncCallback callback)
EndExecuteNonQuery (IAsyncResult result)
IAsyncResult
IDataReader
BeginExecuteXmlReader (AsyncCallback callback)
EndExecuteXmlReader (IAsyncResult result)
Platformy Technologiczne 2014
Zapytania parametryzowane
20


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
...
IDataParameterCollection
Parameters {get;}
...
Parameters
*
<<interface>>
IDataParameter
//----- Properties
DbType DbType {get; set;}
ParameterDirection Direction {get; set;}
string ParamterName {get; set;}
object Value {get; set;}
...
<<interface>>
IDbDataParameter
//----- Properties
int Size {get; set;}
...
Platformy Technologiczne 2014
Zapytania parametryzowane - przykład
21
1.
Zdefiniowanie zapytania
SQL Server: Identyfikacja parametru przez [email protected](przykład: "@name")
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "DELETE FROM Empls WHERE EmployeeID = @ID";
2. Dodanie parametru
cmd.Parameters.Add( new OleDbParameter("@ID", OleDbType.BigInt));
3. Przypisanie wartości
cmd.Parameters["@ID"].Value = 1234;
cmd.ExecuteNonQuery();
Platformy Technologiczne 2014
Data Reader
22

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 2014
Data Reader
23
• Stwórz obiekt i rozpocznij odczyt
IDataReader reader = cmd.ExecuteReader();
while (reader.Read()) {
• Przeczytaj kolumny do tablicy
object[ ] dataRow = new object[reader.FieldCount];
int cols = reader.GetValues(dataRow);
• Odczyt za pomocą indekserów
object val0 = reader[0];
object nameVal = reader["LastName"];
• Odczyt za pomocą metod
string firstName = reader.getString(2);
• Zamknięcie obiektu
}
reader.Close();
Platformy Technologiczne 2014
Data Reader
24
• 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ść
// 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
while
{
str
str
str
}
(myReader.Read())
SqlDataReader dr;
dr = cmdAuthors.ExecuteReader();
+= myReader[1];
+= myReader["field"];
+= myReader.GetDateTime(2);
while (dr.Read())
{
lstBuiltNames.Items.Add(dr["au_lname"] + ", "
+ dr["au_fname"]);
}
• Zamknięcie DataReader
• Zamkniecie połączenia
// Close DataReader and Connection
dr.Close();
conn.Close();
Platformy Technologiczne 2014
Transakcje
25

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 2014
Poziomy izolacji
26


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 2014
Transakcje
27

ADO.NET wspiera tranzakcyjność


Transakcję rozpoczynamy poprzez metodę BeginTransaction która zwraca
obiekt transakcji.
<<interface>>
Transakcja wspiera metody wykonujące zmiany
na bazie danych – polecenia (Command)
IDbCommand
...
IDbTransaction Transaction {get; set;}
...
Transaction 1

<<interface>>
IDbTransaction
Transakcja jest:

Zatwierdzana poprzez Commit

Wycofywana poprzez Rollback
//----- Properties
IDbConnection Connection {get;}
IsolationLevel IsolationLevel {get;}
// Methods
void Commit();
void Rollback();
...
Connection 1
<<interface>>
IDbConnection
…
IDbTransaction BeginTransaction();
IDbTransaction BeginTransaction
(IsolationLevel lvl);
Platformy Technologiczne 2014
Transakcje
28
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 2014
Tryb bezpołączeniowy – Data Set
29

„Baza danych” utrzymywana w pamięci (struktura relacyjna)
Tables
DataTable
Relations
DataView
DataViewManager
DataRow(s)
DataRelation
DataColumn
DataRelation
Constraint(s)
DataTable
DataColumn
DataTable
DataRow
DataTable
DataRelation
Platformy Technologiczne 2014
Data Set
30





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 2014
Data Set vs. Data Reader
31
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 2014
Data Set - budowa
32

DataSet składa się z



Kolecji DataTable
Kolekcji DataRelation
Dostęp do:




DataTableColumns
(= schema definition)
DataTableRows
(= data)
DefaultView (DataTableView)





DataTable.Columns[0]
DataTable.Columns[“columnna
me”]
DataRow

Łączy dwa obiekty DataTable
definiujue ParentTable i
ParentColumns
oraz ChildTable i ChildColumns
DataSet.Tables[0]
DataSet.Tables[“tablename”]
DataColumn

DataRelation

DataTable

DataTable składa się z



DataTable.Rows[0]
Pola tabeli


DataRow[0]
DataRow[“columnname”]
Platformy Technologiczne 2014
Typowany i nietypowany Data Set
33

Typowany Data Set

Nietypowany Data Set

Informacje o typach dołączane
są do obiektu

Nie posiada wbudowanego
schematu

Możliwy do stworzenia z
poziomu VS / poprzez xsd

Rozwiązanie bardziej elastyczne

Mniej podatny na błędy

Rozwiązanie sztywne

Odwołanie:

Odwołanie:

MyDataSet.News[0].Title

MyDataSet.Tables[“News”]
.Rows[0][“Title”]
Platformy Technologiczne 2014
Zdarzenia w Data Table
34

Dla kolumn: ColumnChanging, ColumnChanged


Dla wierszy: RowChanging, RowChanged, RowDeleting,
RowDeleted


DataColumnChangeEventsArgs: Column, ProposedValue, Row
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 2014
Data Adapter
35


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 2014
Data Adapter - polecenia
36

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 2014
Command builder
37


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 2014
Data Adapter - tworzenie
38

Zapisanie zapytania w DataAdapter
SqlDataAdapter da = new SqlDataAdapter
("select * from Authors",conn);

Konstruktor ustawia wartość SelectCommand
da.SelectCommand.CommandText;
da.SelectCommand.Connection;

Gdy wymagane, utworzenie InsertCommand,
UpdateCommand, DeleteCommand
Platformy Technologiczne 2014
Data Set - tworzenie
39

Ł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 2014
Data Set - tworzenie
40

Tworzenie i załadowanie danymi DataTable

Fill wywołuje SelectCommand obiektu DataAdapter
DataSet ds = new DataSet();
da.Fill(ds, "Authors");

Dostęp do DataTable
ds.Tables["Authors"].Rows.Count;
string str="";
foreach(DataRow r in
ds.Tables["Authors"].Rows)
{
str += r[2];
str += r["au_lname"];
}
Platformy Technologiczne 2014
Wypełnianie Data Set
41

Wydajność

Zdefiniowanie schematu przed wypełnieniem DataSet



Tworzenie typowanych DataSet:





DataTables, DataColumns, DataRelations są znane przed załadowaniem danych
Zwiększenie wydajności
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 2014
Data Set - podsumowanie
42

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 2014
Data View
43


DataView służy modyfikowaniu DataTable celem wyświetlenia
potrzebych danych
DefaultView zwraca standardowy widok dla DataTable
DataView dv = ds.Tables["Authors"].DefaultView;

Modyfikacja widoku z DataSet poprzez filtry
DataView dv = new DataView(ds.Tables["Authors"]);
dv.RowFilter = "state = 'CA'";
Platformy Technologiczne 2014
Relacje
44

Kolumna rodzica
DataColumn parentCol = ds.Tables["Customers"].Columns["CustomerID"]

Kolumna dziecka
childCol = ds.Tables["Orders"].Columns["CustomerID"]

Stworzenie relacji
parentCol
dr = New DataRelation _
(„CustOrders", parentCol, _
childCol)
ds.DataRelations.Add(dr)
Customers table
DataSet
Platformy Technologiczne 2014
DataRelation
childCol
Orders table
Nawigacja poprzez relacje
45
ds.Tables[index].Rows[index].GetChildRows("relation");
ds.Tables[index].Rows[index].GetParentRow("relation");
Orders
Customers
GetChildRows
DataSet
GetParentRow
DataView tableView;
DataRowView currentRowView;
tableView = new DataView(ds.Tables["Customers"]);
currentRowView = tableView[dgCustomers.SelectedIndex];
dgChild.DataSource = currentRowView.CreateChildView("CustOrders");
Customers
DataView
DataRowView
Orders
CreateChildView
DataSet
Platformy Technologiczne 2014
Modyfikacja danych
46
• BeginEdit rozpoczyna edycję danych
• EndEdit i CancelEdit kończą edycję danych
Wstawianie wiersza

Stworzenie wiersza
DataRos drEmployee =
dtEmployees.Rows(3)
drEmployee.BeginEdit()
drEmployee("FirstName") = "John"
drEmployee("LastName") = "Smith"
drEmployee.EndEdit()
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 2014
Modyfikacja danych
47

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 2014
Śledzenie zmian w Data Set
48

DataRow może przechowywać wiele wersji wiersza:

DataRowVersion.Current


DataRowVersion.Original


Wartość przed dokonaniem zmian
DataRowVersion.Proposed


Aktualna wartość
Wartość w trakcie cyklu BeginEdit / EndEdit
DataRowVersion.Default

Wartość standardowa
Platformy Technologiczne 2014
Diagram stanów Data Row
49
row =table.NewRow
Detached
table.Row.
Add(row)
row.
Delete
table.Rows.
Remove(row)
row[..] = ..
RejectChanges
Added
AcceptChanges
RejectChanges
Unchanged
Modified
AcceptChanges
AcceptChanges
RejectChanges
Deleted
row.Delete
row.Delete
Platformy Technologiczne 2014
Row versions
50
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 2014
Modyfikacja źródła danych
51

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 2014
Optymalizacja zmian
52

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 2014
Spójność danych
53

„A” czyta wiersz
Column name
CustID

Current value
Value in database
101
101
101
LastName
Smith
Smith
Smith
FirstName
Bob
Bob
Bob
„B” zmienia FirstName z "Bob" na "Robert" i zapisuje zmiany
Column name
CustID

Original value
Original value
Current value
Value in database
101
101
101
LastName
Smith
Smith
Smith
FirstName
Bob
Robert
Bob
„A” zmienia FirstName na "James”i próbuje aktualizować bazę
Column name
CustID
Original value
Current value
Value in database
101
101
101
LastName
Smith
Smith
Smith
FirstName
Bob
James
Robert
Platformy Technologiczne 2014
Obsługa współbieżnego dostępu
54

Tryb bezpołączeniowy używa podejścia optymistycznego (optimistic
concurrency)


Możliwość konfliktów




Zwalnianie blokad podczas rozłączania
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 2014
Rozwiązywanie konfliktów
55

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 2014
SqlDataSource
56

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 2014
SqlDataSource
57

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 2014

similar documents