Datenbankpfad einsetzen in Connection String in WinForms und ASP.NET Anwendungen

Bei der Datenbankprogrammierung ist ja immer wieder eine Frage, ob denn der Connectionstring gespeichert werden sollte. Die Optionen reichen von einer Integration in den Code über .NET Enterprise Services Constructor Strings bis zu verschlüsselten Dateien.

Meine Lieblingsoption vor allem während des Prototypings ist allerdings eine UDL-Datei. Man kann sie leicht erzeugen (Datei mit Extension .udl erzeugen und doppelklicken; dann erscheint ein Wizard, um den Connection String zusammenzustellen) und man kann sie leicht an eine Connection übergeben:

New OleDbConnection("file name=myconnection.udl")

So muss ich nicht die ganzen Einstellungen für die unterschiedlichen OLEDB Provider im Kopf haben. Sehr bequem!

Wenn die UDL-Datei dann bei WinForms-Anwendungen im Anwendungsverzeichnis liegt, ist die Welt auch in Ordnung.
Liegt sie dort nicht, muss man einen Pfad voranstellen, z.B. c:\database\myconnection.udl.

Besonders lästig ist es nun, wenn man Connections mit dem selben Code in WinForms und ASP.NET Anwendungen erzeugen will. Bei WinForms ist kein Pfad nötig, bei ASP.NET aber doch. Denn dort ist das Anwendungsverzeichnis das System32-Verzeichnis - und dort will man keine UDL-Dateien ablegen.

Das Problem lässt sich aber durchaus einfach lösen. Zunächst sollte die Erzeugung einer Datenbankverbindung ja ohnehin immer in eine zentrale Methode verpackt werden, z.B. CreateConnection(). In ihr kann dann automatisch ermittelt werden, ob der Code in einer ASP.NET Anwendung läuft:

Imports System.Web

Public Function CreateConnection() As OleDbConnection
    Dim path As String
    Dim ctx As HttpContext = HttpContext.Current
    If Not ctx Is Nothing Then path = ctx.Server.MapPath(".") & "\"
    Return New OleDbConnection(String.Format("file name={0}myconnection.udl", path))
End Function

Wenn ein HttpContext-Objekt existiert, dann wird die Methode in einer ASP.NET Anwendung aufgerufen. Und dann lässt sich das Anwendungsverzeichnis über Server.MapPath(".") ermitteln. Die Connectionerzeugung ist damit unabhängig vom Host für den Code.

Dieses Vorgehen funktioniert natürlich auch, wenn ein Connectionstring an einem anderen Ort liegt und z.B. nur einen Datenbankpfad enthält. Im Connectionstring sollte dann nur auch ein Platzhalter wie "{0}" für den Pfad vorgesehen sein.

No Comments