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 :)
Bardzo fajny artykuł ;) Można by jeszcze coś dopisać na temat szyfrowania connection stringa za pomocą SectionInformation.ProtectSection ;)
OdpowiedzUsuń