我必须在处理之前closures()一个SQLConnection吗?
在这里关于一次性对象的其他问题 ,我们应该在使用块结束之前调用Close()吗?
using (SqlConnection connection = new SqlConnection()) using (SqlCommand command = new SqlCommand()) { command.CommandText = "INSERT INTO YourMom (Amount) VALUES (1)"; command.CommandType = System.Data.CommandType.Text; connection.Open(); command.ExecuteNonQuery(); // Is this call necessary? connection.Close(); }
由于您有一个使用块,因此将调用SQLCommand的Dispose方法,并closures连接:
// System.Data.SqlClient.SqlConnection.Dispose disassemble protected override void Dispose(bool disposing) { if (disposing) { this._userConnectionOptions = null; this._poolGroup = null; this.Close(); } this.DisposeMe(disposing); base.Dispose(disposing); }
从.NETreflection器反汇编SqlConnection:
protected override void Dispose(bool disposing) { if (disposing) { this._userConnectionOptions = null; this._poolGroup = null; this.Close(); } this.DisposeMe(disposing); base.Dispose(disposing); }
它在Dispose()中调用Close()
using关键字将正确closures连接,因此不需要额外调用Close。
从SQL Server连接池的MSDN文章:
“我们强烈build议您在完成使用后始终closures连接,以便将连接返回到池中。可以使用Connection对象的Close或Dispose方法,或打开在C#中使用语句 “
使用.NET Reflector的SqlConnection.Dispose的实际实现如下所示:
// System.Data.SqlClient.SqlConnection.Dispose disassemble protected override void Dispose(bool disposing) { if (disposing) { this._userConnectionOptions = null; this._poolGroup = null; this.Close(); } this.DisposeMe(disposing); base.Dispose(disposing); }
不,在SqlConnection上调用Dispose()也会调用Close()。
MSDN – SqlConnection.Dispose()
使用Reflector ,你可以看到SqlConnection
的Dispose
方法实际上调用了Close()
;
protected override void Dispose(bool disposing) { if (disposing) { this._userConnectionOptions = null; this._poolGroup = null; this.Close(); } this.DisposeMe(disposing); base.Dispose(disposing); }
不,使用Using块无论如何都会调用Dispose()
,所以不需要调用Close()
。
不,在调用Dispose之前没有必要closures连接。
一些对象(如SQLConnections)可以在调用Dispose之后重新使用,但不能在调用Dispose之后使用。 对于调用Close的其他对象与调用Dispose相同。 (我认为ManualResetEvent和Streams的行为是这样的)
不,SqlConnection类从IDisposableinheritance,当遇到使用结束(对于连接对象)时,它会自动调用SqlConnection类上的Dispose。