Platformy Technologiczne ADO.NET
Download
Report
Transcript Platformy Technologiczne ADO.NET
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 „@”(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