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;
  1. 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();
  1. 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/index.php?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

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ę :)

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;

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 :)