2010-03-18 89 views
16

我在傳統應用程序中使用ADO.NET(.NET 1.1)。我知道DataAdapter.Fill()打開和關閉連接,如果連接尚未在賦予DataAdapter之前手動打開。在引發異常時DataAdapter.Fill()是否關閉其連接?

我的問題:如果.Fill()導致異常,它是否也關閉連接?(由於SQL Server無法訪問,或其他)。它是否泄漏連接或者是否有內置的Finally子句以確保連接正在關閉。

代碼示例:

Dim cmd As New SqlCommand 
Dim da As New SqlDataAdapter 
Dim ds As New DataSet 
cmd.Connection = New SqlConnection(strConnection) 
cmd.CommandText = strSQL 
da.SelectCommand = cmd 
da.Fill(ds) 
+1

不知道它到底我會認爲它確實如此。但是,您可以使用Reflector(http://www.red-gate.com/products/reflector/)查看實現並查看它是否最終實現。 – AxelEckenberger 2010-03-18 19:47:42

回答

20

如果連接是打開的被稱爲填充()方法之前,則沒有,連接將不會被DataAdapter的封閉。但是,如果您沒有明確打開連接,而是讓DataAdapter在Fill()命令中打開並關閉連接,那麼錯誤時連接將被關閉。通過編寫程序,將錯誤出來,然後檢查連接的狀態Data Access Strategies Using ADO.NET and SQL

此外,這可以在代碼中證明:

這可以從文檔的多個來源,包括這一個暗示。

Windows窗體應用程序中的這段代碼證明了這一點。第一個消息框會顯示「打開」,第二個「已關閉」。

   string connString = ""; 
     private void Form1_Load(object sender, EventArgs e) 
     { 
      connString = Properties.Settings.Default.EventLoggingConnectionString; 
      ExplicitlyOpenConnection(); 
      LetDataAdapterHandleIt(); 
     } 

     private void ExplicitlyOpenConnection() 
     { 
      System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(connString); 
      System.Data.DataSet ds = new DataSet(); 
      System.Data.SqlClient.SqlDataAdapter ad = new System.Data.SqlClient.SqlDataAdapter("Select bogusdata from nonexistenttable", cn); 

      cn.Open(); 
      try 
      { 
       ad.Fill(ds); 
      } 
      catch (Exception ex) 
      { 

      } 

      MessageBox.Show(cn.State.ToString()); 
      cn.Close(); 
     } 
     private void LetDataAdapterHandleIt() 
     { 
      System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(connString); 
      System.Data.DataSet ds = new DataSet(); 
      System.Data.SqlClient.SqlDataAdapter ad = new System.Data.SqlClient.SqlDataAdapter("Select bogusdata from nonexistenttable", cn); 

      try 
      { 
       ad.Fill(ds); 
      } 
      catch (Exception ex) 
      { 

      } 
      MessageBox.Show(cn.State.ToString()); 
     } 
+0

非常好,感謝這個例子! – motto 2010-03-18 20:05:00

1

不是關閉連接。這個例子工程和輸出「ARealTable」

  using (SqlConnection conn = new SqlConnection("Data Source=server;Initial Catalog=database;user id=sa; password=password;")) 
      { 
       conn.Open(); 

       try 
       { 
        SqlDataAdapter adap = new SqlDataAdapter("SELECT * FROM NotATable", conn); 
        /* Exception thrown next */ 
        adap.Fill(new DataSet("test")); 
       } 
       catch (Exception) { } 

       using (SqlCommand cmd = new SqlCommand("SELECT TOP 1 Id FROM ARealTable", conn)) 
       { 
        string result = Convert.ToString(cmd.ExecuteScalar()); 
        Console.WriteLine(result); 
       } 
       Console.ReadKey(); 

編輯的Id:

如果打開前手的連接(調用打開的IDbConnection對象)時,IDataAdapter不會關閉它。但是,如果您允許IDataAdapter完全管理連接,它將被關閉。

+0

是的,如果你打開它,你有責任自己關閉它。不過,我正在查看DataAdapter爲我打開連接的情況。 – motto 2010-03-18 20:03:53

+0

在這種情況下,它將被DataAdapter關閉。 – scottm 2010-03-18 20:06:51

+0

但是如果你允許dataadapter處理關閉那麼插入命令是否工作?我同意選擇和填充將工作。 – variable 2014-08-18 06:59:31

相關問題