2010-09-05 4 views
12

J'ai trouvé ce morceau de code dans une applicationC# DbConnection castée SqlConnection

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

Est-il sûr, SqlConnection derieve de DbConnection. La base de données provient de Microsoft.Practices.EnterpriseLibrary.Data. Selon la documentation CreteDatabase retourne DbConnection.

Répondre

11

Non, ce n'est pas sûr, la coulée est jamais à l'abri et il peut sauter à tout moment pendant que votre application est en cours d'exécution. Alors que SqlConnection dérive en effet de DbConnection vous n'êtes pas garanti que database.CreateConnection() renverra un SqlConnection car cela pourrait être paramétré dans le fichier de configuration. Aussi pourquoi avez-vous besoin de lancer à SqlConnection? Il est toujours préférable de travailler avec des classes plus élevées dans la hiérarchie pour éviter de coupler votre code avec une implémentation spécifique qui rendra votre code impossible à tester de manière isolée.

Alors que la EnterpriseLibrary fait un bon travail décent pour garder les choses abstraites, vous tuez tout avec cette distribution. Vous devez également vous assurer que les ressources jetables sont toujours correctement éliminées. Que diriez-vous à la place:

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 
     } 
    } 
} 

De cette façon, votre code est moins fragile aux changements de base de données dans le fichier de configuration. Bien sûr, vous avez toujours ce code en dur et il y a des ORM qui s'occuperont de cette situation. Ils vous permettront également de vous concentrer sur le domaine réel de votre application au lieu de perdre du temps à écrire des requêtes SQL et à passer d'un fournisseur de base de données à un autre. Mais pour une application simple, c'est OK.

+0

Il y a une méthode utilisée dans ce code qui nécessite SqlConnection comme paramètre – Darqer

7

Il devrait être sûr tant que vous ne changez jamais la chaîne de connexion pour se connecter à autre chose qu'une base de données SQL Server. Si c'est toujours une possibilité, alors vous devriez ajouter un peu plus logique pour rendre les choses en toute sécurité:

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

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

Pas une grosse différence, en utilisant 'as' sans 'is' et ensuite vérifier null est plus efficace. –

4

Cela dépend des bases de données que vous utilisez dans votre application. Du code que vous avez écrit il semble que seul SQL Server est utilisé. Si c'est le cas, vous pouvez lancer DbConnection en SqlConnection en toute sécurité. En fait, DbConnection est une classe de base pour toute autre connexion à une base de données. Dans votre cas, il est SqlConnection (qui est utilisé pour fonctionner avec SQL Server base de données), il existe également différentes bases de données comme Oracle, Mysql, etc et leurs fournisseurs ont généralement propres classes pour les connexions. Donc, si votre application utilise une autre base de données ou utilisera dans le futur, il est dangereux d'avoir une telle distribution.

+2

non seulement dépend de la base de données utilisée mais plus directement dépend du type que l'usine renvoie en fonction de la base de données utilisée. Si jamais ils décidaient de créer une nouvelle classe de connexion en travaillant avec le serveur SQL, le code pourrait échouer –

Questions connexes