抛出异常时,DataAdapter.Fill()是否会关闭其连接?

mot*_*tto 17 .net .net-1.1 ado.net sqlconnection resource-leak

我在遗留应用程序中使用ADO.NET(.NET 1.1).我知道DataAdapter.Fill()如果在给DataAdapter之前没有手动打开连接,则会打开和关闭连接.

我的问题:如果.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)
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 21

如果在调用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());
        }
Run Code Online (Sandbox Code Playgroud)