我在工作中维护一个Access DB,用于发送每小时的员工生产力更新。目前我将表单排列成列:第一列包含一个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,或者甚至在每台个人笔记本电脑上打开数据库时的ID。然后,数据库只需要从“AllAgents”中读取数据。表一次,可以简单地使用数组作为源。我所知道的是,这是否会产生影响。基本上,如果Access DB保存到网络驱动器上并通过VPN访问,那么阵列是否会存储在笔记本电脑的RAM中?如果是的话,我认为这样可以缓解速度问题,并且值得花时间重新编码。
谢谢,
答案 0 :(得分:2)
Access中关于表单级或全局变量的事情是,您最好在应用程序中进行良好的错误处理。如果发生未捕获的错误,则可能导致这些变量缺少更好的单词。结果是下次尝试访问数组中的数据时,会出现另一个异常。
在进入阵列路线之前,您可以尝试以下几点:
rs
。将设计时组合框的源设置为基础查询或表。AgentName = cboAgentName.Value
(如果您可以从表单中删除不必要的记录集对象,那么从长远来看,这将是更好的选择)
SELECT *
。这在生产代码中使用并不是一个好习惯。相反,请使用SELECT TID
。基本上,只在查询中返回您实际需要的字段。adOpenKeySet
选项,这是不必要的开销。您应该可以使用adOpenForwardOnly
。我还建议查看AllAgents表以确保在用于查找的字段上有索引。如果没有,请考虑添加一个。
您仍然可能需要使用阵列路由,但这些是相对简单的事情,您可以使用它们来尝试解决性能问题,而不会对应用程序进行大量的代码更改。