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メソッドが自動的に呼び出されることはありません。IDisposableDispose メソッドを手動で呼び出して、オブジェクトの処理が完了したことをオブジェクトに通知する必要があります。または、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 に答える