记录集始终关闭。VB Excel 从存储过程作为记录集返回数据

Record set always closed. VB Excel returning data from stored procedure as record set

提问人:hydctrl 提问时间:10/26/2023 最后编辑:marc_shydctrl 更新时间:10/26/2023 访问量:54

问:

在Excel vb中运行时,我不断收到此错误。

当对象关闭时,不允许操作。

我可以在 SSMS 中执行存储过程并返回良好的数据。我还可以在 Excel vb 中运行简单的字符串查询并正常返回数据。什么会导致记录集关闭?

我尝试在 VB 中手动串起查询,结果相同。一旦我这样做了,我就打印并复制了vb查询并将其粘贴到SQL查询中,它返回了数据。

Sub ExecuteStoredProcedureAndRetrieveData()
    Dim conn As Object
    Set conn = CreateObject("ADODB.Connection")
    conn.ConnectionString = ""
    conn.Open

    Dim cmd As Object
    Set cmd = CreateObject("ADODB.Command")
    cmd.ActiveConnection = conn
    cmd.CommandText = "ProcedureStored"

    Dim rs As Object
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open cmd

    Sheets("Sheet1").Range("A1").CopyFromRecordset rs

    rs.Close
    Set rs = Nothing
    cmd.ActiveConnection = Nothing
    conn.Close
    Set conn = Nothing
End Sub

这是存储过程:

CREATE PROCEDURE ProcedureStored
AS
BEGIN
    DECLARE @day_date DATE = '1973-12-25';
    DECLARE @date_start DATETIME;
    DECLARE @date_end DATETIME;

    SET @date_start = CAST(CONVERT(VARCHAR, @day_date) + ' 06:00:00' AS DATETIME);
    SET @date_end = CAST(CONVERT(VARCHAR, @day_date) + ' 16:30:00' AS DATETIME);

    DECLARE @Hours TABLE (Date DATETIME, Hour INT);
    DECLARE @i INT;
    DECLARE @j INT;
    DECLARE @loop_count INT;
    DECLARE @date_change_flag INT;

    SET @i = CONVERT(INT, DATEPART(HOUR, @date_start));
    SET @j = CONVERT(INT, DATEPART(HOUR, @date_end));
    SET @loop_count = 0;
    SET @date_change_flag = 0;

    WHILE @loop_count < 11
    BEGIN
        IF @i < 24 AND @date_change_flag = 0
        BEGIN
            INSERT INTO @Hours
            VALUES (@date_start, @i);
        END
        ELSE IF @i >= 24 AND @date_change_flag = 0
        BEGIN
            SET @date_change_flag = 1;
            SET @i = 0;

            INSERT INTO @Hours
            VALUES (DATEADD(DAY, 1, @date_start), @i);
        END
        ELSE IF @date_change_flag = 1
        BEGIN
            INSERT INTO @Hours
            VALUES (DATEADD(DAY, 1, @date_start), @i);
        END

        SET @loop_count = @loop_count + 1;
        SET @i = @i + 1;
    END

    SELECT 'ID 19' AS [ID], [Date], [Hour],
           SUM(ISNULL([Errors (Delays)], 0)) AS [Errors (Delays)]
    FROM
    (
        SELECT 'ID' AS [ID], FORMAT([time_stamp], 'yyyy-MM-dd') AS [Date], DATEPART(HOUR, [time_stamp]) AS [Hour], COUNT(*) AS [Errors (Delays)]
        FROM [error_events]
        WHERE [error_type] = 0 AND [time_stamp] BETWEEN @date_start AND @date_end
          AND [source] LIKE '%Filter1%'
          AND ([trace_path] LIKE '%/Filter2%' 
               OR [trace_path] LIKE '%/Filter3%' 
               OR [trace_path] LIKE '%/Filter4%' 
               OR [trace_path] LIKE '%/Filter5%')
        GROUP BY FORMAT([time_stamp], 'yyyy-MM-dd'), DATEPART(HOUR, [time_stamp])
        UNION ALL
        SELECT 'ID' AS [ID], FORMAT(DATE, 'yyyy-MM-dd') AS [Date], Hour AS [Hour], NULL
        FROM @Hours
    ) AS Data
    GROUP BY [Date], [Hour]
    ORDER BY [ID];
END
sql-server excel vba

评论

1赞 siggemannen 10/26/2023
那么,哪一行会产生错误呢?连接字符串也是空的
0赞 pghcpa 10/26/2023
我复制了您的 VBA 和 SQL,但替换了我自己的 Select 语句,无法复制您的错误。这表明问题出在您的 SELECT 语句中。您可以使用“Set rs=cmd.Execute”而不是“rs.open cmd”,也可以删除“rs.close”。这可能会给你一个更好的错误。当您尝试关闭从未成功打开的记录集时,可能会出现此错误。设置断点以确定 VBA 中的哪一行出现此错误。
0赞 hydctrl 10/26/2023
@AaronBertrand添加 SET NOCOUNT ON;做到了。它现在以各种方式运行。
0赞 Darren Bartrup-Cook 10/27/2023
你不应该有连接的详细信息吗?用于 SQL Server 的 Microsoft OLE DB 驱动程序连接字符串ConnectionString

答: 暂无答案