0

我正在连接到 Access 数据库,我想知道在我的 cconnectionDB.vb 中覆盖 Sub finalize 是否有用:

Imports System.Data.SqlClient
Imports System.Data.Common
Imports System.IO

Public Class DbConn
    Private DataCon As DbConnection
    Private DBConnectionOpen As Boolean = False

     Protected Overrides Sub finalize()
            Try
                DataCon.Close()
            Catch ex As Exception

            End Try
        End Sub

    Public Sub OpenDatabaseConnection()
        Try
            DataCon.Open()
        Catch ex As Exception
            Throw New System.Exception("Error opening data connection.", ex.InnerException)
            DBConnectionOpen = False
            Exit Sub
        End Try
        DBConnectionOpen = True
    End Sub 

    Public Sub CloseDatabaseConnection()
        DataCon.Close()
        DBConnectionOpen = False
    End Sub


   ''' <summary>
    ''' Creates a new connection to an Access database
    ''' </summary>
    ''' <param name="FileName">The full path of the Access file</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal FileName As String)
        'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\myFolder\myAccess2007file.accdb;Persist Security Info=False;
        Dim fileData As FileInfo = My.Computer.FileSystem.GetFileInfo(FileName)
        DataCon = New OleDb.OleDbConnection
        Dim csb As OleDb.OleDbConnectionStringBuilder = New OleDb.OleDbConnectionStringBuilder
        csb.ConnectionString = "Data Source=" & FileName
        Select Case fileData.Extension.ToLower
            Case ".mdb" : csb.Add("Provider", "Microsoft.Jet.Oledb.4.0")
            Case ".accdb" : csb.Add("Provider", "Microsoft.ACE.OLEDB.12.0")
        End Select
        DataCon.ConnectionString = csb.ConnectionString
        Try
            DataCon.Open()
            DataCon.Close()
        Catch ex As Exception
            Throw New System.Exception("Unable to connect to database.", ex.InnerException)
        End Try
    End Sub
End Class
4

1 回答 1

1

这不是非常有用。在Finalize垃圾收集器开始销毁对象之前,不会调用解构器。而且,由于该DbConn对象将是唯一引用该DbConnection对象的事物,因此无论如何它都会同时自动销毁该对象。如果您想在完成连接后立即释放连接,推荐的方法是IDisposable在您的类中实现接口。例如:

Private Class DbConn
    Implements IDisposable

    Private DataCon As DbConnection
    Private disposedValue As Boolean

    Protected Overridable Sub Dispose(disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                Try
                    DataCon.Close()
                Catch ex As Exception
                End Try
            End If
        End If
        disposedValue = True
    End Sub

    Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
End Class

但是,如果您实施IDisposable,您的工作并没有在那里完成。对象上的Dispose方法IDisposable永远不会被自动调用。您需要通过手动调用 Dispose 方法来告诉对象何时使用完毕。或者,您可以使用Using块:

Using d As New DbConn
    ' The DbConn.Dispose method automatically gets called once execution leaves this Using block
End Using  
于 2013-02-12T16:48:46.980 回答