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.OleD
b - 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
.
- Kroki wspólne dla wszystkich typów zapytań
a. Stworzenie obiektuSqlConnection
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;
- 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();
- 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
- Wykonanie zapytania typu
select
a. Stworzenie obiektuconnection
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
- Wykonanie zapytania typu
select
a. Stworzenie obiektuconnection
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
.
- Wykonanie zapytania typu
select
a. Stworzenie obiektuconnection
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
.
- 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.
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.
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.
szacun
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 :)