我在旧版应用程序中使用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/