【问题标题】:KEEP THE DATABASE OPEN THROGHOUT THE OPERATION VB.NET在 VB.NET 操作期间保持数据库打开
【发布时间】:2021-06-13 01:41:16
【问题描述】:

我需要一种方法来让我的 MSaccess 数据库在整个应用程序操作过程中保持打开状态,而不是在每次输入数据时打开和关闭。 目前Dim provider As String Dim dataFile As String Dim connString As String Dim myConnection As OleDbConnection = New OleDbConnection Dim cmd As New OleDbCommand 在每种形式中都是公开的。并且在私有类上声明了以下内容

 provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
        dataFile = "C:\Program Files (x86)\SACCO\SACCO_DB.accdb"
        connString = provider & dataFile
        myConnection.Open()
        Dim str As String
        str = "INSERT INTO STAFF([ID_NO],[FULL_NAME],[EMAIL],[PASSWORD]) Values(?,?,?,?)"
        Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection) 

这会使我的应用程序变慢。请有人指导我如何在启动时保持数据库打开并在退出时关闭。

【问题讨论】:

  • 首先让我们退后一步...为什么要使用 MS Access 作为应用程序的后端?它本身主要设计为单用户桌面数据库平台,或者作为 SQL Server 数据库之类的前端。它通常不适合作为另一个应用程序的后端。您可以为此选择更好的选择。
  • 您如何确定这确实使您的应用程序变慢了?
  • 如果花费的时间超过 0.1 秒,那么很可能是其他原因导致您的应用程序变慢。 Measure app performance in Visual Studio 可以帮助您检查瓶颈在哪里。
  • 每次需要访问数据时打开和关闭连接可能是最佳实践。毕竟 Connection 实现了 IDisposable ,这是一个公平的迹象,表明它应该有一个非常短的生命周期。正如其他人所建议的那样,如果保持这样的连接会导致足够的延迟甚至可以注意到,那么还有其他事情在起作用。
  • 为什么不使用 id 的自增字段?

标签: vb.net ms-access-2010


【解决方案1】:

是的,这是一个由来已久的问题 - 我们几乎每周都会看到有关打开数据库时如何发生大延迟的帖子。因此,在这 20 多年的时间里,几乎每天,从访问前端到后端,解决方案一直是强制 + 保持持久连接。我可以写一篇关于如何以及为什么会发生这种情况的长篇文章,但它与 Windows 文件系统有关 - 因此是文件的打开,并且 Access 试图打开独占,因为它试图将文件的使用翻转为高速度单用户模式可能会导致非常大的延迟。如前所述,强制并保持连接打开是近 20 年来我们在这里看到的几乎每天的建议。

那么,好吧,我们现在使用 vb.net?

只需将标准代码模块中的全局变量声明为公共变量。然后在你的启动代码中,你可以做两件事之一:

打开数据库对象 - 这意味着您不必提前知道“选择”要打开的特定表。

例如:

Imports System.Data.OleDb

Module MyGlobalCode

    Public gDBCon As OleDbConnection ' global connection object

    Public Sub GlobalOpenDatabase()
        gDBCon = New OleDbConnection(My.Settings.TESTAce)
        gDBCon.Open
    End Sub

    Public Sub GlobalCloseDatabase()
        gDBCon.Close()
    End Sub


End Module

那么,现在在任何和所有代码中?您使用上述 gDBCon 并且您:

不必一遍又一遍地创建新的连接对象。 您消除了这个由来已久的缓慢打开问题。

现在,尚不清楚为什么在某些网络和设置上不会发生这种大延迟 - 但是,如果发生这种情况,那么上述将显示性能的惊人改进。通常问题甚至是病毒扫描软件,有时似乎与 Active Directory 有关。而其他时候,它与非常慢的文件创建时间有关(每次打开数据库时,也会创建一个“.ldb”文件 - 在某些系统上创建此文件的时间可能很长 - 再次强制打开连接将消除您的软件速度受到 AD 或病毒软件等外部因素或导致此问题的大量其他问题的限制。

【讨论】:

  • Kallal 非常感谢您花时间回答我的问题。只需要稍微澄清一下。将变量设为全局后,如果我在表单 btnclose 上调用变量并在启动应用程序时在表单加载中调用它是否正确?
  • 是的,这个想法是在您的启动例程中一次性调用。关于唯一的问题是某些 cmdSQL 执行命令我相信在某些情况下会关闭连接。关于发生这种情况的情况,我没有一个完整的答案。因此,代替全局连接对象,创建一个返回连接对象的全局函数会更安全,但可以检查该对象是否在该函数中打开,如果没有,则再次执行 .open 处理现有代码可能是围绕“正常”使用而设计的,其中连接对象被关闭甚至处置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2016-10-09
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多