2010-09-05 16 views
12

me encontré con este pedazo de código en una aplicaciónC# DbConnection echó a SqlConnection

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

¿Es seguro, derieve SqlConnection de DbConnection. La base de datos proviene de Microsoft.Practices.EnterpriseLibrary.Data. De acuerdo con la documentación CreteDatabase devuelve DbConnection.

Respuesta

11

No, no es seguro, de fundición no es seguro y que puede estallar en cualquier momento mientras se ejecuta la aplicación. Mientras que SqlConnection deriva efectivamente de DbConnection, no se garantiza que database.CreateConnection() devolverá un SqlConnection ya que esto podría parametrizarse en el archivo de configuración. Además, ¿por qué necesitas lanzar al SqlConnection? Siempre es mejor trabajar con clases que son superiores en la jerarquía para evitar el acoplamiento de su código con una implementación específica que hará que su código sea imposible de probar de forma aislada.

Si bien EnterpriseLibrary hace un trabajo decente para mantener las cosas abstractas, lo estás matando todo con este elenco. También debe asegurarse de que los recursos desechables siempre se eliminen correctamente. ¿Qué tal esto en su lugar:

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 esta manera su código es menos frágil a los cambios de la base de datos en el archivo de configuración. Bueno, por supuesto, todavía tiene este SQL codificado y hay ORM que se encargarán de esta situación. También le permitirán enfocarse en el dominio real de su aplicación en lugar de perder tiempo escribiendo consultas SQL y lanzando de un proveedor de base de datos a otro. Pero para una aplicación simple, esto está bien.

+0

Hay un método utilizado en este código que necesita SqlConnection como un parámetro – Darqer

7

Debe ser seguro siempre que nunca cambie la cadena de conexión para conectarse a otra cosa que no sea una base de datos SQL Server. Si eso es siempre una posibilidad, entonces usted debe agregar un poco más lógica para que haya seguridad:

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

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

No es una gran diferencia, usar 'como' sin 'es' y luego buscar nulo es más eficiente. –

4

Depende de las bases de datos que esté utilizando en su aplicación. Del código que escribió parece que solo se usa SQL Server. Si es así, entonces puedes convertir DbConnection en SqlConnection de forma segura. De hecho, DbConnection es una clase base para cualquier otra conexión de base de datos. En su caso es SqlConnection (que se utiliza para trabajar con la base de datos SQL Server), también hay diferentes bases de datos como Oracle, Mysql, etc. y sus proveedores suelen tener clases propias para las conexiones. Por lo tanto, si su aplicación utiliza otra base de datos o puede usarla en el futuro, no es seguro tener dicha conversión.

+2

, que no solo depende de la base de datos utilizada, sino que más directamente depende del tipo que devuelve la fábrica en función de la base de datos en uso. Si alguna vez decidieron crear una nueva clase de conexión trabajando con el servidor SQL, el código podría fallar –

Cuestiones relacionadas