VB.NET封装独立数据访问类时如何正确释放SqlConnection资源
方案1:封装Fill操作,不对外暴露适配器和连接(最推荐)
将资源生命周期完全控制在DBAccess内部,外部调用无需关心资源释放逻辑,避免资源泄露风险。
调整后DBAccess代码:
Friend Class DBAccess Private SqlString As String ' 实际使用时建议从配置文件读取连接字符串 Private ReadOnly _connectionString As String = "dummyconstring" Friend Sub New(ByVal sql As String) SqlString = sql End Sub ' 直接提供填充DataTable的方法,内部完成资源管理 Friend Sub FillDataTable(targetTable As DataTable) ' Using块会在退出作用域时自动调用对象的Dispose方法 Using cn As New SqlConnection(_connectionString) Using da As New SqlDataAdapter(SqlString, cn) ' Fill方法自动处理连接的打开、关闭,无需手动操作 da.Fill(targetTable) End Using End Using End Sub End Class
调用端代码:
Public Class Form1 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim DBA As New DBAccess("dummycommand") DBA.FillDataTable(dummytable) ' 无需额外编写资源释放代码,所有资源已在FillDataTable内部处理完成 End Sub End Class
方案2:实现IDisposable接口,适配需要对外暴露SqlDataAdapter的场景
如果你的业务逻辑需要拿到SqlDataAdapter做额外操作(比如配合SqlCommandBuilder实现数据更新),可以让DBAccess实现IDisposable接口统一托管资源生命周期。
调整后DBAccess代码:
Friend Class DBAccess Implements IDisposable Private SqlString As String Private ReadOnly _connectionString As String = "dummyconstring" Private _connection As SqlConnection Private _dataAdapter As SqlDataAdapter Private _isDisposed As Boolean = False Friend Sub New(ByVal sql As String) SqlString = sql _connection = New SqlConnection(_connectionString) _dataAdapter = New SqlDataAdapter(SqlString, _connection) End Sub Friend Function provideAdapter() As SqlDataAdapter Return _dataAdapter End Function ' IDisposable接口标准实现 Protected Overridable Sub Dispose(disposing As Boolean) If Not _isDisposed Then If disposing Then ' 释放托管资源 _dataAdapter?.Dispose() _connection?.Dispose() End If _isDisposed = True End If End Sub Public Sub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub End Class
调用端代码:
Public Class Form1 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ' 用Using块包裹DBAccess实例,退出作用域时自动释放所有资源 Using DBA As New DBAccess("dummycommand") DBA.provideAdapter.Fill(dummytable) ' 可在此处继续使用适配器完成其他操作,比如更新数据 End Using End Sub End Class
补充说明
- SqlDataAdapter的
Fill、Update方法自带连接管理逻辑:如果检测到关联的连接未打开,会自动打开连接,执行完操作后自动关闭,不需要手动调用Open、Close方法。 - 所有实现了IDisposable接口的数据库相关对象(SqlConnection、SqlDataAdapter、SqlCommand等)都推荐使用Using块管理生命周期,不需要手动编写Try...Finally释放逻辑。
内容的提问来源于stack exchange,提问作者user16025262
相关产品推荐
相关产品推荐

