2014-10-01 374 views
0

我遇到了这个奇怪的问题:VBA Recordset.GetRows返回不完整结果集

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

设置康恩=新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循环。

+0

尝试在调用rs.GetRows之前调用行上的rs.MoveLast。 – 2014-10-01 09:21:32

+0

如果您最后一次移动,则不会提取任何数据。 – rexwolf 2014-10-02 05:36:15

+0

奇怪的是,在挣扎的日子之后,它自己治好了! getRows突然没有任何代码或数据库更改工作。然而,我仍然想知道是什么原因... – rexwolf 2014-10-02 05:42:22

回答

0

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

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

如果您从您的存储过程返回零或N的返回码。

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

因为我来自VB 2.0以上,我习惯了rs.Fields。

祝你好运。

+0

但GetRows的所有参数都是可选的:http://msdn.microsoft.com/en-us/library/windows/desktop/ms675120(v=vs.85).aspx我没有任何反对rs.Fields,它只是在这种情况下,当我期待整个数据集时,while循环效率并不高,并且对读者友好。我只是不明白,当我只更新sp逻辑时getRows如何突然失灵。 sp的输入和输出始终保持不变。 – rexwolf 2014-10-01 08:02:48

+0

可选。 GetRowsOptionEnum值,指示要检索的记录数。默认值是adGetRowsRest。 adGetRowsRest的价值是什么。这些过去是过去的包含文件。什么是价值? – 2014-10-01 19:43:52