630 likes | 827 Views
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
E N D
Platformy TechnologiczneADO.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 • 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 Platformy Technologiczne 2012
DataSet .NET Data Provider Tables Connection DataAdapter DataTable Transaction SelectCommand DataRowCollection InsertCommand Command DataColumnCollection Parameters UpdateCommand ConstraintCollection DeleteCommand DataReader DataRelationCollection Database Architektura ADO.NET ReadXml WriteXml XML Platformy Technologiczne 2012
idle busy idle Serwer rs Klient Tabele Kursor Wyniki zapytania 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 Możliwe niepotrzebne zużycie zasobów Połączenia • Serwery bazodanowe zapewniają dostęp do kursora przechowującego stan aktualnego wiersza • Dostęp do danych • Przesuwanie się przez MoveNext oraz MovePrevious 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
Serwer busy Klient rs Kursor Wyniki zapytania Tabele Tryb bezpołączeniowy • Połączenia są zwalniane zaraz po wykorzystaniu • Obiekty danych wykorzystywane są również po zwolnieniu połączenia • Połączenie jest nawiązywane by zapisać zmiany do bazy idle Serwer idle Zasoby są używane tylko gdy są potrzebne 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 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
Connection Command DataSet Parameter DataTable DataReader DataColumn Transaction DataRow DataAdapter Constraint DataRelation Model obiektowy Platformy Technologiczne 2012
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 Platformy Technologiczne 2012
Tworzenie połączenia • Łańcuchpołą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"; SqlConnectionconn = new SqlConnection(strConn); Platformy Technologiczne 2012
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 DbConnectionGetDatabaseConnection ( string name ) { ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings[name]; DbProviderFactory factory = DbProviderFactories.GetFactory(settings.ProviderName ); DbConnectionconn = factory.CreateConnection ( ) ; conn.ConnectionString = settings.ConnectionString ; return conn ; } Platformy Technologiczne 2012
Obiekt połączenia publicinterfaceIDbConnection { stringConnectionString {get; set;} intConnectionTimeout {get;} string Database {get;} ConnectionState State {get;} IDbTransactionBeginTransaction(); IDbTransactionBeginTransaction(IsolationLevelil); voidChangeDatabase(string db); voidClose(); IDbCommandCreateCommand(); voidOpen(); } • 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
Zarządzanie połączeniami try . . . catch . . . finally try { // Open the connection conn.Open(); DoSomething(); } catch ( SqlException ex ) { //Log the exception } finally { conn.Close ( ) ; } • Blok using • try • { • using (SqlConnectionconn = • new SqlConnection(source)) • { • // Open the connection • conn.Open ( ) ; • DoSomething(); • } • } • catch (SqlException e) • { • // Log the exception • } Platformy Technologiczne 2012
Pula połączeń • Connection pooling • proces utrzymywania otwartych połączeń i ponownego ich reużycia dla uzytkownika lub kontekstu • ParametryConnectionStringdlapoolingu • Connection Lifetime: długośćoczekiwaniapołączenianaponowneużycie • Max Pool Size: maksymalnaliczbapołączeń • Min Pool Size: Minimalnaliczbapołączeń • Pooling: True/False • … cnNorthwind.ConnectionString = _ "Integrated Security=True;" & _ "Initial Catalog=Northwind;" & _ "Data Source=London;" & _ "Pooling=True;"& _ "Min Pool Size=5;" & _ "Connection Lifetime=120;" Platformy Technologiczne 2012
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
Command publicinterfaceIDbCommand { stringCommandText {get; set;} intCommandTimeout {get; set;} CommandTypeCommandType {get; set;} IDbConnectionConnection {get; set;} IDbTransactionTransaction {get; set;} UpdateRowSourceUpdatedRowSource {get; set;} IDataParameterCollectionParameters {get;} void Cancel(); IDataParameterCreateParameter(); intExecuteNonQuery(); IDataReaderExecuteReader(); IDataReaderExecuteReader(CommandBehaviorcb); objectExecuteScalar(); void Prepare(); // NoteExecuteXmlReader (SqlCommand only) } • Connection - referencja do obiektupołączenia • CommandType- typpolecenia • Text – wyrażenie SQL • StoredProcedure • CommandText - wzależnościodwyborutypuplecenia: • Text – treśćpolecenia SQL • StoredProcedure – nazwaprocedury • Parameters • Parametry, z którymi zostanie wykonane zapytanie Platformy Technologiczne 2012
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
Command - przykład privatevoid Demo() { SqlConnectioncon = newSqlConnection( "Server=localhost; Database=Pubs; Integrated Security=SSPI" ); SqlCommandcmd = newSqlCommand( "SELECT COUNT( * ) FROM Authors", con ); con.Open(); Console.WriteLine( cmd.ExecuteScalar() ); // Writes '23' con.Close(); // Important! } Platformy Technologiczne 2012
Asynchroniczne wywołanie Command IAsyncResultBeginExecuteReader (AsyncCallbackcallback) IDataReaderEndExecuteReader (AsyncResult result) IAsyncResultBeginExecuteNonQuery (AsyncCallbackcallback) intEndExecuteNonQuery (IAsyncResult result) IAsyncResultBeginExecuteXmlReader (AsyncCallbackcallback) IDataReaderEndExecuteXmlReader (IAsyncResult result) Platformy Technologiczne 2012
Zapytania parametryzowane • Command pozwala na definiowanie parametrów wejściowych i wyjściowych • Parameter – pola klasy: • Name: nazwa parametru • Value: wartość parametru • DbDataType: typ danych • Direction: kierunek parametru • Input • Output • InputOutput • ReturnValue Platformy Technologiczne 2012
2. Dodanie parametru cmd.Parameters.Add( newOleDbParameter("@ID", OleDbType.BigInt)); 3. Przypisanie wartości cmd.Parameters["@ID"].Value = 1234; cmd.ExecuteNonQuery(); Zapytania parametryzowane - przykład • Zdefiniowanie zapytania SQL Server: Identyfikacja parametru przez „@”(przykład: "@name") SqlCommandcmd = newSqlCommand(); cmd.CommandText = "DELETE FROM Empls WHERE EmployeeID = @ID"; Platformy Technologiczne 2012
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 publicinterfaceIDataReader { int Depth {get;} boolIsClosed {get;} intRecordsAffected {get;} … void Close(); DataTableGetSchemaTable(); boolNextResult(); boolRead(); … } Platformy Technologiczne 2012
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]; objectnameVal = reader["LastName"]; • Odczyt za pomocą metod string firstName = reader.getString(2); • Zamknięcie obiektu } reader.Close(); Data Reader 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 // Open Connection and create command SqlConnection conn = new SqlConnection("data source=localhost; initial catalog=pubs; integrated security=true"); SqlCommand cmdAuthors = new SqlCommand("select * from Authors", conn); conn.Open(); // Create DataReader and read data SqlDataReader dr; dr = cmdAuthors.ExecuteReader(); while (dr.Read()) { lstBuiltNames.Items.Add(dr["au_lname"] + ", " + dr["au_fname"]); } // Close DataReader and Connection dr.Close(); conn.Close(); while (myReader.Read()) { str += myReader[1]; str += myReader["field"]; str += myReader.GetDateTime(2); } Platformy Technologiczne 2012
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
Poziomy izolacji • Definiują blokady na odczyt i zapis • ADO.NET zapewnia różne poziomy izolacji Platformy Technologiczne 2012
Transakcje • ADO.NET wspiera tranzakcyjność • Transakcję rozpoczynamy poprzez metodę BeginTransaction która zwraca obiekt transakcji. • Transakcja wspiera metody wykonujące zmiany na bazie danych – polecenia (Command) • Transakcja jest: • Zatwierdzana poprzez Commit • Wycofywana poprzez Rollback Platformy Technologiczne 2012
Transakcje 1. Definicja SqlConnection con = newSqlConnection(connStr); IDbTranaction trans = null; try { con.Open(); trans = con.BeginTransaction(IsolationLevel.ReadCommitted); 2. Stworzenie obiektów IDbCommand cmd1 = con.CreateCommand(); cmd1.CommandText = "DELETE [OrderDetails] WHERE OrderId = 10258"; cmd1.Transaction = trans; cmd1.ExecuteNonQuery(); IDbCommand cmd2 = con.CreateCommand(); cmd2.CommandText = "DELETE Orders WHERE OrderId = 10258"; cmd2.Transaction = trans; cmd2.ExecuteNonQuery(); 3. Zatwierdzenie lub cofnięcie wyników trans.Commit(); catch (Exception e) { if (trans != null) trans.Rollback(); } finally { try { con.Close(); } } Platformy Technologiczne 2012
DataRow(s) DataColumn Constraint(s) Relations DataRelation DataRelation Tryb bezpołączeniowy – Data Set • „Baza danych” utrzymywana w pamięci (struktura relacyjna) DataView Tables DataTable DataViewManager DataTable DataColumn DataTable DataRow DataTable DataRelation Platformy Technologiczne 2012
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
Data Set vs. Data Reader 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[“columnname”] • DataRow • DataTable.Rows[0] • Pola tabeli • DataRow[0] • DataRow[“columnname”] 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”].Rows[0][“Title”] Platformy Technologiczne 2012
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
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
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
Command builder • Obiekt CommandBuilder generuje polecenia wymagane do aktualizacji źródła danych po wprowadzeniu zmian w obiekcie DataSet. • Ograniczenia: • polecenie Select dotyczy pojedynczej tabeli • tabela w bazie musi mieć klucz główny lub unikatową kolumnę zawartą w oryginalnym poleceniu Select DataTabledt= ds.Tables["movies"]; // Use command builder to generate update commands SqlCommandBuildersb = new SqlCommandBuilder(da); // Add movie to table DataRowdrow = dt.NewRow(); drow["movie_Title"] = "Taxi Driver"; drow["movie_Year"] = "1976"; dt.Rows.Add(drow); // Delete row from table dt.Rows[4].Delete(); // Edit Column value dt.Rows[5]["movie_Year"] = "1944"; // Update underlying Sql Server table int updates = da.Update(ds, "movies"); MessageBox.Show("Rows Changed: " +updates.ToString()); Platformy Technologiczne 2012
Data Adapter - tworzenie • Zapisanie zapytania w DataAdapter • Konstruktor ustawia wartość SelectCommand • Gdy wymagane, utworzenie InsertCommand, UpdateCommand, DeleteCommand SqlDataAdapterda = new SqlDataAdapter ("select * from Authors",conn); da.SelectCommand.CommandText; da.SelectCommand.Connection; Platformy Technologiczne 2012
Data Set - tworzenie • Ładowanie danych poprzez SelectCommand obiektu DataAdapter • Definicja SQL, przez który zostaną załadowane dane • SelectCommand jako konstruktor privatevoid Demo() { SqlDataAdapterda = newSqlDataAdapter( "SELECT City FROM Authors", "Server=localhost; Database=Pubs; Integrated Security=SSPI" ); DataSetds = newDataSet(); da.Fill( ds, "Authors" ); // Opens and closes a connection foreach ( DataRowdrinds.Tables[ "Authors" ].Rows ) Console.WriteLine( dr[ "City" ] ); // Writes list of cities } Platformy Technologiczne 2012
Data Set - tworzenie • Tworzenie i załadowanie danymi DataTable • Fill wywołuje SelectCommand obiektu DataAdapter • Dostęp do DataTable DataSetds = 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
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
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
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 DataViewdv = ds.Tables["Authors"].DefaultView; DataView dv = new DataView(ds.Tables["Authors"]); dv.RowFilter = "state = 'CA'"; Platformy Technologiczne 2012
Relacje • Kolumna rodzica • Kolumna dziecka • Stworzenie relacji DataColumnparentCol = ds.Tables["Customers"].Columns["CustomerID"] childCol = ds.Tables["Orders"].Columns["CustomerID"] parentCol DataRelation Customers table dr= New DataRelation _ („CustOrders", parentCol, _childCol) ds.DataRelations.Add(dr) childCol DataSet Orders table Platformy Technologiczne 2012
Orders Customers Customers Orders GetChildRows DataRowView GetParentRow DataView CreateChildView DataSet DataSet Nawigacja poprzez relacje ds.Tables[index].Rows[index].GetChildRows("relation"); ds.Tables[index].Rows[index].GetParentRow("relation"); DataViewtableView; DataRowViewcurrentRowView; tableView = new DataView(ds.Tables["Customers"]); currentRowView = tableView[dgCustomers.SelectedIndex]; dgChild.DataSource = currentRowView.CreateChildView("CustOrders"); Platformy Technologiczne 2012
Modyfikacja danych DataRosdrEmployee = dtEmployees.Rows(3) drEmployee.BeginEdit() drEmployee("FirstName") = "John" drEmployee("LastName") = "Smith" drEmployee.EndEdit() • BeginEdit rozpoczyna edycję danych • EndEdit i CancelEdit kończą edycję danych • Wstawianie wiersza • Stworzenie wiersza • DataRow drNewEmployee = dtEmployees.NewRow() • Wypełnienie danymi • drNewEmployee("EmployeeID") = 11 • drNewEmployee("LastName") = "Smith" • Dodanie do DataTable • dtEmployees.Rows.Add(drNewEmployee) • Jednowierszowo • dtEmployees.Rows.Add( New Object() {11, "Smith"}) Platformy Technologiczne 2012
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
Ś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 cykluBeginEdit / EndEdit • DataRowVersion.Default • Wartość standardowa Platformy Technologiczne 2012
Diagram stanów Data Row Platformy Technologiczne 2012
Row versions CURRENT ORIGINAL PROPOSED White White N/A White White Brown Brown White N/A dataRow.BeginEdit(); dataRow[ "au_lname" ] = "Brown"; dataRow.EndEdit(); dataRow[ "au_lname", DataRowVersion.Current ] // Brown dataRow[ "au_lname", DataRowVersion.Original ] // White Platformy Technologiczne 2012