MS Access从SQL Server存储过程将RS绑定到表单时崩溃



我刚开始将我们的Access DB移动到SQL Server,我遇到了麻烦。

我有一个存储过程,它成功地将行返回到ado记录集。

当我尝试将包含存储过程结果的rs绑定到Access表单时,Access崩溃了,没有显示任何错误消息。我在O365 32b和SQL Server 2019上。

代码如下:

Dim sSQL As String, rs As ADODB.Recordset
1   sSQL = "Exec usp_TaskStatusWidget " & Me.Tag & ",0"

2   ADOConn.ConnectionString = conADO
4   ADOConn.Open
6   Set rs = New ADODB.Recordset
7   rs.CursorLocation = adUseClient
8   rs.Open sSQL, ADOConn
10  Set Me.Recordset = rs ' Access crashes here

任何帮助都将非常感激!

tia。老

好的,你以前使用过ADO吗,还是你只是在介绍它?

在大多数情况下,最好只使用视图。(用链接视图替换访问查询),然后继续使用客户端where子句或过滤器(访问将只拉下您请求的行)。因此,链接视图通常是一个更好的选择,而且工作量少得多(事实上,即使是现有的用于打开报告等的过滤器也可以工作,并且只提取与were子句记录匹配的标准。

在大多数情况下,我不引入ADO。

对于PT查询,我经常这样做:

dim rs    as DAO.RecordSet
with CurrentDb.queryDefs("qryPt")
.SQL = "Exec usp_TaskStatusWidget " & Me.Tag & ",0"
set rs = .OpenRecordSet
end with
因此,上面假设您有一个名为qryPt的pt查询。这也意味着您永远不会处理或担心代码中的连接字符串。pt查询具有该连接。(并且您的重链接代码现在可以重链接表和pt查询)。

我只是在您引入ADO来调用存储过程,而应用程序的其余部分是以前的DAO的情况下建议您使用上述方法。如果应用程序是以前的DAO,那么就不要管它了,把上面的方法用于PT查询——甚至是需要调用存储过程的代码。

Access倾向于尝试解析查询文本以获得过滤器/排序等工作,如果它不是一个简单的语法错误,但也不是Access SQL,奇怪的事情往往会发生,主要是崩溃。

尝试在前面添加注释以确保Access知道不解析:

sSQL = "-- Access no parse pls" & vbCrLf & "Exec usp_TaskStatusWidget " & Me.Tag & ",0"

注释的内容是不相关的,当然,它的目的是在Access试图将其解析为Access SQL(没有注释)时立即引起语法错误