【问题标题】:Access 2010 vba Array vs. QueryAccess 2010 vba 数组与查询
【发布时间】:2014-01-01 05:13:29
【问题描述】:

我在工作中维护了一个 Access 数据库,我们使用它来发送员工生产力的每小时更新。目前,我将表单排列成列:第一列包含一个 ComboBox,我们可以从中选择员工的姓名。选择名称后,下一列会自动填写代理的员工 ID (TID),通过以下代码:

        AgentName = rs.Fields("AgentName")

        sqlString2 = "SELECT * FROM " & "AllAgents WHERE FullName ='" & AgentName & "'"
        rs2.Open sqlString2, CurrentProject.Connection, adOpenKeyset, adLockOptimistic

        AgentTID = rs2.Fields("TID").Value

        rs2.Close

在公司网络上的办公室工作时一切正常,但我刚刚发现使用此表单时通过 VPN 工作会导致可怕的速度下降。缓慢是我一直在与 VPN 斗争的一个问题,但在这种情况下我有一个想法可能会导致缓慢,我想在麻烦重新编码之前知道我是否正确.

我的想法是,我可以在 VBA 中创建一个数组,该数组将在表单首次加载时填充代理的名称和 ID,甚至在每台笔记本电脑上打开数据库时填充。然后数据库只需要从“AllAgents”表中读取一次,并且可以简单地将数组用作源。我不知道这是否会产生影响。基本上,如果将 Access DB 保存到网络驱动器并通过 VPN 访问,那么该阵列是否会存储在笔记本电脑的 RAM 中?如果是这样,我认为这将缓解速度问题,并且值得花时间重新编码。

谢谢,

【问题讨论】:

  • AllAgents 表有多少行?
  • 目前有 163 个,但随着我们获得或失去代理,这种变化相当规律

标签: sql arrays vba ms-access vpn


【解决方案1】:

关于 Access 中的表单级或全局变量的一点是,您最好在应用程序中进行良好的错误处理。如果发生未捕获的错误,则可能导致这些变量因缺少更好的单词而被丢弃。结果将是您下次尝试访问数组中的数据时会遇到另一个异常。

在进行数组路由之前,您可以尝试以下几件事:

  • 您的组合框可能不需要直接绑定到您的记录集rs。在设计时将组合框的源设置为基础查询或表。
  • 这使得可以使用以下内容简单地引用组合框的绑定字段:AgentName = cboAgentName.Value

(如果您可以从表单中消除不必要的记录集对象,从长远来看,您会变得更好)

  • 您的查找代码不需要使用SELECT *。这不是在生产代码中使用的好习惯。相反,请使用SELECT TID。基本上,只在查询中返回您实际需要的字段。
  • 您不需要使用adOpenKeySet 选项,这是不必要的开销。您应该可以使用adOpenForwardOnly

我还建议查看 AllAgents 表,以确保您用于查找的字段上有索引。如果没有,请考虑添加一个。

您可能仍然需要采用数组路线,但这些都是相对简单的事情,您可以使用它们来尝试排除性能故障,而无需对应用程序进行大量代码更改。

【讨论】:

  • 我经历并尝试了我可以形成您的建议的方法,如果您不介意,我有几个问题。首先,您建议在设计时设置 ComboBox 的来源;这是如何实现的? (我删除的第二点是代理人的名字拼写不正确的问题:)。)
  • @KevenM 看看这篇文章,它概述了如何在设计时设置源代码office.microsoft.com/en-us/access-help/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
相关资源
最近更新 更多