Bazy danych w środowisku .NET

Marooned

1 Wprowadzenie
2 Baza Microsoft SQL Server
3 Baza Firebird (dawniej InterBase)
4 Baza Microsoft Access
5 Baza MySQL
6 Baza Oracle
7 Podsumowanie

Wprowadzenie

Środowisko .NET zawiera w sobie zestaw gotowych klas umożliwiających łączenie się i obsługę różnych baz danych. Poszczególne przestrzenie nazw dzielą i systematyzują klasy do obsługi tychże baz:
• Przestrzeń nazw System.Data.SqlClient - provider dla MS SQL Server
• Przestrzeń nazw System.Data.Odbc - provider dla ODBC
• Przestrzeń nazw System.Data.OleDb - provider dla OLE DB
• Przestrzeń nazw System.Data.OracleClient - provider dla Oracle

Dodatkowo do obsługi innych baz można doinstalować niezależne providery, które udostępnią programiście swoje przestrzenie nazw i zezwolą na obsługę danej bazy.
Oczywiście można z bazą łączyć się za pomocą ODBC, lecz specyficzne dla danej bazy providery zazwyczaj udostępniają dodatkowe narzędzia albo typy danych występujące tylko w danej bazie i pracuje się z nimi wygodniej.

Poniżej znajduje się spis kilku popularnych systemów bazodanowych oraz krótkie wprowadzenie do ich użycia w środowisku .NET (w przykładach zastosowany został język C#).

Baza Microsoft SQL Server

Obsługa bazy danych MS SQL Server jest dostępna w środowisku .NET bez potrzeby instalowania dodatkowych providerów. Obiekty i metody do jej obsługi znajdują się w przestrzeni nazw System.Data.SqlClient.

  1. Kroki wspólne dla wszystkich typów zapytań
    a. Stworzenie obiektu SqlConnection i jego inicjalizacja odpowiednim łańcuchem
    System.Data.SqlClient.SqlConnection MSDEconn;
    MSDEconn = new SqlConnection();
    MSDEconn.ConnectionString = @"workstation id=KOMPUTER; packet size=4096; integrated security=SSPI; data source=KOMPUTER\NASZA_BAZA; persist security info=False; initial catalog=baza_testowa";

    b. Otworzenie połączenia

    MSDEconn.Open();

    c. Utworzenie obiektu zapytania

    System.Data.SqlClient.SqlCommand MSDEcommand = new SqlCommand();

    d. Przypisanie obiektu połączenia do obiektu zapytania

    MSDEcommand.Connection = MSDEconn;
  2. Wykonanie zapytania typu select
    a. Ustawienie właściwego zapytania
    MSDEcommand.CommandText = "SELECT wartosc FROM tabela WHERE id = 10";

    b. Odczytanie wyniku – ten krok można wykonać na kilka różnych sposobów. Przedstawię tylko jeden, z DataReader’em.

    string wartosc  = null;
    SqlDataReader reader = MSDEcommand.ExecuteReader();
    if (reader.Read())
    wartosc = reader.GetInt32(0).ToString();
    reader.Close();

    c. Zamknięcie połączenia

    MSDEconn.Close();
  3. Wykonanie zapytania typu insert/update/delete/inne
    a. Ustawienie właściwego zapytania
    MSDEcommand.CommandText = "INSERT INTO [tabela] ([id], [wartosc]) VALUES (NULL, 1234)";

    b. Wykonanie zapytania do bazy

    MSDEcommand.ExecuteNonQuery();

    c. Zamknięcie połączenia

    MSDEconn.Close();

Dwie różne procedury dla zapytań typu SELECT oraz pozostałych jest powszechnym sposobem na zwiększenie bezpieczeństwa. Najczęściej bowiem pobieramy tylko dane (select) i nawet gdyby użytkownik znalazł dziurę w zabezpieczeniach i potrafił przekazać do programu swoje zapytanie, to nie narobi on szkód, gdyż kod wykonujący zapytania typu select nie będzie w stanie wykonać zapytań manipulujących danymi.

Baza Firebird (dawniej InterBase)

Baza powstała na podwalinach bazy Borland InterBase po uwolnieniu kodu. Do jej obsługi wykorzystać można provider dostępny na tej stronie: http://www.firebirdsql.org/in[...]?op=devel&sub=netprovider
Po dodaniu providera do projektu mamy do dyspozycji przestrzeń nazw FirebirdSql. Wykorzystamy z niej FirebirdSql.Data.Firebird

  1. Wykonanie zapytania typu select
    a. Stworzenie obiektu connection i jego inicjalizacja odpowiednim łańcuchem
    FbConnection connection = new FbConnection(@"User Id=SYSDBA;Database=C:\PLIK_BAZY.GDB;Charset=WIN1250;Data Source=localhost;Password=HASLO");

    b. Otworzenie połączenia oraz utworzenie obiektu DataTable

    DataTable dt = null;
    connection.Open();

    c. Utworzenie obiektu zapytania oraz transakcji i powiązanie tych obiektów

    FbCommand command = new FbCommand();
    FbTransaction transaction = connection.BeginTransaction();
    command.Connection = connection;
    command.Transaction = transaction;

    d. Ustawienie właściwego zapytania

    command.CommandText = "SELECT wartosc FROM tabela WHERE id = 10";

    e. Użycie DataAdapter do odczytania wyniku zapytania

    FbDataAdapter adapter = new FbDataAdapter(command);
    dt = new DataTable();
    adapter.Fill(dt);

    f. Przykładowy odczyt danych

    string wartosc = dt.Rows[0][0].ToString();

    g. Zamknięcie połączenia

    connection.Close();

Baza Microsoft Access

Do połączenia programu z bazą Microsoft Access wykorzystuje się przestrzeń nazw System.Data.OleDb oraz provider Microsoft Jet będących składnikami ADO.NET.
Pliki baz danych w formacie Access mają rozszerzenie .mdb

  1. Wykonanie zapytania typu select
    a. Stworzenie obiektu connection i jego inicjalizacja odpowiednim łańcuchem
    string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\PLIK_BAZY.MDB";
    OleDbConnection connection = new OleDbConnection(connString);

    b. Otworzenie połączenia

    connection.Open();

    c. Utworzenie obiektu zapytania oraz ustawienie właściwego zapytania

    string query = "SELECT wartosc FROM tabela WHERE id = 10";
    OleDbCommand command = new OleDbCommand(query, connection);

    d. Użycie DataAdapter do odczytania wyniku zapytania i wypełnienia DataSet

    OleDbDataAdapter AdapterTabela = new OleDbDataAdapter(command);
    DataSet data = new DataSet();
    AdapterTabela.Fill(data, "tabela");

    e. Przykładowy odczyt danych

    string wartosc = data.Tables["tabela"].Rows[0]["wartosc"].ToString();

    f. Zamknięcie połączenia

    connection.Close();

Baza MySQL

Do popularnej bazy MySQL można podłączyć się za pomocą 3 sposobów:
• ODBC.NET – sterownik MyODBC
• Providery własne MySQL .NET
• OLEDB.NET – provider MyOLDDB
Mimo, iż sposób pierwszy i trzeci nie wymagają żadnych dodatkowych elementów, to jednak ustępują providerom pisanym typowo dla MySQL zarówno w prędkości działania jak i w ilości oferowanych specyficznych dla danej bazy elementów (własne typy danych, obsługę procedur wbudowanych, etc.). Dlatego też w poniższym przykładzie opiszę wykorzystanie zewnętrznego providera. W Internecie (również na oficjalnej stronie MySQL) można natknąć się na 2 najpopularniejsze – są to:
• ByteFX.Data → http://www.bytefx.com/blog/
• CoreLabs → http://crlab.com/mysqlnet/
Pierwszy z nich jest projektem open source, drugi jest darmowy do 30 dni. Skorzystam z produktu ByteFX.Data. Aby dodać oferowane przez niego klasy należy dodać przestrzeń nazw MySql.Data.MySqlClient.

  1. Wykonanie zapytania typu select
    a. Stworzenie obiektu connection i jego inicjalizacja odpowiednim łańcuchem
    string myConnectionString = "Database=BAZA_DANYCH;Data Source=localhost;User Id=USER;Password=PASS";
    MySqlConnection myConnection = new MySqlConnection(myConnectionString);

    b. Utworzenie obiektu DataAdapter oraz ustawienie właściwego zapytania

    string myQuery = "SELECT wartosc FROM tabela WHERE id = 10";
    MySqlDataAdapter myDataAdapter = new MySqlDataAdapter(myQuery, myConnection);

    c. Użycie DataAdapter do odczytania wyniku zapytania i wypełnienia DataSet

    DataSet myDataSet = new DataSet();
    myDataAdapter.Fill(myDataSet, "tabela");

    d. Przykładowy odczyt danych

    string wartosc = myDataSet.Tables["tabela "].Rows[0]["wartosc"].ToString();

Baza Oracle

Jak wyszczególniono we wprowadzeniu, środowisko .NET posiada wbudowane narzędzia do komunikacji z bazą Oracle, jednak w w poniższym przykładzie posłużę się zewnętrznym providerem dostarczanym przez firmę Oracle. Ma on swoje specyficzne typy danych dostępne tylko w bazach Oracle, jak również ułatwia korzystanie z wbudowanych procedur w samej bazie.
Prowider nazywa się „ODP.NET Oracle managed provider” i jest do pobrania na stronie producenta → http://www.oracle.com/technology/pub/articles/cook_dotnet.html
Po dodaniu go do projektu mamy dostęp do przestrzeni nazw Oracle.DataAccess.Client.

  1. Wykonanie zapytania typu select
    a. Stworzenie odpowiedniego łańcucha połączenia
    string connString = "Data Source=BAZA_DANYCH;User Id=USER;Password=PASS;";

    b. Utworzenie obiektu DataAdapter oraz ustawienie właściwego zapytania

    string query = "SELECT wartosc FROM tabela WHERE id = 10";
    OracleDataAdapter adapter = new OracleDataAdapter(query, connString);

    c. Użycie DataAdapter do odczytania wyniku zapytania i wypełnienia DataSet

    DataSet dataset = new DataSet();
    adapter.Fill(dataset, "tabela");

    d. Przykładowy odczyt danych

    string wartosc = dataset.Tables["tabela"].Rows[0]["wartosc"].ToString();

Podsumowanie

Jak widać na powyższych przykładach, dostęp do różnych baz danych opera się na podobnych schematach. Można oczywiście wykorzystać ODBC.NET do łączenia się ze wszystkimi bazami w identyczny sposób (różnica będzie tylko w łańcucu inicjującym połączenie). Rozwiązanie to sprawia, że nawet w przypadku zmiany systemu bazodanowego w projekcie, sam kod wymaga minimalnych zmian do ponownego funkcjonowania. Jednak użycie dedykowanych providerów do poszczególnych baz danych ma kilka znaczących przewag:
• znacznie większa prędkość działania (łączenie, pobieranie i wysyłanie danych, etc.);
• dostęp do specyficznych elementów danej bazy (własne typy danych, dodatkowe funkcje);
• zalety związane z wirtualną maszyną (garbage collection, bezpieczeństwo);


Artykuł powstał na potrzeby zajęć na Politechnice Koszalińskiej [autor Marooned], jednak bez problemu da się go o wiele bardziej rozbudować, do czego zachęcam.

11 komentarzy

Witam,
do połączeń z bazą MySql można też użyć MySql Connector Net - do pobrania z: http://dev.mysql.com/downloads/connector/net/5.1.html

dalej równie łatwo:

//przykład otwiera połączenie z bazą, wczytuje tabelę i wypełnia dataGridView

DataSet myDataSet1 = new DataSet();
MySqlConnection myConnection = new MySqlConnection();
MySqlDataAdapter adapter = new MySqlDataAdapter();
DataTable dane = new DataTable();

myConnection.ConnectionString = "Persist Security Info=False;database=naszaBaza;server=adresNaszegoSerwera;Connect Timeout=30;user id=naszUser; pwd=naszeHaslo";
myConnection.Open();

string mySelectQuery = "SELECT IMIE, NAZWISKO FROM DANE";
adapter.SelectCommand = new MySqlCommand(mySelectQuery, myConnection);
adapter.Fill(myDataSet1, "DANE");
GridView1.DataSource = myDataSet1;
GridView1.DataBind();
myConnection.Close();

oczywiście należy pamiętać o dodaniu
using MySql.Data.MySqlClient;

coorter: A nadałeś uprawnienia dla użytkownika na adresie, z którego się łączysz? Może głupia odpowiedź, ale standardowo mysql zezwala na połączenia tylko z localhost.

Panowie, takie pytanko:
napisałem sobie programik który coś tam robi, ale potrzebuje do tego danych z bazki. Wersja ostateczna ma łączyć się z zewnętrznym serwerem, ale tym będę martwił się później. Zainstalowałem sobie na swoim kompie MySql i wrzuciłem tam dumpa owej bazy. Aplikacja uruchamiana na moim komputerze z connStringiem takim:
string myConnectionString = "Database=BAZA_DANYCH;Data Source=127.0.0.1;User Id=USER;Password=PASS"
łączy się aż miło, jednak jak tylko zainstalowałem programik na innym kompie w domu i jako Data Source podaję 192.168.1.114 połączyć się nie mogę...:(
Ktoś wie jak temu zaradzić?
Używam MySql.Data

mikwoj - niepotrzebnie wykonujesz myConnection.Open();

To sugeruję dodać to do artykułu jako alternatywę :)

Dzięki za odpisanie. Udało mi się otworzyć bazę *.gdb w Visual Studio. Wystarczyło tylko zainstalować FireBird-a na kompie i providera. Przetłumaczyłem właśnie kod z C# na VB i zadziałało.
Dzięki i pozdrawiam.

1) korzystać [użyj edycji i popraw]
2) proponuję takie pytanie zadać na forum
3) nie używam Visual Basic - nie lubię się ograniczać
4) skoro masz połączenie dla innych baz w VB, to porównaj je z powyższym kodem w C# i na podstawie logicznego wnioskowania spróbuj wykonać analogiczne połączenie do FireBird - jak nie wyjdzie -> atakuj forum [ale dopiero wtedy]
Pozdro

Witam serdecznie.
Mam pałe pytanko. Wykozystując przestrzeń nazw "FirebirdSql.Data.Firebird" , w jaki sposób mogę się połączc z bazą Firebird wykozystując Visual Basic. Powyższy post jest super i dobrze wyjaśnia w C#, ale chciałbym prosic o pomoc z wykorzystaniem Visual Basic-a. Mam bazę *.gdb i nie mam zielonego pojęcia jak do niej się dostac przez VB. Gdy łączę się z bazą SQL-ową czy Accessową wykozystuję odpowiednio SQLDataAdapter, OLEDBDataAdapter, SQLConnection, OLEDBConnection i DataSeta. Prosiłbym o przykładowy kod z wykożystaniem VB. Pozdrawiam wszystkim początkujących i zaawansowanych programistów.

hm, widzisz.. opisałem wszystkie, które w C# używałem - PostgreSQL używałem do tej pory tylko z PHP - ale trafna uwaga, zapomniałem o tej bazie :)

Jeszcze o PostgreSQL by się coś przydało :)