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

时间:2014-10-01 01:47:16

标签: sql-server excel-vba stored-procedures adodb vba

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

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

设置conn = New ADODB.Connection         conn.Open strConnection

    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循环。< / p>

1 个答案:

答案 0 :(得分:0)

获取行需要一个参数,即要检索的行数。请参阅下面的MSDN。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms677500(v=vs.85).aspx

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

然后使用该数字作为GetRows()的参数。然后你应该被设置。

由于我来自VB 2.0及以上,我习惯了rs.Fields。

祝你好运。