‘3704’ 对象关闭时不允许操作 VB 6.0

问题描述

下面的存储过程在 sql Server 中运行良好,但从 VB 6.0 调用它会给我一个错误

Create PROCEDURE spEnvioCorreoCoberturaBoveda
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    CREATE TABLE #tmp(
      iId               INT IDENTITY,cAgeCod           VARCHAR(3),cAgeDescripcion   VARCHAR(100)
    )

    DECLARE @viIterador     INT = 1
    DECLARE @viNumRegistros INT = 0
    DECLARE @vcConsulta     NVARCHAR(2000)
    DECLARE @vcParametros   NVARCHAR(100)
    DECLARE @vcAgeCod       VARCHAR(3)
    SET NOCOUNT OFF;
    INSERT INTO #tmp(cAgeCod,cAgeDescripcion)
    SELECT cAgeCod,cAgeDescripcion FROM DBComunes.dbo.Agencias WHERE nestado = 1
    SET @viNumRegistros = ScopE_IDENTITY()
    -- Borrar table
    delete from dbrepstage.dbo.CapSobrantesFaltantesConsolidado
    WHILE @viIterador <= @viNumRegistros
    BEGIN
        SET @vcAgeCod = (SELECT cAgeCod FROM #tmp WHERE iId = @viIterador)
        SET @vcConsulta = ' execute dbcmact'+ @vcAgeCod+'.dbo.CapSobrantesFaltantesConsolidado ' + '''' + @vcAgeCod +''''
        --PRINT @vcConsulta
        EXEC SP_EXECUTEsql @vcConsulta
        SET @viIterador = @viIterador + 1
    END
    drop table #tmp
END

VB 6.0

Dim ssql As String,nSumaSoles As Currency,nSumaDolares As Currency
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
ssql = "DBRepStage.dbo.spEnvioCorreoCoberturaBoveda" & vbCrLf
    
    rs.Open ssql,dbCmact,adOpenStatic,adLockBatchOptimistic,adCmdText
    rs.Close
    Set rs = nothing

错误:'3704' 对象关闭时不允许操作

有人可以告诉我我失败的地方。干杯

解决方法

错误在第 rs.Open ... 行或 rs.Close 行?

以防万一,你可以试试

set rs = dbCmact.Execute(sSql)

代替

rs.Open sSql,dbCmact,adOpenStatic,adLockBatchOptimistic,adCmdText
,

我建议使用带有 CommandType = adCmdStoredProc 的 ADODB.Command 对象来执行 SP:

Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command

Set cmd = New ADODB.Command
With cmd
   Set .ActiveConnection = dbCmact  ' Assuming this is a properly initialized ADODB.Connection object
   .CommandType = adCmdStoredProc
End With

cmd.CommandText = "DBRepStage.dbo.spEnvioCorreoCoberturaBoveda"
Set rs = cmd.Execute

正如上面@MarkL 建议的那样,确保您的 ADODB.Connection 对象已正确初始化

[已添加]

至于您的 rs.Close 语句,请养成这样做的习惯:

If Not rs Is Nothing Then
    If Not rs.State = adStateClosed Then
        rs.Close
    End If
End If

Set rs = Nothing