处置SQL连接

我有一个SQL类连接到数据库并转发DataTable。 我知道完成后必须处理SqlConnection。 我知道这可以使用using块来完成,但是将Dispose()调用放在这个类的析构函数中也是可以接受的吗?

Herre是我的代码:

 public class SQLEng { //Connection String Property //Must be set to establish a connection to the database public string ConnectionString{ get; set; } SqlConnection _Conn; //Overridden Constructor enforcing the Connection string to be set when created public SQLEng(string connectionString) { ConnectionString = connectionString; _Conn = new SqlConnection(connectionString); } //ensure the SqlConnection is disposed when destructing this object public ~SQLEng() { _Conn.Dispose(); } //various other methods to get datatables etc... } 

基本上我希望有一个类变量SqlConnection,而不是在访问数据库的每个方法中实例化SqlConnection。 这听起来有效吗?

您的设计鼓励长时间挂在(可能是开放的) SqlConnection上。 最佳做法是在需要之前打开连接,然后在完成后立即释放(关闭并处理)它。

是的,创建新连接会产生一些开销; 连接池减少了大部分处理时间。 更糟糕的是在服务器上保持许多连接。

查看企业库的源代码(来自MS Patterns&Practices团队),DAAB根据需要创建连接并尽快处理它。

 public virtual int ExecuteNonQuery(DbCommand command) { using (var wrapper = GetOpenConnection()) { PrepareCommand(command, wrapper.Connection); return DoExecuteNonQuery(command); } } protected DatabaseConnectionWrapper GetOpenConnection() { DatabaseConnectionWrapper connection = TransactionScopeConnections.GetConnection(this); return connection ?? GetWrappedConnection(); } 

所以我想说这是最好的做法。 在大多数情况下,您所做的只是将连接返回到连接池,因此连接本身并未关闭。

如果您希望包装SQL Connection类,请实现IDisposable并从您自己的Dispose()方法中调用Dispose()连接。 更多信息在这里:

正确处理DbConnection

至于这是否是一个好习惯 – 好吧,如果你所做的一切都是将SQL连接包装在另一个类中,我不确定你实现了什么。 您的所有方法仍然需要访问此类的实例,在这种情况下,它们可以自己访问连接对象的实例。