2010-09-05 12 views
12

ich dieses Stück Code in einer Anwendung gefundenC# DbConnection gegossen SqlConnection

Database database = DatabaseFactory.CreateDatabase("connection string"); 
DbConnection connection = database.CreateConnection(); 
connection.Open(); 
SqlConnection sqlConnection = (SqlConnection)connection; 

Ist es sicher, SqlConnection derieve von DbConnection. Die Datenbank stammt von Microsoft.Practices.EnterpriseLibrary.Data. Laut Dokumentation gibt CreteDatabase DbConnection zurück.

Antwort

11

Nein, es ist nicht sicher, Gießen nie sicher ist, und es kann jederzeit blasen, während die Anwendung ausgeführt wird. Während SqlConnection tatsächlich von DbConnection abgeleitet ist, können Sie nicht garantieren, dass database.CreateConnection() eine SqlConnection zurückgibt, da dies in der Konfigurationsdatei parametrisiert werden könnte. Warum musst du auch nach SqlConnection casten? Es ist immer besser, mit Klassen zu arbeiten, die in der Hierarchie höher sind, um zu vermeiden, dass Ihr Code mit einer bestimmten Implementierung gekoppelt wird, die Ihren Code nicht isoliert testen lässt.

Während die EnterpriseLibrary einen anständig guten Job macht, die Dinge abstrakt zu halten, tötet man mit dieser Besetzung alles. Außerdem sollten Sie sicherstellen, dass verfügbare Ressourcen immer ordnungsgemäß entsorgt werden. Wie wäre es stattdessen:

Database database = DatabaseFactory.CreateDatabase("connection string"); 
using (var conn = database.CreateConnection()) 
using (var cmd = conn.CreateCommand()) 
{ 
    conn.Open(); 
    cmd.CommandText = "SELECT id FROM foo"; 
    using (var reader = cmd.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
      // TODO: work with the results here 
     } 
    } 
} 

Auf diese Weise ist Ihr Code weniger anfällig für Datenbankänderungen in der Konfigurationsdatei. Nun, natürlich haben Sie diese SQL-Codierung noch fest und es gibt ORMs, die sich um diese Situation kümmern werden. Sie ermöglichen es Ihnen auch, sich auf die reale Domäne Ihrer Anwendung zu konzentrieren, anstatt Zeit zu verschwenden, SQL-Abfragen zu schreiben und von einem Datenbankanbieter auf einen anderen zu übertragen. Aber für eine einfache Anwendung ist das in Ordnung.

+0

Es gibt eine in diesem Code verwendete Methode, die SqlConnection als Parameter – Darqer

7

Es sollte sicher sein, solange Sie die Verbindungszeichenfolge nie ändern, um eine Verbindung mit etwas anderem als einer SQL Server-Datenbank herzustellen. Wenn das jemals eine Möglichkeit ist, dann sollten Sie ein wenig mehr Logik hinzufügen, um die Dinge sicher zu machen:

Database database = DatabaseFactory.CreateDatabase("conn string"); 

using(DbConnection conn = database.CreateConnection()) 
{  
    if(conn is SqlConnection) 
    { 
     var sqlConn = conn as SqlConnection; 
    } 
} 
+0

Kein großer Unterschied, mit 'wie' ohne 'ist' und dann nach Null zu suchen ist effizienter. –

4

Es hängt von den Datenbanken ab, die Sie in Ihrer Anwendung verwenden. Aus dem Code, den Sie geschrieben haben, sieht es so aus, dass nur SQL Server verwendet wird. Wenn dies der Fall ist, können Sie DbConnection sicher in SqlConnection umwandeln. Tatsächlich ist DbConnection eine Basisklasse für jede andere Datenbankverbindung. In Ihrem Fall ist es SqlConnection (die verwendet wird, um mit SQL Server Datenbank zu arbeiten), auch gibt es verschiedene Datenbanken wie Oracle, Mysql, etc und ihre Anbieter haben normalerweise eigene Klassen für Verbindungen. Wenn Ihre App also eine andere Datenbank verwendet oder in Zukunft verwendet werden kann, ist es unsicher, eine solche Besetzung zu haben.

+2

benötigt. Sie hängt nicht nur von der verwendeten Datenbank ab, sondern auch direkt vom Typ, den die Factory basierend auf der verwendeten Datenbank zurückgibt. Wenn sie sich jemals entschieden haben, eine neue Verbindungsklasse zu erstellen, die mit SQL Server arbeitet, könnte der Code fehlschlagen –