ADODB打开记录集失败/"对象关闭时不允许操作"

Lum*_*mpi 8 sql-server vba ado adodb recordset

我在excel中有以下UDF,它使用ADO连接到我的MSSQL服务器.它应该执行标量udf"D100601RVDATABearingAllow".

由于某种原因,我尝试附加的参数不会发送到sql server.仅在服务器上:

SELECT dbo.D100601RVDATABearingAllow
Run Code Online (Sandbox Code Playgroud)

到达.

我的EXFEL UDF:

   Function RVDATA(Fastener) As Long

    Dim cnt As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim Cmd1 As ADODB.Command
    Dim stSQL As String

Const stADO As String = "Provider=SQLOLEDB.1;Data ................"
'----------------------------------------------------------
Set cnt = New ADODB.Connection
 With cnt
    .ConnectionTimeout = 3
    .CursorLocation = adUseClient
    .Open stADO
    .CommandTimeout = 3
 End With
'----------------------------------------------------------
Set Cmd1 = New ADODB.Command
    Cmd1.ActiveConnection = cnt
    Cmd1.CommandText = "dbo.D100601RVDATABearingAllow"
    Cmd1.CommandType = adCmdStoredProc
'----------------------------------------------------------
Set Param1 = Cmd1.CreateParameter("Fastener", adInteger, adParamInput, 5)
Param1.Value = Fastener
Cmd1.Parameters.Append Param1
Set Param1 = Nothing
'----------------------------------------------------------
Set rst = Cmd1.Execute()
RVDATA = rst.Fields(0).Value    
'----------------------------------------------------------
    rst.Close
    cnt.Close
    Set rst = Nothing
    Set cnt = Nothing
'----------------------------------------------------------
End Function
Run Code Online (Sandbox Code Playgroud)

当我使用adCmdStoredProc时,整个事情都失败了,在vba调试器中,记录集的属性有很多" 当对象关闭时不允许操作 "(可能听起来有点不同,消息被翻译)

当我不使用adCmdStoredProc时,我得到的信息是没有提供变量 Fastener .

我认为打开记录集的方式可能有问题.在其他方面,我读到了使用"SET NOCOUNT ON"选项,但这也不起作用.

有没有人有想法?关心Lumpi

Dig*_*ara 16

也遇到这个错误(在我的情况下,我使用存储过程来检索一些信息).我做了一些改变导致执行失灵.

当我将SET NOCOUNT作为存储过程的第一个语句时,错误消失了.


Rom*_*man 1

您不需要SELECT服务器端函数,只需在.CommandText属性中提供其名称(“[tra-CAE400-1].dbo.D100601RVDATABearingAllow”)即可。此外,您还应该将该.CommandType属性设置为“存储过程”(w3schools.com 上的属性参考)。

然后 adodb 就会知道您正在谈论调用函数,而不是尝试发送普通的 sql 命令。

然后,它很可能允许您定义命令对象上的参数。但是您在命令对象上定义的参数应该与 sql server 中定义为函数参数的参数完全对应(在名称和类型上)。

来自 microsoft.com 的有关将命令对象与存储过程一起使用的示例

microsoft.com 上的 ADO 参考