ODBC

ADO.NET potrafi się połączyć prawie z każdą bazą danych. Obecnie na laptopie zainstalowałem następujące systemy bazy danych: Oracle, PostgreSQL, MySQL. Postanowiłem każdą z nich przetestować do celów edukacyjnych.

Niestety ,ale DB2* ma problem ze sterownikami w Windows 8 i nie udało mi się go połączyć z ADO.NET-em. Co też nie znaczy ,że nie działa w ogóle po prostu tym razem ja mam pecha.

Jak tytuł tego wpisu wskazuje opiszę teraz jak w prosty sposób możemy w ADO.NET połączyć się się z bazą danych PostgreSQL.

PostgreSQL nie oferuje bibliotek do połączenie się z ADO.NET z tego co mi wiadomo. Możemy się z nim połączyć tylko używając ODBC.

Npsql

Zanim przejdziemy do tworzenia połaczenia najpierw musimy się upewnić czy mamy zainstalowany sterownik npsql.

PostgreSQL bardzo ułatwia tą sprawę gdyż oferuje on program “StackBulider”. W nim możemy w łatwy sposób do instalować dodatkowe oprogramowanie jak i sterowniki.

Aby mieć już zainstalowany ten sterownik e programie w zakładce “Database Drivers” wystarczy zaznaczyć opcje “Npgsql” i kliknąć “Next” .

image

Connection String

Teraz gdy mamy już sterownik npsql do szczęście potrzebujemy napisu który określi specyficzne połączenie do bazy PostgreSQL

W zakładce “Server Explorer” zaznacz prawym przyciskiem myszki ikonę “Data Connections” i z menu wybierz “Add Connection…”.

image

W zakładce “Add Connection” kliknij na przycisk “Change” ponieważ domyślnie Visual Studio zakłada ,ze chcesz dodać połączenie do bazy danych SQL Server.

Jak widać w zakładce “Change data Source” istnieją gotowe połączenia do baz danych jak SQL Server, MySQL i Oracle. Do PostgreSQL-a nie mamy taki gotowych klas i bibliotek więc musimy skorzystać z uniwersalnego rozwiązania , które nazywa się ODBC.

image

Komplikuje to trochę sprawę ponieważ musimy jeszcze wykonać parę kroków ,aby uzyskać połączenie.

Co to jest ODBC?

Alternate Text Angielski skrót od “Open DataBase Connectivity” które tłumaczy się na polski jako “otwarte łącze baz danych”. Jest to Interfejs pozwalający łączyć się z systemami baz danych. Te API jest niezależne od języka programowania i systemu operacyjnego.

Jest to standard opracowany przez SQL Acces Group w 1992 roku. Każda baza danych powinna posiadać swój sterownik do ODBC czyniąc te rozwiązanie niezależne od danego wyboru systemu baz danych.

ODBC jest używany głównie w platformie .NET. W Javie podobne rozwiązanie nazywać się “JDBC” (Java DataBase Connectivity”.

W zakładce “Add Connection” kliknij na przycisk “Build”. A z okna “Wybierz źródło danych” wybierz zakładkę “Komputerowe źródło danych”.

PostgreSQL_con_01

Teraz kliknij na przycisk “Nowe”.

PostgreSQL_con_02

Z tej zakładki wybierz “Systemowe źródło danych(dotyczy tylko tego komputer)”.

PostgreSQL_con_03

Jeśli zainstalowałeś sterownik npsql na liście źródeł danych powinieneś odnaleźć opcję PostreSQL ODBC. Wybieramy opcję z Unicode.

PostgreSQL_con_04

Teraz musisz określić dane do połączenia ze swoją baz danych PostgreSQL. Ja mam tą bazę mam zainstalowaną lokalnie dlatego serwer nosi nazwę localhost. Port 5432 jest portem domyślnym dla tej bazy więc jeśli niczego nie zmieniałeś ten port jest prawidłowy. Użytkownik domyślny jak domyślna baza danych nazywają się szokującą “postgres”.

Hasło do domyślnego użytkownika podałeś w trakcie instalacji. Oczywiście jeśli nie masz zainstalowanej taj bazy lokalnie dane ukazane poniżej będą zupełnie inne.

PostgreSQL_con_05

Jak widać połączenie zostało wygenerowane. Jest on strasznie długie ,ale nie wszystkie informacje zawarte w nim są potrzebne.

PostgreSQL_con_06

Teraz zapewne się zastanawiasz po co zrobiliśmy tyle kroków ,aby otrzymać tylko jakiś napis? Otóż nie ponieważ także zadeklarowaliśmy “źródło danych” ODBC. U mnie ono nazywa się “PosgreSQL35W”. Bez niego połączenie z PostgreSQL byłoby niemożliwe.

Wszystkie te kroki były jednak konieczne.

Moje skrócone połączenie wygląda następująco. W PostgreSQL utworzyłem sobie baz danych “test” więc jeśli chcesz przetestować ten kod zmień tylko nazwę baz danych na domyślną “postgres” bądź na swoją.

Dsn=PostgreSQL35W;"+ "database=test;server=localhost;"+ "port=5432;uid=postgres;"

Dsn określa nazwę wskazującą do sterownika ODBC. Uid określa identyfikator użytkownika do którego się logujemy.

Użycie połączenia

Czy połączenie dobrze działa? Dlaczego nie udowodnimy tego piszą prosty program.

Każda baza PostgreSQL zawiera w sobie tabelkę “pg_database” która przechowuje wszelkie informacje o istniejących już baz danych w samym systemie.

Poniższy kod wyświetli z konsoli wszystkie dostępne bazy dane w systemie PostgreSQL. Korzystamy z klas z przestrzeni System.Data.ODBC.

using System;
using System.Data;
using System.Data.Odbc;

namespace ConsoleApplication9
{
    class Program
    {
        static void Main(string[] args)
        {
            OdbcConnection connection = new OdbcConnection("Dsn=PostgreSQL35W;" +
                                                           "database=test;server=localhost;" +
                                                           "port=5432;uid=postgres;");
            try
            {
                connection.Open();
                System.Console.WriteLine("Stan: " + connection.State.ToString());

                string query = " SELECT datname FROM pg_database";
                OdbcCommand command = new OdbcCommand(query, connection);


                OdbcDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);

                while (reader.Read() == true)
                {
                    Console.WriteLine("\nBaza Danych:");
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        Console.WriteLine("\t" + reader.GetString(i));
                    }
                }

                reader.Close();
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                connection.Close();
            }
        }
    }
}

Kod wyświetlił wszystkie domyślne baz dane jak i moją bazę danych “test”.

image

Dla ADO.NET i C# nie ma żadnych przeszkód. DOTNET łatwo może się dogadać z każdym popularnym systemem SQL.

Miłego programowania.