【问题标题】:How to fix "Multiple-stop OLE DB operation..." errors when using ADO Command to run stored procedure in SQL Server使用 ADO 命令在 SQL Server 中运行存储过程时如何修复“多次停止 OLE DB 操作...”错误
【发布时间】: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


【解决方案1】:

你有你的.Precision.Scale 倒退:

prm.NumericScale = 6
prm.Precision = 0

精度为 0 的值可以存储 0 位数字。如果数据类型为NUMERIC(6, 0),则参数应为:

prm.NumericScale = 0
prm.Precision = 6

精度是左边的数字。

【讨论】:

  • 谢谢共产国际!这通常是最简单的事情(这占用了我今天下午大约 2 个小时的时间)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多