Programowanie w języku C# » Artykuły

Bazy danych w środowisku .NET



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/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

str8man 2010-02-14 10:36

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.

coorter 2009-10-13 00:14

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

Deti 2009-01-02 15:44

mikwoj - niepotrzebnie wykonujesz myConnection.Open();

Marooned 2008-04-07 14:03

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

mikwoj 2008-04-07 13:23

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;

LukVB 2007-03-05 07:48

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.

Marooned 2007-03-05 03:06

1) ko<font color="red">rz</font>ystać [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

LukVB 2007-03-04 12:15

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.

Marooned 2007-02-27 21:13

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

Coldpeer 2007-02-27 18:39

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