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

标签 .net ado.net .net-1.1 sqlconnection resource-leak

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

我的问题:如果.Fill()导致异常,它还会关闭连接吗? (由于无法访问SQL Server或其他原因)。它是否会泄漏连接或是否具有内置的“最终条款”以确保连接已关闭。

代码示例:

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()命令中打开和关闭连接,则错误时将关闭连接。

可以从多种文档来源中隐含这一点,包括以下内容:Data Access Strategies Using ADO.NET and SQL

此外,这可以通过编写一个将出错的例程,然后检查连接状态的代码来证明。

Windows Forms应用程序中的此代码证明了这一点。第一个消息框将显示“打开”,第二个消息框将显示“关闭”。

              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());
        }

关于.net - 抛出异常时,DataAdapter.Fill()是否关闭其连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2472854/

相关文章:

c# - 以下 DateTime/TimeZone 示例有什么问题?

.net - 为什么这个函数不是尾递归?

.net - LINQ查询与SQL等效的性能

c# - 在 C# 中,如何在 SQL Server 中查找表的列名?

jquery - 如何将自动完成功能连接到文本框?

c# - 找出Windows服务的运行进程名称.NET 1.1

.net - 我应该从 Web 服务返回强类型数据集吗?

c# - ADO.NET 是否过度使用 IDisposable?

c# - "SqlDbType"和 "size"在添加SqlCommand参数时应该什么时候使用?

asp.net - 如何在文本框上使用 RegularExpressionValidator