DbProviderFactory与用于在ADO.Net中创建SqlConnection的代码的代码关系

时间:2012-09-01 18:11:34

标签: c# ado.net sqlconnection

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

2 个答案:

答案 0 :(得分:3)

我查看了一些 .net Framework程序集并找到了以下内容

DbProviderFactories.GetFactory(providerName)将根据给定的providerName 返回Factory对象。 假设 providerName表示SQL提供程序,因此我们将获得SqlClientFactory

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

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

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

答案 1 :(得分: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中提取提供程序的示例。

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