我刚开始将我们的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(没有注释)时立即引起语法错误