2013-04-10 42 views
2
  1. 使用System.Data.SqlClient命名空間cosnidered managed or umanaged code在C#progamm中執行查詢嗎?是System.Data.SqlClient代碼的託管代碼?

  2. 每次關閉連接時,都會使用(conn.Close()方法)資源是否會考慮釋放,或者我們必須將其釋放才能釋放?

+0

查詢在SQL Server或任何其他數據庫系統上執行 - 這些系統通常不是託管代碼庫... – 2013-04-10 16:13:25

+0

您是出於好奇還是因爲您有特定的問題需要您此信息爲?如果確實有問題,最好直接描述一下。 – Pondlife 2013-04-10 16:28:29

+0

@Pondlife我在C#中有一個項目,我打開了數倍於sql的conn's。我想知道,如果每次關閉conn,資源都會重新啓用,或者我必須使用Dispose方法。此外,我要求Q1在每次查詢後需要實現我自己的dispose方法來釋放資源。 – apomene 2013-04-10 16:32:49

回答

1

System.Data.SqlClient本身是託管代碼。但是,它建立在其他幾個圖書館之上。其中一些是託管代碼,另一些則不是。

  1. 查詢本身由數據庫執行。因此,查詢文本(在您的程序中硬編碼的部分)將被視爲託管代碼,但是一旦該命令被髮送到數據庫,它就不再被管理。

  2. 執行.close命令後,連接本身將從.NET應用程序釋放並返回到連接池(OLEDB,ODBC和/或其他子系統的一部分)。此時,連接被釋放,非託管部分被釋放。 Dispose將完成所有關閉並釋放其他託管部分(連接字符串等)。

在任何實現它的對象上調用dispose總是一個好主意(或者將它包裝在使用塊中,如@IRSOG所示)。在這種情況下,調用close()並不是特別危險。我不會養成它的習慣。

1

關於第二個問題:

Close方法回滾任何未決的事務。然後它釋放到連接池的連接,或者在連接池被禁用時關閉連接。

被修改

下面的示例創建一個SqlConnection,打開它,顯示它的一些屬性。該連接在使用塊的末尾自動關閉。

private static void OpenSqlConnection(string connectionString) 
{ 
    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     connection.Open(); 
     Console.WriteLine("ServerVersion: {0}", connection.ServerVersion); 
     Console.WriteLine("State: {0}", connection.State); 
    } 
} 

編輯

你需要使用的每一個對象,你創建一個實現IDisposable。這包括SqlCommandSqlConnection。如果使用using語句,它們將在使用塊後處理。

+0

所以不需要使用Dispose()是否正確? – apomene 2013-04-10 16:19:46

+0

@apomene:看我的編輯 – KF2 2013-04-10 16:23:36

+0

@apomene:看我的新編輯 – KF2 2013-04-10 16:40:17