Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Efektywne wykorzystanie danych w.NET Tomasz Kopacz.

Podobne prezentacje


Prezentacja na temat: "Efektywne wykorzystanie danych w.NET Tomasz Kopacz."— Zapis prezentacji:

1 Efektywne wykorzystanie danych w.NET Tomasz Kopacz

2 O czym będzie Część I Jak pisać przy użyciu.NET, SQL-a i MSDE Podstawowe obiekty DataSet DataBinding Część II Jak wykorzystać MSDE we własnej aplikacji

3 Kilka słów o połączeniu IConnection Pula Mapuje po dokładnej postaci ConnectionString Dodatkowe parametry: Connection Lifetime; Max Pool Size / Min Pool Size; Pooling=false POŁĄCZ, ZRÓB CO TRZEBA I ODŁĄCZ JAK NAJSZYBCIEJ Na raz jedno polecenie przy użyciu jednego IConnetion

4 Połączenie i hasło Naturalne miejsce WebForms -> web.config WinForms -> plikExe.config Hasło czystym tekstem??? Zakodować Rijandel System.Convert.ToBase64String DPAPI – zajrzeć na SqlConnection db = new SqlConnection( Data Source=localhost; Integrated Security=SSPI; Initial Catalog=Northwind"); … password=jan;user id=jan); … db.Open();

5 Główne obiekty użytkowe IDataCommand IDataReader Jednokierunkowy kursor tylko do odczytu Generowany przez IDataCommand DataSet Baza danych po stronie aplikacji klienckiej Wypełniany przez IDataAdapter Polecenia IDataCommand W środku wykorzystuje IDataReader XML Synchronizacja Transakcje

6 DataSet a DataReader Nie można powiedzieć jednoznacznie który lepszy IDataReader Szybki odczyt ale jednokierunkowy Brak mechanizmów aktualizacji Też databinding irr(MojePole) … DataSet Gdy potrzebna tymczasowa kopia (cache) XML z przyległościami Model bezpołączeniowy

7 Obsługa dużych obiektów (BLOB) Nie chcemy na raz całego obiektu Jeżeli tylko do odczytu IDataReader SequentialAccess + GetBytes() Fragmenty: Wsparcie ze strony MS SQL TEXTPTR –varbinary(16) READTEXT tabela.kolumna ptr przesunięcie wielkość

8 IDataReader? IDataReader Scenariusz: strona aspx z dynamicznie generowaną tabelą na podstawie IDataReader Każde odświeżenie strony to zapytanie do bazy Mały koszmarek: if (!irr.IsDBNull(irr.GetOrdinal(Pole))…

9 DataSet i Cache Globalny DataSet ASP.NET / obiekty biznesowe Drzewo kategorii, menu, coś półstatycznego DataSet GetMenu() { DataSet menu=Cache("MenuDS"); if(menu==null) { SqlDataAdapter da; //I zainicjować itp… menu=new DataSet(); da.Fill(menu); Cache("MenuDS") = menu; } return menu; }

10 DataSet, DataAdapter i ADO.NET Baza danych 4.Zwraca DataSet do klienta 5.Zmiana informacji przez użytkownika 2.Tworzenie obiektów SqlConnection i SqlDataAdapter 3.Wypełnienie DataSet z DataAdapter i zamknięcie połączenia SqlDataAdapter SqlConnection Kontrolka DataGrid 1.Klient tworzy żądanie wyświetlenia strony Aktualizacja danych DataSet 7.Wykorzystanie SqlDataAdapter do otwarcia SqlConnection, aktualizacja danych w bazie i zamknięcie połączenia Klient Provider DataSet

11 Odwzorowanie bazy danych, ale… Podzbiory elementów Synchronizacja zmian Rada: Baza i niezależny DataSet jako obiekt pomocniczy - biznesowy

12 DataSet – projektant lub kod Customer, Invoice, InvoiceItem, Product Uwaga! Projektujemy więzy i relacje! UniqueConstraint ForeginKeyConstraint DeleteRule,UpdateRule (AcceptRejectRule) Mocna kontrola typów

13 Relacje Ustawiać tylko te co są potrzebne do nawigacji Relacja rodzic – potomek DataRelation rel=ds.Relations.Add( "TestRel", ds.Invoice.Columns["id"], ds.InvoiceItem.Columns["id_inv"]) DataColumn[] aParent= { ds.Tables[0].Columns[0], ds.Tables[0].Columns[1] } DataColumn[] aChild= { …} ds.Relations.Add("TestRel",aParent,aChild,true)

14 Relacje - poruszanie się GetParentRow/GetChildRows ((MainDS.Invoice)ds.InvoiceItem[0].GetParentRow(rel)).inv_date… ds.Invoice[0].GetChildRows(rel).Length…

15 Triggery RowChanging, RowChanged ColumnChanging, ColumnChanged RowDeleting, RowDeleted Stan DataRowAction Add, Change, Commit, Delete, Rollback Nothing

16 Pola wyliczeniowe Generalnie szybkie Małe kłopoty z DataAdapter Można dodać do DataSet po wypełnieniu Język – patrz MSDN - temat DataColumn.Expression Property DataColumn col=new DataColumn("TotalPrice"); col.DataType=typeof(decimal); col.Expression="cnt * value"; ds.InvoiceItem.Columns.Add(col); …ds.InvoiceItem[0]["TotalPrice"]

17 Ładowanie danych BeginLoadData DataTable.LoadDataRow(tablica,true) EndLoadData – włącza, wczytane sprawdza! EnforceConstraints

18 DataSet i XML XMLDataDocument Różne sposoby generowania DataSet Relacja.Nested=True ColumnMapping=MappingType.Attribute Transmisja DiffGram Szybko podejrzeć zawartość DataSet: myDS.WriteXml( Console.Out ) Lub:

19 Demo Tworzenie DataSet Dodanie pola Podstawowe operacje Klucze, triggery i relacje

20 Wyszukiwanie/filtrowanie DataTable.Select(…); DataTable.Find(rPK) Kilka różnych DataView na jednym DataSet (jednej kopii danych) Filtry: Zdarzenie ListChanged dt.DefaultView.RowFilter = Pole=Wartość dt.DefaultView.RowFilter = InvData=#mm/dd/yyyy# dt.DefaultView.RowFilter = Parent.InvData=#mm/dd/yyyy#

21 DataView i wyszukiwanie Jeżeli szukamy nie wg PK, lepiej DataView Warto posortować wg. często filtrowanych pól DataView buduje wtedy INDEX Lepiej: v.Sort="Name; v.FindRows( KOPACZ); Tworzenie DataView: DataView v = new DataView( customerTable, "City='Warszawa'", "Name, Surname DESC", DataViewRowState.OriginalRows ); v.FindRows(new object [] {pole1,pole2});

22 DataView i relacje DataView budowany na tabeli nadrzędnej Operatory Parent(NazwaRelacji).Pole Child(NazwaRelacji).Pole Avg,Sum,Max, itp DataRelation rel = ds.Relations.Add("TestRel",…); DataView view = new DataView(ds.Invoice, "Sum(Child(TestRel).value)>=600", "", DataViewRowState.CurrentRows);

23 Demo - wyszukiwanie Stworzenie DataView Bazowanie na tabelach Zabawy z wyrażeniami Bez XML

24 DataSet a reszta świata Czyli DataSet i baza danych

25 Podstawa to DataAdapter DataAdapter baza SelectCommand CommandBuilder InsertCommand, UpdateCommand, DeleteCommand, DataAdapter DataSet MissingSchemaAction/MissingMappingAction TableMappings.Add (tabela_bd,tabela_ds) ColumnMappings.Add (bd,ds) Jeden DataAdapter do aktualizacji jednej tabeli DataAdapter decyduje ile danych znajdzie się w DataSet

26 Szybko wygenerować DataSet DataAdapter może wygenerować DataSet Nazwy kolumn prawidłowe Tabele – Table,Table1… da.Update(ds,Table1) ds.WriteXmlSchema(…) XSD.EXE SqlCommand sql=new SqlCommand("select * from Customer; select * from Invoice",sqlConnection1); SqlDataAdapter da=new SqlDataAdapter(sql); DataSet ds=new DataSet(); …Mapowania da.FillSchema(ds); da.Fill(ds)

27 Jak (nie) budować dynamicznego kodu i filtrować SP z odpowiednimi parametrami (NULL – nie filtruj) Dynamiczna budowa UŻYWAĆ StringBuilder Sprawdzać parametry (SQL Injection) where = ? ALTER PROCEDURE GetCustomers NVARCHAR(15) … ) AS select * from Customers where is null) AND … select * from Customers where City) AND …

28 Stronicowanie… Znaleźć coś co wyznacza strony Specjalne wyrażenie SELECT… SELECT TOP InvoiceID,Client,City … FROM Invoices WHERE InvoiceID NOT IN (SELECT TOP InvoiceID FROM Invoices ORDER BY Client, City) ORDER BY Client, City

29 Aktualizacja IDataAdapter Bazuje na wersjach wiersza Dodane -> InsertCommand Zmienione -> UpdateCommand Usunięte -> DeleteCommand Generowanie Przy użyciu CommandBuilder Wystarczająco proste SelectCommand… Ręcznie da.Update(ds,Customer); … da1.Update(ds.GetChanges(DataRowState.Deleted));

30 Problem – konflikt aktualizacji 3 wersje DataRowVersion Original, Current, Proposed, Default Wszystko zależy od …Command Porównanie wszystkich wartości Timestamp Wcale? 5 wersji DataRowState Added,Deleted,Modified,Unchanged Detached

31 Stany kolumn w DataSet

32 Demo - Mapowanie + aktualizacje DataSet wypełniany z SP Kilka wyników z SP i generowanie automatyczne DataSet Konflikt

33 Databinding Czyli związywanie czegoś z czymś

34 DataBinding Głównie zastosowanie w prezentacji danych Pola związane relacjami Praktycznie - dowolna właściwość R/W do dowolnej właściwości

35 Składnia – Windows Forms Proste związywanie Złożone związywanie (complex binding) Związywanie z listą wartości (np. ListBox) wyboru DataSource/DisplayMember/ValueMember SelectedValue CurrencyManager dla danego DataSource NazwaKontrolki.DataBindings. Add(Właściwość,źródło,element) Form1.BindingContext[MójDataset].Position -=1

36 Składnia – ASP.NET Podstawowa różnica Związywanie z kopią! (stąd -> kontrolka.DataBind()) Proste Złożone DataSource, DataTextField, DataTextFormatString, DataValueField IDataReader SqlCommand cmd=sqlconnection1.CreateCommand(); cmd.CommandText=select id,name from Customer; SqlDataReader rdr=cmd.ExecuteReader(); lstBox.DataSource = rdr; lstBox.DataTextField = name; lstBox.DataValueField = id; lstBox.DataBind();

37 Demo – binding i okolice Manipulacja wersjami pól Jak się zmieniają AcceptChanges Formatka master-detail Update wielopoziomowy w transakcji Przyciski poprzedni/następny DataBinding pomiędzy CheckBox a Enabled Panel-u

38 Część II – administracja MSDE Ograniczenia Instalacja Zarządzanie

39 Kilka słów o ograniczeniach MSDE: Do 2 GB RAM; max 2 procesory (HT) 8 średniej złożoności zapytań (workload governor) Tylko dla aktywnych połączeń Ograniczenie działa dla danej instancji 16 równoległych instancji (nazwanych) Dane w bazie maks 2 GB; log nie jest ograniczony Brak Analysis Services i Full Text Search Nie publikuje dla replikacji transakcyjnej Replikacja MERGE – tylko węzeł podrzędny Projektowanie bazy: VS.NET; VISIO; Access OSQL jak ktoś lubi

40 Sposoby instalacji Wykorzystanie MSM Ale – wtedy też my musimy sami dystrybuować poprawki! HotFix powinny działać… Wywoływanie pliku SETUP.EXE Parametry: /Q – o nic nie pyta /INSTANCENAME=mojainstancja /SECURITYMODE=SQL /SAPWD = moje tajne hasło /COLLATION=nazwa Plik MSI dodany do własnej instalacji i uruchamiany jako etap Uwagi o SP3a (parametry w linii poleceń) /DISABLENETWORKPROTOCOLS=0 – nie nasłuchuje na żadnych portach (tylko lokalnie); domyślna opcja

41 Dystrybucja własnego schematu danych Plik LDF i MDF Skrypty Jeden niewygodny Kilka: 1. Tworzenie tabel 2. Ładowanie danych 3. Tworzenie więzów 4. Tworzenie widoków, SP, funkcji 5. Prawa dostępu

42 Kilka opcji w bazie Po CREATE DATABASE exec sp_dboption N'DD2003', N'autoclose', Ntrue' exec sp_dboption N'DD2003', N'trunc. log', N'true' exec sp_dboption N'DD2003', N'autoshrink', N'true' exec sp_dboption N'DD2003', N'auto create statistics', N'true' exec sp_dboption N'DD2003', N'auto update statistics', N'true'

43 Podstawowe operacje administracyjne SQLDMO/TSQL (też – DTS) Warto przeczytać Sql Server Books Online Kopia i odzyskiwanie danych BACKUP DATABASE DD2003 TO DISK='C:\T1 RESTORE DATABASE DD2003 FROM DISK='C:\T1 Dołączanie/odłączanie bazy sp_attach_db/sp_detach_db DBCC CHECKDB('DD2003') Zastępuje DBCC CHECKALLOC w SQL 7.0 sp_addlogin/ sp_adduser/sp_addrolemember

44 Część końcowa Uwagi o projekcie, wydajności…

45 Kilka uwaga o wydajności Klucz główny Autoincrement? GUID ! (uniqueidentifier/ klasa Guid ) Kilka wyników w przy jednym zapytaniu CommandBehavior (IDataReader) KeyInfo – brak blokad SingleResult SingleRow Schemat bazy Zamiast wartości NULL – dodatkowy wiersz puste Bez PK/więzów…

46 DataSet a obiekty logiki biznesowej Wzorce projektowe Microsoft Data Patterns Data Access Application Block Narzędzia do mapowania O/R LLBLGen PRO SQL Server Centric.NET Code Generator (OlyMars) Oparty o wzorce Gotowe (prawie) Komponenty biznesowe, TreeView Factory, Usługi Web, Styl Object Space BETA!

47 Podsumowanie IConnection – pula Nie trzymać na zaś DataSet – potężny, wersje wartości Wyszukiwanie, XML IDataReader – bałagan, ale szybki IDataAdapter – od niego zależy komunikacja z bazą DataBinding – doskonałe nie tylko do prezentacji danych MSDE – wygodna baza, którą łatwo można uaktualnić do pełnego SQL w razie potrzeby Trochę pracy w oprogramowaniu części administracyjnej MS Access? Ale warto – w porównaniu z MDB to zupełnie inna klasa rozwiązań

48 Dziękuję za uwagę Pytania: Po prezentacji…


Pobierz ppt "Efektywne wykorzystanie danych w.NET Tomasz Kopacz."

Podobne prezentacje


Reklamy Google