C#DbConnection转换为SqlConnection

C#DbConnection转换为SqlConnection,c#,sqlconnection,C#,Sqlconnection,我在一个应用程序中发现了这段代码 Database database = DatabaseFactory.CreateDatabase("connection string"); DbConnection connection = database.CreateConnection(); connection.Open(); SqlConnection sqlConnection = (SqlConnection)connection; 安全吗,SqlConnection从DbConnecti

我在一个应用程序中发现了这段代码

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

安全吗,SqlConnection从DbConnection派生。数据库来自Microsoft.Practices.EnterpriseLibrary.Data。根据文档,CreteDatabase返回DbConnection

只要不更改连接字符串以连接到SQL Server数据库以外的任何对象,就应该是安全的。如果有可能的话,那么你应该增加一点逻辑来保证事情的安全:

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

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

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

虽然企业图书馆在保持事物抽象方面做得相当好,但你用这个演员阵容正在扼杀一切。此外,您还应确保始终正确处置可支配资源。这个怎么样

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硬编码,并且有一些ORM将处理这种情况。它们还允许您专注于应用程序的真实领域,而不是浪费时间编写SQL查询和从一个数据库提供者转换到另一个数据库提供者。但是对于一个简单的应用程序,这是可以的。

这取决于您在应用程序中使用的数据库。从您编写的代码来看,似乎只使用了SQL Server。如果是这样,那么您可以安全地将
DbConnection
强制转换为
SqlConnection
。实际上,
DbConnection
是任何其他数据库连接的基类。在您的例子中,它是
SqlConnection
(用于
sqlserver
数据库),也有不同的数据库,如
Oracle
Mysql
等,它们的提供者通常有自己的连接类。因此,如果您的应用程序使用其他数据库或将来可能使用,则进行此类转换是不安全的。

您可以随时进行检查,并使用C#pattern matching(C#7.0+)将其转换为
SqlConnection


它不仅取决于所使用的数据库,更直接地取决于工厂根据所使用的数据库返回的类型。如果他们决定创建一个使用SQL server的新连接类,那么代码可能会失败。此代码中使用的一种方法需要使用SqlConnection作为参数。没有太大区别,使用“as”而不使用“is”,然后检查null更有效。
Database database = DatabaseFactory.CreateDatabase("conn string");

using(DbConnection connection = database.CreateConnection())
{    
    if(connection is SqlConnection sqlConnection)
    {
        // do something with sqlConnection
    }
    else
    {
       throw new InvalidOperationException("Connection is not to a SQL Database");
    }
}