当我在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);
答案 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中提取提供程序的示例。
希望这会有所帮助,如果我不对,请告诉我!