Dot-Net

拋出異常時 DataAdapter.Fill() 是否關閉其連接?

  • March 18, 2010

我在舊版應用程序中使用 ADO.NET (.NET 1.1)。我知道如果在將連接提供給 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)

如果在呼叫 Fill() 方法之前連接是打開的,那麼不,連接不會被 DataAdapter 關閉。

但是,如果您沒有顯式打開連接,而是讓 DataAdapter 在 Fill() 命令中打開和關閉連接,則連接將在出錯時關閉。

這可以從多個文件來源中得到暗示,包括這個:使用 ADO.NET 和 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());
       }

引用自:https://stackoverflow.com/questions/2472854