SqlDataAdapter.Dispose是否真正关闭了相关联的SqlConnection?

10

有人知道SqlDataAdapter.Dispose方法是否会关闭或处理任何SqlConnection连接吗?我查看了Reflector,发现SqlDataAdapter继承自DbDataAdapter。如果我反汇编并查看该类中的dispose方法,则似乎没有处理任何SqlConnection连接。我想我可以编写一个测试来验证这一点,但我认为我应该先询问是否有人对此有更深入的了解。

3个回答

12
首先要知道的是DataAdapter在某些情况下会管理和关闭连接。例如,如果您正在使用DataAdapter,那么您可能正在使用.Fill().Update()函数操作DataTable/DataSet。
根据.Fill()文档
引用:

The connection object associated with the SELECT statement must be valid, but it does not need to be open. If the connection is closed before Fill is called, it is opened to retrieve data, then closed. If the connection is open before Fill is called, it remains open.

根据.Update()文档,它没有提及连接,因此我希望需要手动管理连接。
你特别问到Dispose()方法。与Update()一样,Dispose()文档没有明确提到连接,因此我期望需要手动关闭它。
最后,我们可以稍微改进Bob King的代码,如下:
Using conn as New SqlConnection(""), _
      adapter as New SqlDataAdapter() With {.Connection = conn}
    ' Do stuff
End Using

或者在C#中:

using (SqlConnection conn = new SqlConnection(""))
using (SqlDataAdapter adapter = new SqlDataAdapter() {Connection = conn})
{
    // Do stuff
}

1
哦,Joel,我从来不知道你可以在同一个Using语句中声明多个IDisposable。这真是太棒了! - Bob King
另外,我认为 C# 版本的对象初始化器不使用前导符号“.”。http://weblogs.asp.net/dwahlin/archive/2007/09/09/c-3-0-features-object-initializers.aspx - Bob King

1
据我所知,它并不会自动关闭。我使用嵌套的Using语句来实现这一点,首先创建连接,然后创建适配器,当Using语句“弹出”时,适配器被处理,然后连接被处理,这样就会触发关闭操作:确实如此。
Using conn as New SqlConnection("")
    Using adapter as New SqlDataAdapter() With {.Connection = conn}
        'Do stuff'
    End Using
End Using

如果您选择的编程语言是C#,那么其语法几乎完全相同。


0

不,它不会释放连接。我认为它不应该这样做。你可能想在其他地方使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接