【发布时间】:2019-12-27 22:19:18
【问题描述】:
把我逼疯了……
问题是速度之一。
我有一个链接到客户端可访问网站的有效 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 Operation is not supported for this type of object 这对于理解为什么不支持的人来说非常好,因为它与我没有什么不同可以查看我复制的示例。
我不明白为什么我正在处理的表单根据错误消息不支持记录集?我的代码有错误吗?我对链接站点的破坏的理解有误吗?错误是其他原因吗?
感谢您的帮助
【问题讨论】:
-
为什么要使用记录集来设置表单的数据集?我从来没有这样做过。为什么不用 SQL 语句设置 RecordSource 属性?
-
好的,刚刚注意到您的后端是 SQLServer。我也没用过。
-
您缺少
Set关键字:Set Me.Recordset = Rs1