【问题标题】:DbProviderFactory code relationship with code for creating a SqlConnection in ADO.NetDbProviderFactory 代码与在 ADO.Net 中创建 SqlConnection 的代码关系
【发布时间】:2013-11-07 06:39:51
【问题描述】:

当我在 ADO.Net 中实例化一个 SqlConnection 对象时,此代码是否会导致相应 DbProviderFactory 代码的执行?因此,当块 2 中的代码被执行时,我们实际上最终会执行块 1 中的代码。但我不确定这是不是真的。

代码块 1 - 使用 DbProviderFactory 方法实例化 SqlConnection

DbProviderFactory factory =
DbProviderFactories.GetFactory(providerName);

connection = factory.CreateConnection();
connection.ConnectionString = connectionString;

代码块 2 - 使用标准 ADO.Net 代码实例化 SqlConnection

SqlConnection con = new SqlConnection(connectionString);

【问题讨论】:

  • 我不太确定问题是什么。您是在问生成的 IL (反映时)是否实际上看起来像 BLOCK 1?
  • 不是 IL。我的意思是,如果在幕后,实际执行的代码是相应的 DbFactory 代码。

标签: c# ado.net sqlconnection


【解决方案1】:

我查看了一些 .net Framework 程序集,发现以下内容

DbProviderFactories.GetFactory(providerName) 将根据给定的 providerName 返回一个 Factory 对象。 假设 providerName 表示一个 SQL Provider,所以我们将得到一个 SqlClientFactory

之后会调用factory.CreateConnection()。在这种情况下,SqlClientFactory.CreateConnection() 将被调用,实现为

public override DbConnection CreateConnection()
{
    return new SqlConnection();
}

我认为您的问题的答案是调用工厂方法将调用提供程序特定类的方法,而不是相反!

【讨论】:

  • 我正在尝试查看 SqlConnection 的反编译代码,似乎对 SqlConnection 的任何调用都会导致创建 DbPRviderFactory。所以在幕后,可能是调用了 DbProvider 类。但还是不确定。
  • 我不这么认为。在SqlConnection 的静态ctor 中有一个SqlConnectionFactory,但我看不到sqlConnection 中调用_connectionFactory 的实例相关代码的代码行。无论如何,当 SqlClientFactory 调用 SqlConnection 的构造函数时,如果 SqlConnection 在内部调用 SqlClientFactory,那将是一个无休止的自我调用!
  • _connectionFactory 不是在SqlConnection 构造函数中做点什么吗?这个工厂是 DbProviderFactory 的一个实例。这是否意味着 DbProvider 工厂正在以某种方式被使用?
  • 我认为这是不可能的。当 SqlClientFactory.CreateConnection 创建一个新的 SqlConnection 时,此时调用 SqlConnection 的静态 ctor。因此,如果在 SqlConnection 中一个工厂会创建另一个 SqlConnection ...这对我来说听起来不太合乎逻辑
【解决方案2】:

要确定发生了什么,请考虑删除代码块 2 - 它不是必需的,并且会增加复杂性。只需使用工厂功能来使用连接。例如,您有:

DbProviderFactory factory =
DbProviderFactories.GetFactory(providerName);

connection = factory.CreateConnection();
connection.ConnectionString = connectionString;

添加以下内容:

try
{
  connection.Open();
  var command = connection.CreateCommand();
  command.CommandText = "SELECT * FROM mytable";
  (..etc...)

我们必须连接到 MS SQL 或 Oracle,这取决于用户的偏好,这对我们来说非常有效,唯一独特的是提供程序、连接字符串和命令文本。 Microsoft 展示了如何从 machine.config here 中提取提供程序的示例。

希望对您有所帮助,如果我不正确,请告诉我!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    相关资源
    最近更新 更多