Cele ćwiczenia
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.
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.
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.
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.
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.
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.