C# DbConnection 转换为 SqlConnection

标签 c# 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?最好使用层次结构中较高的类,以避免将您的代码与特定实现耦合,这将使您的代码无法单独测试。

虽然 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 查询以及从一个数据库提供商转换到另一个数据库提供商。但对于一个简单的应用程序来说,这是可以的。

关于C# DbConnection 转换为 SqlConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3647492/

相关文章:

c# - 使用 C# 时我的属性出现问题

javascript - 如何在 ASP.NET C# 中显示谷歌地图

c# - AutoMapper:如何仅映射匹配的属性名称并忽略所有其他属性名称?

c# - using 语句可以用大括号代替吗?

database - 打开一次数据库连接还是在每次数据库操作时打开?

c# - 具有多个引用的 Entity Framework LoadProperty

c# - 在 C# 全局连接中用于所有类

c# - SqlDataAdapter 是否在 Fill() 函数后关闭 SqlConnection?

c# - 为什么我们需要在 ConnectionString 中设置最小池大小

c# - Mocking 是否能够替换包装在方法中的功能?