22

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

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

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

4

4 回答 4

16

不,它不安全,强制转换永远不会安全,并且在您的应用程序运行时它可能随时发生故障。虽然SqlConnection确实从DbConnection您那里派生,但不能保证database.CreateConnection()会返回 a 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 硬编码,并且有 ORM 可以处理这种情况。它们还将允许您专注于应用程序的实际领域,而不是浪费时间编写 SQL 查询和从一个数据库提供程序转换到另一个数据库提供程序。但是对于一个简单的应用程序来说,这是可以的。

于 2010-09-05T19:45:43.313 回答
11

只要您从不更改连接字符串以连接到 SQL Server 数据库以外的任何内容,它就应该是安全的。如果这是可能的,那么您应该添加更多逻辑以确保安全:

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

using(DbConnection conn = database.CreateConnection())
{    
    if(conn is SqlConnection)
    {
        var sqlConn = conn as SqlConnection;
    }
}
于 2010-09-05T19:45:17.693 回答
6

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

于 2010-09-05T19:46:21.767 回答
1

您始终可以进行检查并将其转换为SqlConnectionC# 模式匹配 (C# 7.0+)

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");
    }
}
于 2019-03-24T17:48:33.317 回答