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)
| 归档时间: |
|
| 查看次数: |
22544 次 |
| 最近记录: |