【发布时间】:2016-09-06 00:59:04
【问题描述】:
我正在尝试运行一个使用 ADO 命令对象返回记录的 SQL Server 存储过程。我能够连接到数据库(我的连接在我的代码中的其他地方使用,并且在以下函数中测试时,状态属性返回 1 -- 已连接)但在执行命令时出现以下错误。
运行时错误“-2147217887 (80040e21)”:
多次停止 OLE DB 操作产生错误。检查每个 OLD DB 状态值(如果可用)。没有完成任何工作。
从我在线阅读的内容来看,这可能与参数有关,但我看不出它有什么问题(我添加了一个手表并在调试模式下检查了 params 集合中的每个项目) .
这是用于将存储过程结果返回到 ADODB 记录集的函数:
Public Function GetRecordset(CmdType As String, CmdText As String, Optional InputParams As Collection) As ADODB.Recordset
Dim prm As ADODB.Parameter
Select Case CmdType
Case "proc"
If cmd Is Nothing Then
Set cmd = New ADODB.Command
With cmd
Set .ActiveConnection = GetConnection
For Each prm In InputParams
.Parameters.Append prm
Next prm
Select Case CmdType
Case "proc": .CommandType = adCmdStoredProc
Case "sql": .CommandType = adCmdText
End Select
.CommandText = CmdText
Set rs = .Execute
End With
Set GetRecordset = rs
End If
Case "sql"
End Select
End Function
如上,出现错误就行了:
Set rs = .Execute
存储过程中的预期输入参数是 numeric(6,0) 类型。传递给函数的参数如下:
prm.Direction = adParamInput
prm.Name = "@ISOWk"
prm.NumericScale = 6
prm.Precision = 0
prm.Type = adNumeric
prm.Value = 201613
我可以直接在 SSMS 中执行存储过程,所以我相信这不是这里的问题。
欢迎提出任何建议。
谢谢
【问题讨论】:
-
需要用到rs.open,execute执行非查询sql什么是cmdText
-
感谢您的回复,Nathan_Sav。据我了解,
command.execute方法返回一个记录集,我应该能够将其分配给记录集(我过去曾成功完成此操作)。请你举个例子来说明你的意思吗?谢谢 -
我会为“插入表(field1)值'xyz'”的sql和“从表中选择*”的sql使用execute,或者在期望返回时我会使用rs.open( SQL,CONNECTION,TYPE) 读取它看起来像 cmd.execute 应该返回,我会继续阅读。你作为 cmdText 传入了什么?另外,附带说明一下,不需要内部选择案例。
-
感谢您发现额外的
select case,Nathan_Sav。我计划使用该函数从 SQL 查询和 SQL 存储过程返回记录集,因此我尝试编写一个函数来处理这两者。目前,我的cmdText函数参数/参数将包含存储过程的名称或作为字符串的 SQL 查询。
标签: sql-server vba stored-procedures