驾驶我疯子...
问题是速度之一。
我有一个工作的SQL Server,它链接到可访问客户端的网站,我想添加一个Access前端,以使我们在办公室工作的人员能够更好地支持客户端和现场人员。
我构建的当前表单是一个主表单,其中包含五个子表单,从而在一个视图中为我们提供了所有相关的客户信息。但是,这需要24秒才能加载单个客户端的完整记录。
我查看了SQL Server,发现没有索引,将其解决后将时间缩短到24秒,根据客户端的不同,相应的负载也接近18秒(有些记录很多)。这可能是可以的,因为这是现实世界中计算时间的相对永恒,但是还不错。我想看看是否可以通过更改连接方式以及表单与记录的绑定方式等来获得更好的负载。
[在查看各种想法并阅读了大量内容后,我发现:https://docs.microsoft.com/en-us/office/vba/access/concepts/activex-data-objects/bind-a-form-to-an-ado-recordset?source=docs
这吸引了我,因为我更倾向于使用ADO,很少使用DAO。我最初了解的ADO旨在与SQL等配合使用,这似乎是一个明智的想法。
据我所知,如果我可以使其正常工作,它将作为通过查询的方式,仅通过网络返回一个记录,因此应大大加快我的表格的速度。但是,它不会起作用。
我的代码是:
Private Sub cssSetForm(lngID As Long)
Dim cnn As New ADODB.Connection
Dim Rs1 As New ADODB.Recordset
Dim strSQL As String
Dim strR As String
cnn = "Provider=MSOLEDBSQL;Server=Server;Database=DatabaseName;UID=UserName; PWD=Password;"
cnn.Open
strSQL = "SELECT Clients.Clientid, Clients.AccountContact, Clients.AccountEmail, Clients.Address, Clients.Name, Clients.OfficePhone, Clients.PostCode, " & _
"Clients.ShentonAcc, Clients.Suburb FROM Clients WHERE (((Clients.Clientid)=" & lngID & "));"
With Rs1
Set .ActiveConnection = cnn
.Source = strSQL
.LockType = adLockPessimistic
.CursorType = adOpenKeyset
.Open
End With
Debug.Print Rs1.RecordCount
Me.Recordset = Rs1
End sub
现在,在Me.Recordset = rs1生成错误3251之前,我没有任何错误,这种类型的对象不支持该操作,这对了解为什么不支持该对象的人来说非常好。请参阅我要复制的示例。
我不明白为什么我根据错误消息处理的表单不支持记录集?我的代码中有错误吗?我对链接站点破坏的理解是否是错误的?错误是其他吗?
感谢您的帮助
好吧,加载5个子表格需要大量数据。转换为ado reocdsets不会加快速度。
[您要做的是直到用户说单击适当的选项卡以加载一个给定的子表单时,才加载子表单。
只要所讨论的表单以are子句打开,则一个主表单将仅从sql server中提取一个主记录。因此,进行各种花式录音等将使您几乎一无所获。因此,始终-始终将您的主表单启动为一个记录。如果该主表单绑定到5000行或100万行的表,则尽管该表单直接绑定到具有100万行的链接表,但它将立即加载。
使用此主窗体,您可以编辑或执行任何操作,然后将其关闭。然后,您当然就回到了搜索表单/提示下,您必须询问用户要进行何种操作。那么,计费套件甚至Google的工作原理是什么?您进行搜索,显示搜索结果,然后选择一项进行查看。这种方法应该使您的主表单加载时间降低到大约1秒。同样,打开该表单时只需使用“ where”子句:例如:
dim strInv as string
strInv = InputBox("Enter invoice number to view")
docmd.OpenForm "frmInvoice",,,"InvoiceNum = " & strInv
当然,以上是空运代码,您可能会构建一些这样的搜索表单:
因此,在上面,用户键入了一点名称。然后,我们用简单的where子句或
填写表单me.MySubForm.RecordSource = "select * from tourCust where LastName like '" & sTextbox & "*'"
[当用户单击眼镜图标以编辑+查看ONE行时,我们使用此:
docmd.OpenForm "frmDetails",,,"id = " & me!id
同样,使用所有绑定的表格,并且忽略具有500,000+行的表,表格的加载是即时的-即使后端是SQL Server。
因此,采用提示+搜索结果+编辑/查看设计模式。每个单一软件系统都具有这种循环或设计模式。它不仅对用户友好,而且性能也很好,因为访问不会提取整个表,而是仅使用上面的where子句告诉您要加载表单的记录。
现在,对于子表单(子表单)。如前所述,在用户实际单击给定的选项卡之前,请不要加载它们。
因此,在选项卡的on-change事件中,您可以转到:
If Me.TabMainpage.Pages(Me.TabMainpage).Name = Me.pgeDocs.Name Then
'' the tab been changed to show past tours
dim strSQL as string
strSQL = "select * from tblPastTours where tour_ID = " & me!ID
me.
' dynamic load the sub form
If Me.frmSubPastTours .SourceObject = "" Then
Me.frmSubPastTours.SourceObject = "Forms.frmPastTours"
End If
' now load sql into form
me.frmSubPastTours.Form.RecordSource = strSQL
上面主要是空中代码,但这里的想法是:
除非需要,请不要加载子表单。或者,您可以加载子表单,但是在单击选项卡时,需要在显示的sql中将其RecordSource空白和STUFF保留。
可能需要显示所有子表单。因此,您可以将所有子窗体RecordSource保留为空白,然后将其保留为主窗体加载事件,只需将sql填充到每个子窗体中即可。这可能会提高速度,并且连接速度较慢时,这将是最少的工作。
您“未能”提及如何启动+加载主表单,但是如前所述,应将其打开以显示一个表单。链接主数据/子数据的提取可能会有点慢,我不能说仅将上述sql内容用于这些形式会很有帮助。我首先尝试一下,因为这是最少的工作量。如果加载时间仍然太慢,则将te子表单放在选项卡控件后面,并且仅加载子表单,然后设置数据源将是最快的。
试图建立所有这些记录集,然后将它们绑定到表单吗?它不会加快速度,只是将sql字符串推入记录(或子窗体)记录源的形式中,实际上确实是相同的东西,并且性能相同。因此,您节省了大量的工作和代码,并且上述想法在很大程度上不仅适用于sql server后端,而且我们所有人都很经常动态加载子表单,并且只有在您查看子表单说标签控件后面。