czwartek, 10 lutego 2011

DbConnectionStringBuilder i ferajna [PL]

W komentarzu do poprzedniego posta („SMO: sprawdzanie dostępnych serwerów MS SQL i automatyczna konstrukcja ConnectionString”), Paweł Łukasik (Pawlos) zapytał, czy jest jakaś różnica pomiędzy ServerConnection a SqlConnectionStringBuilder jeśli chodzi o tworzenie connection stringa? Przyjrzyjmy się temu tematowi trochę bliżej.
W ramach .Net Framework dostępna jest klasa System.Data.Common.DbConnectionStringBuilder, która jest bazową klasą dla innych klas specjalistycznych (dla konkretnego typu bazy danych lub połączenia), które służą wytwarzaniu ConnectionString'ów:
Nas interesuje przede wszystkim ostatnia klasa (SqlConnectionStringBuilder) służąca do tworzenia ConnectionString'a, który jest wykorzystywany do połączenia z bazą danych typu Ms SQL. W najprostszym przypadku, aby wykorzystać klasę SqlConnectionStringBuilder, należy:
  1. wytworzyć obiekt tej klasy (np. z wykorzystaniem bezparametrowego konstruktora),
  2. ustawić właściwość: DataSource na nazwę instancji serwera bazy danych Ms SQL,
  3. ustawić właściwość: ApplicationName na nazwę bazy danych w ramach wybranej wcześniej instancji serwera.
Dla tak przygotowanego obiektu klasy SqlConnectionStringBuilder wywołujemy metodę ToString(), by otrzymać tworzony ConnectionString.
Przedstawiony w poprzednim wpisie kod źródłowy zmodyfikowałem, by wykorzystywał do tworzenia ConnectionString'ów zarówno SMO, jak i SqlConnectionStringBuilder:
       DataTable serversDataTable = SmoApplication.EnumAvailableSqlServers(false);
      foreach ( DataRow row in serversDataTable.Rows )
      {
        Console.WriteLine( "Server:" );
        foreach ( DataColumn dc in row.Table.Columns )
        {
          Console.WriteLine( "{0}={1}", dc.ColumnName, row[dc.ColumnName] );
        }
        Console.WriteLine( "Databases ConnectionStrings:" );
        ServerConnection serverConnection = new ServerConnection(); //main connection to MS SQLServer
        serverConnection.ServerInstance = (string)row[ "Name" ];
        serverConnection.ConnectAsUser = false;//we are using windows currently logged-in user
        ServerConnection serverConnection2 = new ServerConnection();//additional connection to each DataBase
        serverConnection2.ServerInstance = (string)row[ "Name" ];
        serverConnection2.ConnectAsUser = false;
        foreach ( Database db in new Server( serverConnection ).Databases )
        {
          SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder();
          scsb.DataSource = (string)row[ "Name" ];
          scsb.ApplicationName = db.Name;
          serverConnection2.DatabaseName = db.Name;
          Console.WriteLine( "ConnectionString (SMO )={0}", serverConnection2.ConnectionString );
          Console.WriteLine( "ConnectionString (SCSB)={0}", scsb.ToString() );
        }
        Console.WriteLine( "-----------------------------" );
Efekt działania powyższego kodu na moim komputerze wygląda następująco:
Server:
Name=MyComputer\SQLEXPRESS
Server=MyComputer
Instance=SQLEXPRESS
IsClustered=False
Version=9.00.4035.00
IsLocal=True
Databases ConnectionStrings:
ConnectionString (SMO )=server='MyComputer\SQLEXPRESS';Trusted_Connection=true;database='aspnetdb';multipleactiveresultsets=false
ConnectionString (SCSB)=Data Source=MyComputer\SQLEXPRESS;Application Name=aspnetdb
ConnectionString (SCSB)=Data Source=MyComputer\SQLEXPRESS;Application Name=master
ConnectionString (SMO )=server='MyComputer\SQLEXPRESS';Trusted_Connection=true;database='model';multipleactiveresultsets=false
ConnectionString (SCSB)=Data Source=MyComputer\SQLEXPRESS;Application Name=model
ConnectionString (SMO )=server='MyComputer\SQLEXPRESS';Trusted_Connection=true;database='msdb';multipleactiveresultsets=false
ConnectionString (SCSB)=Data Source=MyComputer\SQLEXPRESS;Application Name=msdb
ConnectionString (SMO )=server='MyComputer\SQLEXPRESS';Trusted_Connection=true;database='tempdb';multipleactiveresultsets=false
ConnectionString (SCSB)=Data Source=MyComputer\SQLEXPRESS;Application Name=tempdb
-----------------------------
Jakie więc widać różnice? Otóż stworzone tymi dwiema różnymi metodami ConnectionString'i są różne, ale równoważne. Każdy ConnectionString pozwala na nawiązanie właściwego połączenia, ale wyglądają one inaczej. Na stronie ConnectionStrings.com, składnia wytworzonego przy pomocy SMO i klasy ServerConnection ConnectionString'a jest określana mianem składni alternatywnej. Alternatywna składnia jest równoważna, gdyż po prostu różne słowa kluczowe w ConnectionString'u są ekwiwalentne.
Który sposób wytwarzania ConnectionString'a lepiej zastosować? Odpowiedź powinna brzmieć: „Zależy”, warto jednak uwzględnić następujące fakty:
  • SqlConnectionStringBuilder jest klasą wbudowaną w .NET Framework, podczas gdy klasy związane z SMO są dostarczane w osobnych bibliotekach – najczęściej w ramach bazy danych (poco korzystać z czegoś dodatkowego, skoro coś, co już jest wbudowane jest dobre).
  • Klasa DbConnectionStringBuilder jest klasą bazową dla wielu wytwórców (w tym SqlConnectionStringBuilder), jeżeli więc zależy nam na przygotowaniu aplikacji obsługującej inne niż MS SQL serwery bazodanowe, lepiej skorzystać z klas dziedziczących po DbConnectionStringBuilder.
  • Klasa ServerConnection, wchodząca w skład bibliotek związanych z SMO, jest przeznaczona przede wszystkim do tworzenia połączenia z bazą danych, a możliwość wytwarzania ConnectionString'a jest tu raczej dodatkiem.
A może jeszcze jakiś element pominąłem? Zapraszam do komentowania.
Promuj

Brak komentarzy:

Prześlij komentarz

Posty powiązane / Related posts