C#DbConnection强制转换为SqlConnection

我在一个应用程序中找到了这段代码

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

是否安全,SqlConnection来自DbConnection。 数据库来自Microsoft.Practices.EnterpriseLibrary.Data。 根据文档,CreteDatabase返回DbConnection。

不,它不安全,铸造永远不会安全,它可能会在您的应用程序运行时随时爆炸。 虽然SqlConnection确实从DbConnection派生,但您无法保证database.CreateConnection()将返回SqlConnection因为这可以在配置文件中进行参数化。 另外你为什么需要SqlConnection转换为SqlConnection ? 使用层次结构中较高的类总是更好,以避免将代码与特定实现耦合,这将使您的代码无法单独进行测试。

虽然EnterpriseLibrary在保持抽象方面做得相当不错,但是你会用这个演员来杀死所有东西。 此外,您应确保始终正确处理一次性资源。 怎么样呢:

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

这样,您的代码对配置文件中的数据库更改就不那么脆弱了。 当然,你仍然有这个SQL硬编码,并有ORMs将处理这种情况。 它们还允许您专注于应用程序的真实域,而不是浪费时间编写SQL查询并从一个数据库提供程序转换到另一个数据库提供程序。 但对于一个简单的应用程序,这没关系。

只要您永远不会更改连接字符串以连接到SQL Server数据库以外的任何其他内容,它应该是安全的。 如果这是可能的话,那么你应该添加一点逻辑来保证安全:

 Database database = DatabaseFactory.CreateDatabase("conn string"); using(DbConnection conn = database.CreateConnection()) { if(conn is SqlConnection) { var sqlConn = conn as SqlConnection; } } 

这取决于您在应用程序中使用的数据库。 从您编写的代码看起来,只使用了SQL Server。 如果是这样,那么您可以安全地将DbConnectionSqlConnection 。 事实上, DbConnection是任何其他数据库连接的基类。 在您的情况下,它是SqlConnection (用于与SQL Server数据库一起使用),也有不同的数据库,如OracleMysql等,它们的提供程序通常有自己的连接类。 因此,如果您的应用程序使用其他数据库或将来可能会使用此类强制转换是不安全的。