środa, 6 sierpnia 2014

DataView - ciekawa zabawka

Tworząc aplikacje bazodanowe (pomijam wszelkiego rodzaju "ulepszacze") praktycznie zawsze pobieramy dane, które wcześniej czy później wyświetlimy w tabelce (np dataGridView).

Dane możemy pobrać wygodnie np za pomocą SQLDataAdaptera do DataTable lub DataSet, a następnie przerzucić na nasz dataGrid.

Jeśli chcemy filtrować zbiór, możemy zrealizować to na wiele sposobów, m.in.:
  1. Za każdym razem pobierać "świeże", przefiltrowane dane z bazy - tylko wtedy dodatkowo obciążamy system, a w chwili kiedy pobieramy dane z dość statecznego zbioru (np słownika), nie zawsze będzie to "eleganckie" rozwiązanie.
  2. Filtrować dane w naszej kolekcji (np DataTable, Combobox, DataGridView, etc) - wszystko fajnie, ale musimy to ręcznie oprogramować, co bywa męczące, a w dodatku możemy być gorsi z algorytmów, ale dobrzy z SQL'a... co wtedy?

Jedno i drugie rozwiązanie jest jak najbardziej akceptowalne (zależnie oczywiście od sytuacji). Natomiast mimo wszystko, fajnym wynalazkiem jest DataView.

System.Data.DataView

DataView osobiście nazywam "nakładką" na zbiór danych (sam w sobie nie przechowuje danych). Umożliwia m.in. sortowanie, edycję wyszukiwanie/filtrowanie, etc (więcej informacji pod tym linkiem ) W artykule opowiem trochę o filtrowaniu (oczywiście na przykładzie) :)

Zastosowanie:
  1. Pobranie kompletu danych (czasami działa szybciej niż przy przefiltrowanych zbiorach - o tym również wspomnę :) )
  2. upakowanie danych naszym DataView (amulet szczęścia :) )
  3. Filtrowanie danych po stronie klienta (Serwer odpoczywa)

Koniec teorii, czas na praktykę.

załóżmy, że mamy prostą tabelkę

TBLServers
ID
ServerName
OperatingSystem
IP_Address
Location_City

Do pobrania danych (wszystkich) stworzyliśmy sobie procedurę SQL:

getServerList

w aplikacji pobraliśmy sobie dane i "wrzuciliśmy" do datagrida:

private void GetServers()
{
 SqlConnection con = new SqlConnection(/*nasz ConnectionString*/);
 SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter("exec getServerList", con);
 DataTable dt = new DataTable();

 //wypełniamy DataTable danymi za pomocą metody Fill:
 da.Fill(dt);

 //wypełniamy (wskazujemy źródło) naszym dataTable
 dataGridView1.DataSource=dt;

}


Działa, pobraliśmy dane. Ale chcielibyśmy móc filtrować wyniki po miejscowości i obsłużmy zdarzenie
Dodajemy Textbox, po drodze dorzucamy DataView i metodę do obsługi filtrowania i obsługujemy zdarzenie na TextChanged...


DataView dataViewServers;
private void GetServers()
{
 SqlConnection con = new SqlConnection(/*nasz ConnectionString*/);
 SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter("exec getServerList", con);

 DataTable dt = new DataTable();
 da.Fill(dt);

 //upakujmy nasz zbiór danych DataView...
 dataViewServers = new DataView(dt);
             
 //...i podłączmy DataView zamiast DataTable dataGridView1.DataSource=dataViewServers;
 } 
 //utwórzmy dla porządku metodę odpowiedzialną za filtrowanie
 private void FilterServers()
 {
  //filtrowanie jak w SQL...
  dataViewServers.RowFilter = "Location_City like '"+textBoxCity.Text+"%'";

 }
 //obsłużymy zdarzenie naszego textboxa, aby filtrowało "na żywo": 
 private void textBoxCity.TextChanged(object sender, EventArgs e)
 {

  filterServers();
 }

Rezultat: mamy bardzo fajną, szybką i dynamiczną wyszukiwarkę. przy czym samo wyszukiwanie odbywa się po stronie aplikacji - operując na pobranej już kolekcji. Zawsze możemy dodać kolejne warunki do filtrowania danych.


Podsumowanie

 DataView jest bardzo wygodnym dodatkiem, umożliwiającym szybkie filtrowanie danych po stronie klienta, na pobranym już zbiorze danych. Nie musimy ręcznie filtrować danych, czy też pobierać na nowo zbioru z serwera, co w mniejszym lub większym stopniu wpływa na wydajność pracy.W dodatku DataView działa zaskakująco szybko, a sama metoda filtrowania jest po prostu - wygodna.

Brak komentarzy:

Prześlij komentarz