2012-09-01 40 views
0

當我在ADO.Net中實例化一個SqlConnection對象時,那麼這個代碼是否會導致執行相應的DbProviderFactory代碼?所以當第二塊中的代碼被執行時,我們實際上最終會在第一塊中執行代碼。但我不確定這是否屬實。DbProviderFactory代碼與在ADO.Net中創建SqlConnection的代碼關係

代碼塊1 - 使用實例化一個SqlConnection DbProviderFactory方法

代碼塊2 -Instantiate使用標準ADO.Net代碼

SqlConnection con = new SqlConnection(connectionString); 
+0

我不太確定問題是什麼。你問是否IL產生(反射時)實際上看起來像BLOCK 1? –

+0

不是IL。我的意思是,如果在幕後,實際執行的代碼是相應的DbFactory代碼。 – Sunil

回答

3

我看看一個SqlConnection在一些.net框架程序集,並發現以下

DbProviderFactories.GetFactory(providerName)將返回一個Factory對象,根據給定providerName。 我們假設providerName指示SQL提供程序因此我們將得到SqlClientFactory

之後將會調用factory.CreateConnection()。在這種情況下SqlClientFactory.CreateConnection()將被稱爲其實現爲

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

我認爲回答你的問題是調用工廠方法將調用提供的方法的具體類,而不是倒過來!

+0

我正在嘗試通過反編譯的SqlConnection代碼,並且似乎任何對SqlConnection的調用都會導致創建DbPRoviderFactory。所以在幕後,可能會調用DbProvider類。但仍然不確定。 – Sunil

+0

我不這麼認爲。在SqlConnection的靜態庫中,有一個SqlConnectionFactory,但是我無法在sqlConnection中看到與_connectionFactory調用相關的實例代碼行。無論如何,因爲SqlClientFactory調用SqlConnection的構造函數,如果SqlConnection在其中調用SqlClientFactory,它將是無休止的自調用! –

+0

不是_connectionFactory在SqlConnection構造函數中做些什麼?這個工廠是DbProviderFactory的一個實例。這是否意味着DbProvider工廠以某種方式被使用? – Sunil

2

爲了確定發生了什麼,考慮刪除代碼塊2 - 它不是必需的,並增加了複雜性。只需使用工廠功能即可使用連接。例如,您有:

添加以下內容:

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

我們必須連接到MS SQL或Oracle,這取決於用戶的喜好,這完美地工作對我們來說,唯一獨特的意志是提供者,連接字符串和命令文本。微軟展示了一個如何從machine.config here中提取提供者的例子。

希望這有助於,如果我不正確,請讓我知道!