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