Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用VB.net数据库连接维护内存的示例_Vb.net - Fatal编程技术网

使用VB.net数据库连接维护内存的示例

使用VB.net数据库连接维护内存的示例,vb.net,Vb.net,我在数据库连接处理方面有一个特别的问题,尽管在处理连接、数据集和数据表时有很多来回的过度处理,但作为一个新的VB程序员,我不能完全理解它。我的项目有一个表单,其中有一个简单的“导入数据库”按钮,可以打开一个连接。假设我有一个包含多个数据集和数据表的数据库,这些数据集和数据表占用大量内存,因此我必须小心打开和关闭东西。我有一个按钮关闭数据库时,完成了它。代码大致如下,不会抛出错误(即,我可以连接,获取正确的数据,然后关闭数据库而不会抛出错误) 现在在另一节课上 Private Class Data

我在数据库连接处理方面有一个特别的问题,尽管在处理连接、数据集和数据表时有很多来回的过度处理,但作为一个新的VB程序员,我不能完全理解它。我的项目有一个表单,其中有一个简单的“导入数据库”按钮,可以打开一个连接。假设我有一个包含多个数据集和数据表的数据库,这些数据集和数据表占用大量内存,因此我必须小心打开和关闭东西。我有一个按钮关闭数据库时,完成了它。代码大致如下,不会抛出错误(即,我可以连接,获取正确的数据,然后关闭数据库而不会抛出错误)

现在在另一节课上

Private Class DataBaseOps
Public OpenCon As OleDb.OleDbConnection

  Public Sub OpenDataBase(strPath as String)
    'My.Settings.ConnectionString is a variable in App.Config
    OpenCon = New OleDb.OleDbConnection(My.Settings.ConnectionString & strPath)
    OpenCon.Open()
  End Sub

  Public Sub PopulateMyDataSet()
    '...Populate my datasets and tables based on data from the database
'...Note that for the adapters I include "Using" to help keep those clean when I no longer need them
  End sub 

  Public Sub CloseDatabase()
        Try
            OpenCon.Close()
        Catch ex As Exception
            MessageBox.Show("No Database file loaded.")
        End Try
  End Sub

  Overrides Sub Finalize()
    '...Datasets get .Dispose() which is a topic of its own elsewhere.
    OpenCon.Dispose()
  End Sub
End Class
请记住,还有其他方法可以做到这一点,但这里的关键因素是打开连接,保持连接打开以填充数据网格,在数据库中执行一些其他工作,然后关闭连接,释放连接和数据集内存

我的问题是,我尝试了各种方法来限制“ConnectedDB”及其数据集的范围,包括在进程中放入Finalize()子对象,试图将其从内存中删除。我也曾玩弄过范围界定,但这两种方法都不完美,而且似乎能将项目保留在记忆中。
使用我的通用代码,我可以做些什么来清理内存资源?作为一个相对较新的VB.net程序员,我是否遗漏了一些明显的东西(比如我可以继承一个类到另一个类,而不是调用它们?

在Finalize方法中,在
OpenCon.Dispose()之后添加这两行代码


将您的连接保持在使用它们的本地位置。然后可以使用…End Using块来确保它们已关闭和释放

感谢邓肯·爱德华兹·琼斯的这句话

“数据库连接就像冰箱门——你只需打开它 当你需要什么的时候,你只需要拿出你需要的,然后 取出所需物品后立即关闭。”

一个数据集可以包含多个数据表。我不知道为什么您需要不止一个数据集

Class Form1
    Private ConnectedDB As DataBaseOps
    Private ds As DataSet
    Private Sub ImportDatabaseButton(sender As Object, e And eventargs) Handles ImportDatabaseButton.click
        Dim OpenDial As New OpenFileDialog
        'Open filedialog and return the path, etc.
        Dim strPATH = OpenDial.FileName
        ConnectedDB = New DataBaseOps(strPATH)
    End Sub

    Private Sub populateDSDT()
        '...populate my datasets which then populate my datagrids
        ds = ConnectedDB.PopulateMyDataSet()
        '...populate my datagrids
    End Sub

End Class

Public Class DataBaseOps

    Private DBFile As String
    Public Sub New(file As String)
        DBFile = file
    End Sub

    Public Function PopulateMyDataSet() As DataSet
        Dim ds As New DataSet
        Using OpenCon As New OleDb.OleDbConnection(My.Settings.ConnectionString & DBFile)
            OpenCon.Open() 'But don't do this until directly before the .Execute...
            '...Populate my datasets and tables based on data from the database
            '...Note that for the adapters I include "Using" to help keep those clean when I no longer need them
        End Using
        Return ds
    End Function
End Class

删除此:
Public OpenCon As OleDb.OleDbConnection
。当您需要打开连接时,请在适当的位置进行。使用
Using
语句,或者使用
.Dispose()
将其删除,并处理您创建的所有其他一次性对象。连接池是被管理的。如果我理解你的话,我最初在设计代码时就想到了这一点。只要根据需要打开/关闭连接。然而,有许多操作需要它打开(扩展它的生命周期),因此我最终选择保持它打开,以使程序能够简单地完成它们的工作,然后在用户完成后关闭它。连接的生命周期在其他地方管理。不要试图推翻这种逻辑。您不需要尝试保持连接打开。当代码需要连接时,它只要求提供一个连接(您的代码不创建连接,而是从池中接收一个连接,池管理其托管对象的生命周期)。您可以使用一种方法,该方法创建一个新的连接对象,返回该对象,并在请求该对象的方法执行其任务后立即处理其销毁(只是为了修改代码)。我实际上只有两个数据集,这只是为了保留数据的两个独立面(原始和熟的)。我可以把它们全部放在一个集合中,但我把它们分开,以防后面那个可怜的评论者。这不是我问题的一部分,但你和吉米都建议只要我需要,就使用这个连接。当我开始在SQLLand中使用数据库时会发生什么?我有大约40个查询,这些查询分块或全部排成一列,所以我想在重新整理数据时保持“冰箱门”打开。考虑到这一点,我认为Mary和Jimi对这个特定问题有最好的总体答案,那就是在我需要时保持连接打开/关闭。这进一步提出了不同的问题,关于在连接周围移动数据块的最佳方式,但这是另一个主题的另一个问题,当我有时间写它时,我将在我的主要问题中链接到这个主题。谢谢你们俩的帮助。
GC.Collect()
GC.WaitForPendingFinalizers()
Class Form1
    Private ConnectedDB As DataBaseOps
    Private ds As DataSet
    Private Sub ImportDatabaseButton(sender As Object, e And eventargs) Handles ImportDatabaseButton.click
        Dim OpenDial As New OpenFileDialog
        'Open filedialog and return the path, etc.
        Dim strPATH = OpenDial.FileName
        ConnectedDB = New DataBaseOps(strPATH)
    End Sub

    Private Sub populateDSDT()
        '...populate my datasets which then populate my datagrids
        ds = ConnectedDB.PopulateMyDataSet()
        '...populate my datagrids
    End Sub

End Class

Public Class DataBaseOps

    Private DBFile As String
    Public Sub New(file As String)
        DBFile = file
    End Sub

    Public Function PopulateMyDataSet() As DataSet
        Dim ds As New DataSet
        Using OpenCon As New OleDb.OleDbConnection(My.Settings.ConnectionString & DBFile)
            OpenCon.Open() 'But don't do this until directly before the .Execute...
            '...Populate my datasets and tables based on data from the database
            '...Note that for the adapters I include "Using" to help keep those clean when I no longer need them
        End Using
        Return ds
    End Function
End Class