SqlDataAdapter.Dispose实际关闭关联的SqlConnection吗?

时间:2009-01-22 15:05:08

标签: .net ado.net

有没有人知道SqlDataAdapter.Dispose方法是否实际关闭或处置任何SqlConnections?我加载了Reflector,我发现SqlDataAdapter继承自DbDataAdapter。如果我反汇编并查看该类中的dispose方法,似乎没有任何SqlConnections的处理。我想我可以为此写一个测试,但我想我会问是否有人对此有任何见解。

3 个答案:

答案 0 :(得分:10)

首先要注意的是DataAdapter在某些情况下会管理和关闭您的连接。例如,如果您使用的是DataAdapter,则可能使用.Fill()和.Update()函数在DataTables / DataSet上运行。

来自.Fill() docs

  

与SELECT语句关联的连接对象必须有效,但不需要打开它。如果在调用Fill之前关闭连接,则会打开它以检索数据,然后关闭。如果在调用Fill之前连接已打开,则它将保持打开状态。

.Update() docs根本没有提及有关连接的任何内容,所以我希望手动管理它。

现在你具体询问了Dispose()方法。与更新类似,Dispose() docs没有特别提及连接,因此我希望需要手动关闭它。

最后,我们可以略微改进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
}

不是100%我得到了适配器的初始化语法,但是我直接在回复窗口中输入了它。如果需要,我稍后会修复它。

答案 1 :(得分:1)

据我所知,事实并非如此。我使用嵌套的Using语句实现这一点,首先创建连接,然后创建适配器,并使用using语句“pop”,适配器是Disposed,然后连接是Disposed,确实触发关闭:

Using conn as New SqlConnection("")
    Using adapter as New SqlDataAdapter() With {.Connection = conn}
        'Do stuff'
    End Using
End Using

如果这是您选择的语言,C#的语法几乎相同。

答案 2 :(得分:0)

不,它没有处理连接。我相信不应该。您可能想在其他地方使用它。