sobota, 17 października 2009

Krótkie wprowadzenie do ADO.NET


ADO.NET
ADO.NET to zbiór bibliotek pozwalających na komunikację ze źródłami danych (np. baza danych, plik txt, XML, excel itp.). Aby można było pobierać/wysyłać dane do odpowiedniego źródła należy użyć providera. Każdy provider specjalizuje się w obsłudze innego źródła danych:
SQL Server .NET Data Provider – SQL Server
OLE DB .NET Data Provider - Access , Excel
ODBC .NET Data Provider – stare bazy danych
.NET Data Provider for Oracle – dla baz Oracla

Wszystkie tutaj zawarte przykłady opierają się na bazie SQL Server, jednak użycie innych providerów/źródeł danych jest bardzo podobne.

Obiekty w ADO.NET
SqlConnection – przechowuje nazwę, hasło i użytkownika bazy danych jak i ścieżkę do samej bazy danych
SqlCommand – przekazuje polecenia SQL do bazy danych; dzięki obiektowi SqlConnection wie do jakiej bazy danych się odwoływać
SqlDataReader – pozwala tylko na odczyt danych z bazy danych jako strumienia
DataSet – reprezentuje w pamięci odczytane dane. Zawiera w sobie obiekty typu DataTable, które z kolei składają się z obiektów DataRow i DataColumn
SqlDataAdapter – podczas odczytu wypełnia obiekt DataSet. Przechowuje referencję do obiektu SqlConnection, dzięki czemu otwiera/zamyka połączenie kiedy jest to wymagane.

ADO.NET wprowadza dwa tryby łączenia się z danymi: połączeniowy i bezpołączeniowy. Omówimy najpierw tryb połączeniowy.

Tworzenie połączenia z bazą danych:
SqlConnection sqlConnection = new SqlConnection(@"Data Source=(local);
                Initial Catalog = nazwa_bazy_danych; Integrated Security = SSIP");
Data Source – identyfikator serwera; lokalna maszyna, adres ip, domena itd.


Uwaga: Jeżeli korzystamy z Visual Studio w bardzo łatwy sposób możemy wydobyć ConnectionString.
W tym celu należy:
1.       Utworzyć nowe połączenie z bazą danych na zakładce Server Explorer
2.       Wybrać żądaną bazę danych
3.       Kliknąć na Propeteries a następnie skopiować właściwość ConnectionString


Typowy cykl życia połączenia:
1.       Utworzenie obiektu SqlCommand
2.       Otwarcie połączenia
3.        Przekazanie połączenia do innych obiektów biblioteki ADO.NET
4.       Wykonanie operacji za pomocą obiektów ADO.NET w bazie danych
5.       Zamknięcie połączenia

Przykład:
   14 SqlConnection sqlConnection = new SqlConnection(@"Data Source=ACER5738\sqlexpress;Initial Catalog=Szkola;Integrated Security=True");
   15             SqlDataReader dataReader = null;
   16             try
   17             {
   18                 sqlConnection.Open();
   19                 SqlCommand command = new SqlCommand("SELECT * FROM Nauczyciel", sqlConnection);
   20                 dataReader = command.ExecuteReader();
   21                 while (dataReader.Read())
   22                 {
   23                     Console.WriteLine(string.Format("{0} {1} {2}", dataReader[0], dataReader[1], dataReader[2]));
   24                 }
   25             }
   26             finally
   27             {
   28                 if (dataReader!=null)
   29                 {
   30                     dataReader.Close();
   31                 }
   32                 if (sqlConnection != null)
   33                 {
   34                     sqlConnection.Close();
   35                 }
   36             }

 Wstawianie, usuwanie i modyfikacja danych za pomocą SqlCommand
Pobieranie danych już widzieliśmy, teraz czas na wstawianie:

1.       Tworzymy komendę wstawiania np.:
string sqlInsert = @"INSERT INTO Nauczyciel VALUES('85632798654','Jan','Machurski')";
2.       Tworzymy obiekt SqlCommand:
SqlCommand comand = new SqlCommand(sqlInsert, sqlConnection);
3.       Wywołujemy metodę ExecuteNonQuery();
comand.ExecuteNonQuery();


Usuwanie i modyfikacja dokładnie tak jak poprzednio z tym, że oczywiście zmieniamy komendę.

Jak wcześniej było wspomniane jest to tryb połączeniowy z bazą danych. Dlaczego połączeniowy? Ponieważ aby dane otrzymać należy jawnie wykonać komendę Open() na podanym źródle danych.

Teraz omówię pokrótce bezpołączeniowy model. Model ten nie wymaga otwartego połączenia do źródła danych. Oczywiście ConnectionString nadal jest wymagany, jednak co do czasu otwarcia/zamknięcia połączenia jest to decydowane przez obiekt DataAdapter.


DataSet – pozwala na przechowywanie w pamięci danych w postaci tabel.
Korzystając z obiektu DataAdapter w łatwy sposób można pobrać dane z bazy danych. Wykonywane są wtedy następujące czynności:
1.       Otwarcie połączenia
2.       Wypełnienie danymi obiektu DataSet
3.       Zamknięcie połączenia

Podczas uaktualniania mamy do czynienia z:
1.       Otwarcie, połączenia
2.       Zapisaniem zmian z DataSeta do źródła
3.       Zamknięciem połączenia

Przykład:
            SqlConnection sqlConnection = new SqlConnection(@"Data Source=ACER5738\sqlexpress;Initial Catalog=Szkola;Integrated Security=True");
            DataSet dataSet = new DataSet();
            SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT * FROM Nauczyciel", sqlConnection);
            dataAdapter.Fill(dataSet, "Tabela");
            foreach (DataRow item in dataSet.Tables["Tabela"].Rows)
            {
                Console.WriteLine(item[0] + " " + item[1] + " " + item[2]);
            }

Komendy odpowiedzialne za uaktualnianie/usuwanie czy też dodawanie danych można dodać do obiektu DataAdapter na dwa sposoby:
- poprzez właściwości
- poprzez obiekt SqlCommandBuilder

Sposób drugi jest bardzo prosty i nie wymaga zbytniej wiedzy nawet na temat SQL-owych komend UPDATE/DELETE. Wystarczy utworzyć obiekt SqlCommandBuilder i w jego konstruktorze przekazać referencję do obiektu SqlDataAdapter. Jak jednak można się domyślić jest tu mały haczyk. SqlCommandBuilder nie działa podczas łączenia wielu tabel oraz przy pracy z procedurami. Także wydajność zapytań SQL-owcych może budzić wątpliwości. Jednak podczas pracy z pojedynczymi tabelami jest jak najbardziej wskazany.

Aby zapisać dane (np. po modyfikacji) z DataSetu z powrotem do źródła należy użyć komendy Update() DataAdaptera:
dataAdapter.Update(dataSet, "nazwa_uaktualnianej_tabeli");

Dodawanie parametrów do zapytań SQL
Parametry, które dodajemy do zapytania SQL (np. tworząc warunek wyszukiwania imienia które poda użytkownik). Aby stworzyć poprawne zapytanie SQL:
1.       Tworzymy łańcuch SqlCommand z parametrami
2.       Deklarujemy obiekt SqlParametr z odpowiednimi wartościami
3.       Przypisujemy SqlParametr do SqlCommand poprzez właściwość Parameters
Pzykład:
            SqlConnection sqlConnection = new SqlConnection(@"Data Source=ACER5738\sqlexpress;Initial Catalog=Szkola;Integrated Security=True");
            SqlCommand command = new SqlCommand("SELECT * FROM Nauczyciel WHERE imie = @imie", sqlConnection);
            SqlParameter parametr = new SqlParameter("@imie", "Jan");
            command.Parameters.Add(parametr);
            sqlConnection.Open();
            SqlDataReader dataReader = command.ExecuteReader();
            while (dataReader.Read())
            {
                Console.WriteLine(dataReader[0] + " " + dataReader[1] + " " + dataReader[2]);
            }
            sqlConnection.Close();


Używanie procedur i funkcji zapisanych w bazie danych
Aby było możliwe używanie procedur/funkcji zapisanych w bazie danych, należy kolejno:
1.       W obiekcie SqlCommand przekazać nazwę funkcji/procedury do wywołania
2.       SqlCommand musi wiedzieć, że wywołuje procedurę (domyślnie ustawione jest wywołanie zapytania SQL)
Przykład:
            SqlConnection sqlConnection = new SqlConnection(@"Data Source=ACER5738\sqlexpress;Initial Catalog=Szkola;Integrated Security=True");
            SqlCommand command = new SqlCommand("SprawdzPesele", sqlConnection);
            command.CommandType = CommandType.StoredProcedure;

Na koniec jeszcze pokaże jak bindować SqlDataReader z DataGridView:
            SqlCommand command = new SqlCommand("SELECT * FROM Nauczyciel", connection);
            SqlDataReader dataReader = command.ExecuteReader();
            BindingSource bindingSource = new BindingSource();
            bindingSource.DataSource = dataReader;
            dataGridView1.DataSource = bindingSource;


Na razie tyle odnośnie używania ADO.NET. Po tym krótkim wprowadzeniu, proste czynności związane z obsługą źródeł danych nie powinny stanowić problemu. Powodzenia.

Brak komentarzy:

Prześlij komentarz