2014-10-01 130 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