70-562: Using the ADO.NET Disconnected Classes

Artykuł pochodzi w serii przygotowań do egzaminu 70-562 ASP.NET.

W dzisiejszym wpisie pojawi się pierwszy z trzech artykułów opisujących sposoby dostępu do danych. Na pierwszy ogień pójdą niewymagającego aktywnego połączenia z źródłem danych, następnie w środę pojawi się artykuł o klasach wykorzystujących aktywne połączenia, a na koniec w piątek pojawi się artykuł o pracy z plikami xml.

Ale zanim przejdziemy to omawiania poszczególnych zagadnień z dzisiejszej lekcji, to napiszę jak w łatwy sposób sprawdzać sobie afekt naszych poczynań. Aby w łatwy sposób wyświetlić dane z omawianych klas, wystarczy skorzystać z kontrolki GridView. Dodajemy do testowej strony kontrolkę GridView, a następnie w kodzie, gdy potrzebujemy wyświetlić jakieś dane, wystarczy podpiąć pod właściwość DataSource te dane (np. omawianego później DataTable) oraz wywołać metodę DataBind, tak jak to widać niżej na listingu.

   1: GridView1.DataSource = GetDataSource();
   2: GridView1.DataBind();

DataTable

Podstawową klasą omawianą w tej lekcji jest DataTable. Klasa ta reprezentuje tabelę danych w pamięci. Obiekt typu DataTable zawiera dwie ważne właściwości Columns oraz Rows, które odpowiednio zawierają kolekcję kolumn w tabeli (określa schemat danych) oraz kolekcję wierszy (są to dane o odpowiednim schemacie). Aby stworzyć nową tabelę w pamięci wystarczy utworzyć obiekt DataTable, zdefiniować kolumny, a na koniec dodać dane, co widać na poniższym listingu:

   1: DataTable employee = new DataTable("Pracownicy"); //Utworzenie tabeli Pracownicy
   2:  
   3: DataColumn id = new DataColumn("Id"); //Utworzenie kolumny, w której będzie znajdować się Id pracownika
   4: id.DataType = typeof (Guid); //Typu danych kolumny - Guid
   5: id.Unique = true; //Dane w kolumnie muszą być unikalne
   6: id.AllowDBNull = false; //Wartość w kolumnie jest unikalna
   7: id.Caption = "Id"; //Tytuł kolumny
   8: employee.Columns.Add(id);
   9:  
  10: DataColumn firstName = new DataColumn("Imie");
  11: firstName.DataType = typeof (string);
  12: firstName.MaxLength = 35; //Maksymalna długość pola - 35 znaków
  13: firstName.AllowDBNull = false;
  14: employee.Columns.Add(firstName);
  15:  
  16: DataColumn lastName = new DataColumn("Nazwisko");
  17: lastName.DataType = typeof (string);
  18: lastName.MaxLength = 35;
  19: lastName.AllowDBNull = false;
  20: employee.Columns.Add(lastName);
  21:  
  22: DataColumn salary = new DataColumn("Wynagrodzenie");
  23: salary.DataType = typeof (decimal);
  24: salary.DefaultValue = 0; //domyślna wartość
  25: employee.Columns.Add(salary);
  26:  
  27: DataColumn lastNameAndFirstName = new DataColumn("NazwiskoImie");
  28: lastNameAndFirstName.DataType = typeof (string);
  29: lastNameAndFirstName.MaxLength = 70;
  30: lastNameAndFirstName.Expression = "Nazwisko + ', ' + Imie"; //Kolumna zbudowana na podstawie wyrażenia i innych kolumn
  31: employee.Columns.Add(lastNameAndFirstName);
  32:  
  33: DataRow newemployee = employee.NewRow();
  34: newemployee["Id"] = Guid.NewGuid();
  35: newemployee["Imie"] = "Daniel";
  36: newemployee["Nazwisko"] = "Plawgo";
  37: newemployee["Wynagrodzenie"] = 5000;
  38: employee.Rows.Add(newemployee);
  39:  
  40: GridView1.DataSource = employee;
  41: GridView1.DataBind();

 

Wynikiem powyższego kodu będzie prosta tabelka:

image

W przykładnie została użyta klasa DataColumn w celu zdefiniowania schematu jednej kolumny (ciekawsze właściwości tej klasy zostały opisane za pomocą komentarzy). Natomiast w celu dodania nowego wiersza do tabeli została użyta klasa DataRow. Co ważne: jak chcemy dodać nowy wiersz do tabeli musimy stworzyć nowy obiekt klasy DataRow za pomocą metody NewRow obiektu DataTable, dzięki czemu nowy wiersz będzie miał identyczny schemat pól jak tabela.

DataView

Pracując z obiektem DataTable czasami potrzebujemy wykonać rożnego rodzaju operacje typu sortowanie czy wyświetlenie określonych rekordów z tabeli. Do tego celu można wykorzystać klasę DataView. I tak, aby posortować elementy z tabeli wystarczy utworzyć obiekt DataView przekazując do konstruktora obiekt DataTable, a następnie ustawić wyrażenie sortujące do właściwości Sort obiektu DataView.

   1: DataView view = new DataView(employee);
   2: view.Sort = "Nazwisko, Imie ASC";

 

Natomiast filtrowanie elementów w tabeli odbywa się za pomocą właściwości RowFilter. Podobnie jak w przypadku właściwość Sort przekazujemy wyrażenie sortujące za pomocą stringa.

   1: DataView view = new DataView(employee);
   2: view.RowFilter = "Nazwisko like 'P%'";

 

DataSet

Kolejną ważna klasą w ADO.NET jest DataSet. DataSet jest relacyjną reprezentacją danych znajdujących się w pamięci. DataSet głownie składa się z dwóch elementów: tabel (właściwość Tabels, która przechowuje kolekcje obiektu DataTable) oraz relacji między tabelami (właściwość Relations, która przechowuje kolekcje obiektów DateRelation).

image

Poniższy przykład pokazuje jak utworzyć dwie tabele, dodać je do DataSet oraz utworzyć relacje między tymi tabelami:

   1: DataTable company = new DataTable("Company");
   2: company.Columns.Add("Id", typeof(Guid));
   3: company.Columns.Add("Nazwa", typeof(string));
   4: company.PrimaryKey = new DataColumn[] { company.Columns["Id"] }; //Ustawienie klucza głównego
   5:  
   6: DataTable employee = new DataTable("Pracownicy"); //Utworzenie tabeli Pracownicy
   7:  
   8: DataColumn id = new DataColumn("Id"); //Utworzenie kolumny, w której będzie znajdować się Id pracownika
   9: id.DataType = typeof (Guid); //Typu danych kolumny - Guid
  10: id.Unique = true; //Dane w kolumnie muszą być unikalne
  11: id.AllowDBNull = false; //Wartość w kolumnie jest unikalna
  12: id.Caption = "Id"; //Tytuł kolumny
  13: employee.Columns.Add(id);
  14:  
  15: DataColumn firstName = new DataColumn("Imie");
  16: firstName.DataType = typeof (string);
  17: firstName.MaxLength = 35; //Maksymalna długość pola - 35 znaków
  18: firstName.AllowDBNull = false;
  19: employee.Columns.Add(firstName);
  20:  
  21: DataColumn lastName = new DataColumn("Nazwisko");
  22: lastName.DataType = typeof (string);
  23: lastName.MaxLength = 35;
  24: lastName.AllowDBNull = false;
  25: employee.Columns.Add(lastName);
  26:  
  27: DataColumn salary = new DataColumn("Wynagrodzenie");
  28: salary.DataType = typeof (decimal);
  29: salary.DefaultValue = 0; //domyślna wartość
  30: employee.Columns.Add(salary);
  31:  
  32: DataColumn lastNameAndFirstName = new DataColumn("NazwiskoImie");
  33: lastNameAndFirstName.DataType = typeof (string);
  34: lastNameAndFirstName.MaxLength = 70;
  35: lastNameAndFirstName.Expression = "Nazwisko + ', ' + Imie"; //Kolumna zbudowana na podstawie wyrażenia i 
  36: employee.Columns.Add(lastNameAndFirstName);
  37:  
  38: DataColumn companyId = new DataColumn("IdPrzedsiebiorstwo");
  39: companyId.DataType = typeof (Guid);
  40: employee.Columns.Add("IdPrzedsiębiorstwa", typeof(Guid));
  41:  
  42: employee.PrimaryKey = new DataColumn[] {employee.Columns["Id"]}; //Ustawienie klucza głównego
  43:  
  44: DataRow newCompany = company.NewRow();
  45: Guid companyGuid = Guid.NewGuid();
  46: newCompany["Id"] = companyGuid;
  47: newCompany["Nazwa"] = "eastgroup.pl";
  48: company.Rows.Add(newCompany);
  49:  
  50: DataRow newemployee = employee.NewRow();
  51: newemployee["Id"] = Guid.NewGuid();
  52: newemployee["Imie"] = "Daniel";
  53: newemployee["Nazwisko"] = "Plawgo";
  54: newemployee["Wynagrodzenie"] = 5000;
  55: newemployee["IdPrzedsiębiorstwa"] = companyGuid;
  56: employee.Rows.Add(newemployee);
  57:  
  58: newemployee = employee.NewRow();
  59: newemployee["Id"] = Guid.NewGuid();
  60: newemployee["Imie"] = "Kamil";
  61: newemployee["Nazwisko"] = "Lemański";
  62: newemployee["Wynagrodzenie"] = 3000;
  63: newemployee["IdPrzedsiębiorstwa"] = companyGuid;
  64: employee.Rows.Add(newemployee);
  65:  
  66: //Utworzenie nowego DataSeta
  67: DataSet dataSet = new DataSet();
  68:  
  69: //Dodanie tabel do DataSeta
  70: dataSet.Tables.Add(employee);
  71: dataSet.Tables.Add(company);
  72:  
  73: //Dodanie relacji do DataSeta
  74: dataSet.Relations.Add("Company_Employee", company.Columns["Id"], employee.Columns["IdPrzedsiębiorstwa"]);

 

Serializacja

Obiekty klas DataSet oraz DataTable bardzo łatwo jest serializować czy do pliku xml czy pliku binarnego.

W przypadku serializacji do pliku XML wystarczy wywołać na tych obiektach metodę WriteXml (metoda WriteXmlSchema zapisuje plik schematu danych).

   1: dataSet.WriteXmlSchema(MapPath("data.xsd"));
   2: dataSet.WriteXml(MapPath("data.xml"));

Jeśli chcemy dane zdeserializować z pliku xml to wywołujemy metody ReadXmlSchema oraz ReadXml.

   1: dataSet.ReadXmlSchema(MapPath("data.xsd"));
   2: dataSet.ReadXml(MapPath("data.xml"));

 

LINQ To DataSet

Jeśli pracujemy z DataSetem możemy korzystać z zintegrowane języka zapytań (LINQ), który pojawił się wraz z .NET 3.5. Poniżej prosty przykład pokazujący ja wyciągnąć nazwyska pracowników o pensji większej niż 4000.

   1: var emp = from em in employee.AsEnumerable()
   2:           where em.Field<Decimal>("Wynagrodzenie") > 4000
   3:           select new {LastName = em.Field<string>("Nazwisko")};

Tagi: , , , , , ,

Add comment




  Country flag
biuquote
  • Comment
  • Preview
Loading


Eastgroup.pl na facebooku