有没有人知道SqlDataAdapter.Dispose方法是否实际关闭或处置任何SqlConnections?我加载了Reflector,我发现SqlDataAdapter继承自DbDataAdapter。如果我反汇编并查看该类中的dispose方法,似乎没有任何SqlConnections的处理。我想我可以为此写一个测试,但我想我会问是否有人对此有任何见解。
答案 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)
不,它没有处理连接。我相信不应该。您可能想在其他地方使用它。