我总是在finally块中调用Connection.Close,但是我今天才知道你aren't supposed to do that:
不要在类的Finalize方法中对Connection,DataReader或任何其他托管对象调用Close或Dispose。在终结器中,您应该只释放您的类直接拥有的非托管资源。如果您的类不拥有任何非托管资源,请不要在类定义中包含Finalize方法
因此,在理解处理SqlCommand对象不会释放或关闭分配给它的连接对象的情况下,以下(下面的简化代码)会同时处理命令和连接对象吗?如果我确定我总是调用Connection.Close,我真的需要调用Connection.Dispose吗?
Using cmd As New NpgsqlCommand(String.Empty, new connection())
cmd.CommandText = "some sql command here"
sqlCmd.Connection.Open()
...create and fill data table
sqlCmd.Connection.Close()
End Using
答案 0 :(得分:5)
不,如果您使用Using
块,则无需显式调用Close。这是我写它的方式:
Using conn As New SqlConnection("SOME CONNECTION STRING")
Using cmd = conn.CreateCommand()
conn.Open()
cmd.CommandText = "some sql command here"
' ... create and fill data table
End Using
End Using
同时调用Close
不会关闭连接。 ADO.NET使用连接池,因此调用Close只会返回到池的连接。它没有实际关闭连接。
答案 1 :(得分:1)
你做得很好。终结器与最终块不同。查看http://www.switchonthecode.com/tutorials/csharp-tutorial-object-finalizers以了解终结器的内容。