niedziela, 14 lutego 2010

O ConnectionString słów kilka…


Każdy z pewnością miał do czynienia z tworzeniem oprogramowania operującego na bazie danych(DB). Każdy też ma swój sposób na interakcję i łączenie się z DB. Należałoby się jednak zastanowić, czy stosowane techniki pozwalają w łatwy sposób na zmianę rodzaju bazy danych? Przeważnie podczas tworzenia nowego połączenia z bazą danych na stałe używamy jednego providera:
            string connectionString = @"Data Source=.\sqlexpress;Initial Catalog=AdventureWorksLT2008;Integrated Security=True";
            DbConnection conn = new SqlConnection(connectionString);
            DbCommand cmd = conn.CreateCommand();
            cmd.CommandText = "SELECT firstname FROM customers";
            conn.Open();
            //instrukcje
            conn.Close();

Sposób powyższy ma przynajmniej dwie wady:
1. "hard code" (spolszczyłbym to na: "stałe") zakodowanie providera;
2. Brak możliwości zmiany bazy danych (np. Oracle używa innego providera) bez zbędnych modyfikacji całego kodu;

Jak widać co jest oczywiste nie zawsze jest idealne. .NET Framework dostarcza nam (zarówno dla aplikacji ASP.NET jak i WinForms czy WPF) plik pozwalający na zapis naszych ConnectionString. 
Aby skorzystać z tego dobrodziejstwa dodajemy do naszego projektu plik Appliaction Configuration File:
Po dodaniu go do projektu powinien się od razu otworzyć z zawartością:


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
</configuration>
 
Pomiędzy znaczniki <configuration></configuration> możemy wprowadzić m.in. nasze ConnectionString:
 
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add/>
  </connectionStrings>
</configuration>
 
Za pomocą komendy <add/> dodajemy nowy ConnectionString. Znacznik ten składa się z 3 ważnych atrybutów: 
 
name  - przyjazna nazwa
connectionString - właściwy ConnectionString
providerName - nazwa providera
 
Przykład:
  

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="AdventureWorks" providerName="System.Data.SqlClient" connectionString="Data Source=.\sqlexpress;Initial Catalog=AdventureWorksLT2008;Integrated Security=True;"/>
  </connectionStrings>
</configuration>
 
Aby odwołać się w kodzie do podanego ConnectionString-a o nazwie AdventureWorks, wystarczy najpierw dodać referencję do biblioteki System.Configuration:
 
 Teraz w miejscu gdzie chcemy utworzyć połączenie:
 
            string connectionString = ConfigurationManager.ConnectionStrings["AdventureWorks"].ConnectionString;
            DbProviderFactory factory = DbProviderFactories.GetFactory(ConfigurationManager.ConnectionStrings["AdventureWorks"].ProviderName);
            DbConnection conn = factory.CreateConnection();
            conn.ConnectionString = connectionString;
            DbCommand cmd = conn.CreateCommand();
            cmd.CommandText = "SELECT firstname FROM customers";
            conn.Open();
            //instrukcje
            conn.Close();

Korzystamy tutaj z klasy DbProviderFactories, która tworzy odpowiedni provider na podstawie jego nazwy. Dzięki temu w jednym pliku możemy złożyć wszystkie ConnectionStrings. W razie potrzeby zmiana będzie wymagana jedynie w tym jednym pliku a nie w całym programie.

Jeżeli chodzi o aplikacje ASP.NET, sprawa jest jeszcze łatwiejsza. W pliku Web.config dodajemy wpis w miejscu przeznaczonym na ConnectionStrings i już możemy z niego korzystać tak samo jak w aplikacjach desktopowych :)

1 komentarz:

  1. Bardzo fajny artykuł ;) Można by jeszcze coś dopisać na temat szyfrowania connection stringa za pomocą SectionInformation.ProtectSection ;)

    OdpowiedzUsuń