我一直调用Connection。在finally块中关闭,但我今天了解到你不应该这么做:
不要对类的Finalize方法中的Connection、DataReader或任何其他托管对象调用Close或Dispose。在终结器中,应该只释放类直接拥有的非托管资源。如果您的类不拥有任何非托管资源,请不要在类定义中包含Finalize方法
因此,如果理解处理SqlCommand对象不会处理或关闭分配给它的连接对象,以下(下面的简化代码)会同时处理命令和连接对象吗?我真的需要调用Connection.Dispose吗?如果我确保总是调用Connection.Close?
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
否,如果使用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只需返回到池的连接。它不会在物理上关闭连接。
您所做的一切都很好。终结器与finally块不同。退房http://www.switchonthecode.com/tutorials/csharp-tutorial-object-finalizers讨论终结器是什么。