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:
- System.Data.EntityClient.EntityConnectionStringBuilder
 - System.Data.Odbc.OdbcConnectionStringBuilder
 - System.Data.OleDb.OleDbConnectionStringBuilder
 - System.Data.OracleClient.OracleConnectionStringBuilder
 - System.Data.SqlClient.SqlConnectionStringBuilder
 
- wytworzyć obiekt tej klasy (np. z wykorzystaniem bezparametrowego konstruktora),
 - ustawić właściwość: DataSource na nazwę instancji serwera bazy danych Ms SQL,
 - ustawić właściwość: ApplicationName na nazwę bazy danych w ramach wybranej wcześniej instancji serwera.
 
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.
 

  





Brak komentarzy:
Prześlij komentarz