在ACCESS FE / BE环境中,搜索表单上的加载时间很长

时间:2018-07-10 17:37:08

标签: ms-access ms-access-2013

我正在向您寻求有关ACCESS FE / BE应用程序的帮助。

我已经使用VBA相当一段时间了(尽管仅在ACCESS上使用了一年左右),但这是我实际上需要在远程服务器上设置后端的第一个项目,而我正在努力解决什么问题似乎是一个连接问题(我不是VBA开发人员)。我当然做错了事,所以可以随时重定向到一个不错的教程,该教程可以帮助我解决这种情况。

因此,我的应用程序基本上是一个存储数据库,我们处理一个文件,将其与所有相关信息一起通过FE添加到BE,用户可以查询诸如客户端ID或名称之类的内容,以获取所有文件的列表。相关文件并查看它们的存储位置。

在本地,一切工作都非常好,并且在远程服务器上只有一个用户可以全面使用,但是如果有多个用户,事情就变得很复杂。我发现数据库似乎需要完全加载到RAM中才能对其内容执行搜索,并且每当有人修改记录时,都会有一些标志告诉Access在新的搜索中重新下载数据库以使所有内容新鲜,这会花费太长时间(每次大约30秒)。我猜一切都按预期工作,但是那时我很难找到一种拥有多用户应用程序的好方法。我无法想象这是应该如何工作的,所以我想我做事的方式是错误的(或者是服务器,这主要是整个公司的存储服务器,不是为了流量而设计的,但是我不知道)。

我已经解决了这个问题,这是有人使用搜索表单时调用的代码的一部分:

Set searchRST = dbs.OpenRecordset(SQLQuery, dbOpenSnapshot)

        If searchRST.RecordCount <> 0 Then
            If searchRST.EOF = False Then
                searchRST.MoveNext
            End If
            searchRST.MoveFirst
        End If

        Select Case searchRST.RecordCount
            Case 0
                .Controls("search_Results").Visible = False
                .Controls("Button_Load").Visible = False

                MsgBox ("No record found.")

            Case 1
                fileRST.FindFirst ("[ID] = " & searchRST![ID])
                Forms(const_File).Bookmark = fileRST.Bookmark
                .Controls("search_Results").Visible = False
                .Controls("Button_Load").Visible = False
                Call launchFileMode(modeVal)

            Case Is > 1
                searchRST.MoveLast
                "Others checks are made before displaying results in a subform control

基本上,当您输入搜索条件并单击一个按钮时,它将根据提供的SQLQuery字符串过滤数据库,遍历整个过滤后的记录集,以便以后可以加载它,或者显示一条消息“ Nothing found”如果筛选后的记录集的RecordCount为0,则显示唯一的文件(如果为1)(通过将“文件”窗体当前加载的记录集的书签设置为筛选后的记录集的书签),或者如果子菜单中显示筛选后的记录集,则显示子表单> 1,因此用户可以选择要访问的文件。

SQLQuery是根据不同的搜索条件以编程方式创建的字符串(它旨在处理多条件搜索,但目前尚未使用),它给出了以下内容:

SQLQuery = "SELECT * FROM [DB] WHERE [CLIENT ID] LIKE '0123456';"

根据RecordCount的不同,加载时间不同:

  • 如果为0,则行Set searchRST = dbs.OpenRecordset(SQLQuery, dbOpenSnapshot)将收取费用;
  • 如果为1,则行searchRST.MoveNext将收取费用;
  • 如果它大于1,则行searchRST.MoveLast(用于向子窗体加载筛选后的记录集的所有记录,以便您可以向下滚动而不会延迟)将收取费用。

那是我迷路了。无论记录集有多大,为什么都没有在同一行上获得加载时间?如果实际上是检索有问题的数据的操作,那么应该在每种情况下都是dbs.OpenRecordset行引起问题,不是吗?

我做的事情可能是有史以来最糟糕的,因此,对此或任何其他处理这些搜索的建议将不胜感激!

随时询问可能有用的任何细节。

(很抱歉,如果不清楚的话,我正在努力将其发布到可以访问accdb文件的位置)

1 个答案:

答案 0 :(得分:0)

如果只有一条记录,那么为什么要先查找?如果查询与您发布的查询相似,那么在大多数情况下,对ID的搜索可能只会返回一条记录,并且应该很快。因此,最重要的是该条件限制了提取的记录数。假设使用某种类型的“密钥”,那么在绝大多数情况下,您仅可能会从服务器获取/返回/拉取一条记录。您还需要100%确保您有一个持久的连接(绑定表对于指向后端的链接表仍然保持打开状态。

还假定您的应用程序已拆分,并且每个工作站都有FE的副本。

还假定后端服务器上的共享文件夹位于您的本地网络上,而不是通过Internet进行的某些远程“ VPN”类型的连接,这通常比典型的办公室网络慢大约100倍。您可以在此处了解LAN(局域网)与WAN(广域网)之间的速度差异:

http://www.kallal.ca//Wan/Wans.html

如果您是通过LAN工作的,那么我不明白为什么性能会变慢或出现任何问题(如果应用程序在一个用户上运行很快,但在两个用户上运行慢,那么10倍中有9倍,持久的连接技巧将解决此问题。)

因此,基本假设为: 您的应用程序已拆分。 每个工作站都获得前端的副本。 您拥有持久的连接。 您正在使用标准的办公室LAN,而不是某种WAN(或VPN)。