Metody łączenia z bazą danych i wykonywania zapytań – ADO.NET

 

 

 

Cele ćwiczenia

 

 

ADO.NET

 

ADO.NET jest zbiorem komponentów platformy .NET zapewniających dostęp do baz danych. Klasy ADO.NET można podzielić na dwie kategorie dostawców danych i kontenery danych. Dostawcy danych zapewniają dostęp do bazy danych i wykonywanie zapytań. Kontenery danych tworzą w pamięci aplikacji wewnętrzną bazę danych najczęściej jest to kopia całości lub fragmentu zewnętrznej bazy danych

Domyślni dostawcy danych są skonfigurowani w pliku machine.config.

 

Strona z informacją o zainstalowanych na serwerze dostawcach danych

 

1.    Utwórz nową witrynę w lokalnym systemie plików, lub dodaj katalog do istniejącej witryny.

2.    Dodaj do witryny stronę dostawcy.aspx informującą o wszystkich dostawcach fabrycznych zainstalowanych na serwerze.

 

Listing 1. Kod umieszczający w kontrolce GridView1 pełne dane wszystkich dostawców fabrycznych i same nazwy dostawców w Label1.; wymaga using System.Data.Common;

 

DataTable dostawcy = DbProviderFactories.GetFactoryClasses();

GridView1.DataSource = dostawcy;

GridView1.DataBind();

//przykład czytania tabeli

Label1.Text = "<h3> Lista nazw zainstalowanych dostawców fabrycznych </h3>";

foreach (DataRow wiersz in dostawcy.Rows)

{

    Label1.Text += wiersz[0].ToString() + "<br />";

}

 

3.    Uruchom stronę i zapoznaj się z listą zainstalowanych dostawców.

 

Dodanie nowego dostawcy fabrycznego do aplikacji

 

Nowych dostawców można dodać w konfiguracji serwera lub aplikacji. Poniżej zamieszczony jest przykład dodania do aplikacji dostawcy danych dla baz danych PostreSQL.

 

1.    Pobierz bibliotekę Npgsql.Net Data Provider for Postgresql.

2.    Dodaj bibliotekę do aplikacji.

3.    Skonfiguruj nowego dostawcę w pliku web.config dodając poniższy kod.

 

<system.data>

      <DbProviderFactories >

            <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql Server" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.9.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"/>

      </DbProviderFactories>

</system.data>

 

Szczegółowe dane o wersji znajdują się w pliku policy.2.0.Npgsql.config.

 

4.    Uruchom stronę i zapoznaj się z listą zainstalowanych dostawców.

 

Dodanie do aplikacji biblioteki Npgsql umożliwia korzystanie z funkcji dostępu do danych serwera PostgreSQL. Skonfigurowanie dostawcy Npgsql pozwala na tworzenie oprogramowania niezależnego od typu serwera, np. korzystając z kontrolki SqlDataSource. Skonfigurowany dostawca nie będzie używany w dalszej części ćwiczenia.

 

Strona edycji zapytań SQL i prezentacji wyników

 

Kolejna strona aplikacji umożliwi przesłanie do SQL Servera zapytania wpisanego do kontrolki tekstowej. Wynik zapytania zostanie wyświetlony w kontrolce GridView.

 

1.      W katalogu App_Data umieść nowy plik bazy danych cwiczenie.mdf, plik będzie lokalną bazą dla projektowanej aplikacji.

2.      Na nowej stronie SqlServer.aspx umieść kontrolki:

a.    TextBoxSQL – kontrolka jest przeznaczona do wpisywania kodu zapytań SQL, dlatego powinna umożliwiać wpisanie kilku linii tekstu (TextMode=MultiLine),

b.    Button1 – kliknięcie kontrolki będzie uruchomiało wysłanie zapytania,

c.    Label1 – kontrolka przeznaczona do umieszczania komunikatów,

d.   GridView1 – kontrolka przeznaczona do prezentowania wyników zapytania.

3.      Na początku strony w sekcji using dodaj przestrzeń nazw System.Data.SqlClient poleceniem using System.Data.SqlClient;.

4.      W metodzie obsługi kliknięcia przycisku dodaj kod wysyłający polecenie SQL umieszczone w kontrolce TextBox1 do serwera i umieszczający wynik zapytania w kontrolce GridView1.

 

Listing 2. Kod wysyłający polecenie SQL umieszczone w kontrolce TextBox1 do serwera i wstawiający wyniki zapytania do kontrolki GridView1.

 

Label1.Text = ""; //usuwanie starych komunikatów

 

string text_zapytania = TextBoxSQL.Text; //pobranie treści zapytania

 

//utworzenie nowego obiektu połączenia z bazą danych

SqlConnection polaczenie = new SqlConnection("Data Source=.\\SQLEXPRESS; AttachDbFilename=|DataDirectory|\\cwiczenie.mdf; Integrated Security=True;User Instance=True");

 

//utworzenie nowego obiektu zapytania SQL       

SqlCommand zapytanie = new SqlCommand(text_zapytania);

 

try

{

    polaczenie.Open(); //otwarcie połączenia z bazą danych

    zapytanie.Connection = polaczenie; //dodanie zapytania do połączenia

    SqlDataReader wynik = zapytanie.ExecuteReader(); //wykonanie zapytania

 

    //przekazanie wyniku zapytania do kontrolki GridView

    GridView1.DataSource = wynik;

    GridView1.DataBind();

 

    //komunikat o ilości zmienionych lub dodanych wierszy

    if (!wynik.HasRows) Label1.Text += "Zapytanie zostało wykonane i nie zwróciło żadnych wierszy <br />";

 

    if (wynik.RecordsAffected != -1)

        Label1.Text += "Liczba zmienionych lub dodanych wierszy = " + wynik.RecordsAffected.ToString() + "<br />";

}

catch (Exception ex)

{

    Label1.Text += ex.GetType().ToString()+"<br />"//wydruk typu błędu

    Label1.Text += ex.Message.ToString() + "<br />";    //wydruk błędu

    GridView1.DataSource = null;

    GridView1.DataBind();

}

finally

{

    polaczenie.Close(); //zamknięcie połączenia

}

}

 

5.      Jako łańcuch połączenia wpisano połączenie do, utworzonej w poprzednim poleceniu, bazy danych cwiczenie.mdf.

6.      Uruchom stronę i przetestuj jej działanie.

7.      Testowanie rozpocznij od utworzenia w bazie danych tabel studenci i oceny poleceniami

 

CREATE TABLE studenci
(id_studenta  CHAR(4) PRIMARY KEY,
nazwisko      VARCHAR(25) NOT NULL,
imie          VARCHAR(25),
imie_ojca     VARCHAR(25));

 

CREATE TABLE oceny

(id_studenta     CHAR(4) REFERENCES studenci(id_studenta),

nazwa_przedmiotu VARCHAR(25),

ocena            VARCHAR(15),

data             DATETIME  DEFAULT GETDATE(),

PRIMARY KEY (id_studenta, nazwa_przedmiotu));

 

8.      Do utworzonych tabel wprowadź dane poleceniami

 

INSERT INTO studenci VALUES
('0001', 'Papkin', 'Jan', 'Jan');

INSERT INTO oceny VALUES
('0001', 'Odwaga', 'bdb', '2005-12-23');

INSERT INTO oceny VALUES
('0001', 'Fizyka', 'bdb', NULL);

INSERT INTO oceny VALUES
('0001', 'Matematyka', 'bdb', DEFAULT);

 

9.      Dodaj dodatkowe wymyślone przez siebie przykładowe dane.

10.  Przetestuj zapytania SELECT, miedzy innymi wykonaj instrukcje:

 

SELECT * FROM studenci;

SELECT * FROM studenci, oceny;

SELECT * FROM studenci JOIN oceny
ON studenci.id_studenta = oceny.id_studenta;

 

11.  Dodaj do strony kontrolki tekstowe do wpisywania wartości parametrów zapytań SQL.

12.  Dodaj do obiektu zapytanie parametry, których wartości pochodzą z dodanych w punkcie 11 kontrolek tekstowych.

 

Listing 3. Kod dodania do obiektu zapytanie dwóch .parametrów @Param1, @Param2, których wartości pochodzą z kontrolek TexBox1 i TextBox2.

 

    zapytanie.Parameters.AddWithValue("@Param1", TextBox1.Text);

    zapytanie.Parameters.AddWithValue("@Param2", TextBox2.Text);

 

13.  Przetestuj działanie zapytań z parametrami na przykładzie zapytań SELECT, DELETE, UPDATE, INSERT INTO.

 

Formularz dodawania nowych wierszy

 

1.    Dodaj nową stronę i umieść na niej kontrolki do wpisywania danych nowych studentów:

a.    TextBox1 – do wpisywania id_studenta,

b.    TextBox2 – do wpisywania nazwiska,

c.    TextBox3 – do wpisywania imienia,

d.   Button1 – do uruchamia akcji wpisania nowego studenta.

2.    Dodaj obsługę zdarzenia kliknięcia przycisku Button1 realizującą dopisywanie studenta, wzorującą się na poprzednim przykładzie.

 

 

Listing 4. Fragment kodu realizujący wysłanie do serwera polecenia SQL niezwracającego wartości.

 

polaczenie.Open(); //otwarcie połączenia z bazą danych

zapytanie.Connection = polaczenie; //dodanie zapytania do połączenia

 

int x = zapytanie.ExecuteNonQuery();

 

//komunikat o ilości zmienionych lub dodanych wierszy

if (x == -1) Label3.Text = "";

else Label3.Text = "Liczba zmienionych lub dodanych wierszy = " + x.ToString();

 

3.    Dodaj kontrolkę SqlDataSource1 następnie skonfiguruj źródło danych i zapytanie INSERT z 3 paramertami pobieranymi wartości z kontrolek TextBox1, TextBox2
 i TextBox3.

4.    Dodaj kolejny przycisk i obsługę kliknięcia przycisku; kliknięcie przycisku powinno spowodować wysłanie przez obiekt SqlDataSource1 skonfigurowanego w poprzednim punkcie zapytania INSERT.

 

Listing 5. Fragment kodu realizujący wysłanie przez obiekt SqlDataSource1 do serwera zapytania INSERT.

 

int x= SqlDataSource1.Insert();

Label3.Text = "Liczba zmienionych lub dodanych wierszy = " + x.ToString();

 

5.    Przetestuj działanie obu metod dodawania nowych wierszy do tabeli studenci.

 

Dodawanie nowych wierszy przy pomocy
kontrolek FormView, DetailsView i ListView

 

1.      Na nowej stronie umieść po kolei kontrolki FormView, DetailsView i ListView.

2.      Skonfiguruj jedno źródło danych dla tych kontrolek, przy konfiguracji źródła danych wybierz Advanced następnie zaznacz Generate INSERT, UPDATE and DELETE statements.

3.      Przetestuj działanie kontrolek.