1

当我在 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);
4

2 回答 2

3

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

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

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

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

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

于 2012-09-01T18:57:00.787 回答
3

要确定发生了什么,请考虑删除代码块 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 中提取提供程序的示例。

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

于 2013-11-06T22:39:51.620 回答