Sql server VBA Recordset.GetRows返回不完整的结果集

Sql server VBA Recordset.GetRows返回不完整的结果集,sql-server,excel,stored-procedures,adodb,vba,Sql Server,Excel,Stored Procedures,Adodb,Vba,我遇到了一个奇怪的问题: 我有一个MSSQL存储过程,它的性能很差,所以我重写了它。重写后,如果从SSMS或控制台调用,新的存储过程仍然可以返回相同的结果。但当VBA调用时,返回结果的几列是空的 Set conn=新的ADODB.连接 连接开放式结构连接 Set rs = New ADODB.Recordset Set cmd = New ADODB.Command cmd.ActiveConnection = conn cmd.CommandText = "[

我遇到了一个奇怪的问题:

我有一个MSSQL存储过程,它的性能很差,所以我重写了它。重写后,如果从SSMS或控制台调用,新的存储过程仍然可以返回相同的结果。但当VBA调用时,返回结果的几列是空的

Set conn=新的ADODB.连接 连接开放式结构连接

    Set rs = New ADODB.Recordset

    Set cmd = New ADODB.Command
    cmd.ActiveConnection = conn
    cmd.CommandText = "[ops].[spReportsDoAnalyticsForAllProducts]"

    cmd.CommandType = adCmdStoredProc
    cmd.Parameters.Refresh
    cmd.Properties.Refresh

    cmd.Parameters.Append cmd.CreateParameter("runId", adInteger, adParamInput)
    cmd("runid") = runid

    Set rs = cmd.Execute

    If Not rs.EOF Then
        data = rs.GetRows
        hasData = True

    End If

    rs.Close
    Set rs = Nothing

    conn.Close
    Set conn = Nothing
上面是VBA代码,rs.GetRows是返回不完整结果的代码。我被迫使用以下代码替换它,并在VBA中手动填充结果:

    While Not rs.EOF
        ReDim Preserve data(rs.Fields.count - 1, count)
        For i = 0 To rs.Fields.count - 1
            data(i, count) = rs.Fields(i).Value
        Next i
        count = count + 1
        rs.MoveNext
    Wend

我想知道导致GetRows不工作但字段仍在工作的真正原因,或者是否有任何替代方法可以替代while循环。

Get rows需要一个参数,即要检索的行数。见下面的MSDN

如果您从存储过程中返回零或N作为返回码

然后将该数字用作获取行的参数。那你就应该准备好了

因为我来自VB2.0及以上版本,所以我习惯于rs字段


祝你好运。

但是GetRows的所有参数都是可选的:我对rs.Fields没有任何保留,只是在这种情况下,当我需要整个数据集时,一个while循环并没有效率和读者友好性。我只是不明白为什么当我只更新sp逻辑时getRows突然失灵。sp的输入和输出始终保持不变。可选。GetRowsOptionEnum值,指示要检索的记录数。默认值为adGetRowsRest。adGetRowsRest的值是多少。这些过去是包括旧时代的文件。它的价值是什么?在调用rs.GetRows之前,尝试在线路上调用rs.MoveLast。不,如果移动到最后,则无法获取任何数据。奇怪的是,经过几天的努力,它自己治愈了!getRows突然在没有任何代码或数据库更改的情况下工作。但我仍然想知道原因是什么……对于记录,我找到了一种消除这个问题的方法:从存储过程返回的字段不能设置为varcharMAX。您可以将其设置为相当大的大小,错误将立即消失。