我有一个位于对等网络上的Access 2000数据库.(所有计算机都通过以太网100连接到简单的4端口交换机)数据库设计有后端和前端.有2个用户通过网络连接到后端.一个用户直接连接到后端,因为后端位于她的计算机上.所有的计算机都是相当低的规格,有500兆或1千克的内存
我有一个表单frmInvoice,它基于表"tblInvoice"表中有大约60,000条记录.还有表"tblInvoiceProducts"链接到"tblInvoice".表"tblInvoiceProducts"中有大约150,000条记录.
当我在托管后端的计算机上打开"frmInvoice"表单时,表单会很快打开.但是,如果我在其他计算机上打开表单,则打开速度非常慢.但是,一旦打开,记录导航就很快.
我认为问题是当窗体打开时,Access会打开整个表格并且可以访问所有记录.我在这个假设中是否正确?
我需要纠正这个问题并欢迎所有建议.
我将安装一个D-Link DNS-323 2-Bay网络存储机柜并将后端数据库存储在此,因为这将改善安全/数据保护.
提前致谢
" 我认为问题在于,当表单打开时,Access会打开整个表格并且所有记录都可以访问.我在这个假设中是否正确? "
我打赌你是绝对正确的.
如果打开表单的属性表,请选择"数据"选项卡,然后查看"记录源"的值,是否看到其中一个表的名称?
或者没有WHERE子句的查询,也许就像"SELECT*FROM tblInvoice;"?
如果您对这两个问题的回答都是肯定的,那么Access必须通过网络从表中提取每条记录.
所以,不要那样做!:-)性能良好的关键是将表单的记录源限制为合理的行子集.
选择一些在您的情况下有意义的标准,可能是发票日期,并构建一个将该标准合并到其WHERE子句中的查询.将该条件基于索引字段 - 如果您的表在该字段上还没有索引,则添加索引.您可以通过在查询设计器中创建新查询来进行实验...也许SQL View看起来像这样:
SELECT Invoice_ID, Customer_ID, invoice_date
FROM tblInvoice
WHERE invoice_date = Date();
Run Code Online (Sandbox Code Playgroud)
这将只检索invoice_date与今天的日期匹配的行.
(如果您已经加载了表单,将所有行拉到本地缓存中,您将无法获得该查询速度的真实指示.最好在没有首先加载的情况下从新的Access会话中测试查询表格.)
然后,为用户提供一种方法来选择不同的invoice_date.例如,一个名为txtSelectDate的文本框控件.在该控件的After Update事件中,您可以编写更新的SELECT语句,并将其应用为表单的Record Source.
Private Sub txtSelectDate_AfterUpdate()
Dim strSql As String
If Len(Me.txtSelectDate & "") > 0 Then
strSql = "SELECT Invoice_ID, Customer_ID, invoice_date" & vbCrLf & _
"FROM tblInvoice" & vbCrLf & _
"WHERE invoice_date = " & Format(Me.txtSelectDate, "\#yyyy-m-d\#")
Debug.Print strSql
Me.RecordSource = strSql
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
Debug.Print行将在立即窗口中打印SELECT语句,因此如果出现任何问题,您可以查看已完成的语句,并将其复制并粘贴到新查询的SQL视图中进行测试.更改Record Source属性会自动导致Access重新查询数据源.您可以在文本框的"更新前"事件中验证用户的条目,以确保它是有效日期.
另一种可能性是使用单个不可编辑的虚拟记录(1)使表单首次加载.然后仅在用户选择invoice_date后显示记录.要做到这一点,你可以使用这样的东西作为表格的记录来源:
SELECT TOP 1 Null AS Invoice_ID, Null AS Customer_ID, Null AS invoice_date
FROM tblInvoice;
Run Code Online (Sandbox Code Playgroud)