Bazy danych w środowisku .NET
Spis treści
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";
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
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();
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
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;
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
f. Przykładowy odczyt danych
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);
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);
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");
DataSet data = new DataSet();
AdapterTabela.Fill(data, "tabela");
e. Przykładowy odczyt danych
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);
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);
MySqlDataAdapter myDataAdapter = new MySqlDataAdapter(myQuery, myConnection);
c. Użycie DataAdapter do odczytania wyniku zapytania i wypełnienia DataSet
d. Przykładowy odczyt danych
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);
OracleDataAdapter adapter = new OracleDataAdapter(query, connString);
c. Użycie DataAdapter do odczytania wyniku zapytania i wypełnienia DataSet
d. Przykładowy odczyt danych
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.



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
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 i pozdrawiam.
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
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.