2015-12-14 64 views
4

我正在VBscript中編寫代碼,該代碼打開一個記錄集對象,然後用包含每條記錄數據的對象加載一個數組。我的記錄集類型不支持rs.RecordCount屬性,所以在循環記錄集時我需要數組ReDim Preserve,或者在執行計數循環後需要重新打開記錄集,因爲在計數循環似乎不工作後使用rs.MoveFirst ...哪個會更快?記錄集對象中最多隻有7條記錄,所以我最多需要ReDim多次。多次更新ReDim數組或重新打開記錄集?

這是我嘗試的一種方式,但rs.MoveFirst似乎並沒有正常工作,請參見注釋:

Function LoadData(filter_val) 
    Dim arr 
    Dim rs 
    'Calls function that opens the rs and returns it 
    Set rs = GetRS(filter_val) 

    Dim counter 
    counter = 0 
    Do Until rs.EOF 
     counter = counter + 1 
     rs.MoveNext 
    Loop 

    ReDim arr(counter) 

    rs.MoveFirst 

    For i = 0 To counter 
     Set arr(i) = New obj 
     'attempt to load values into the object from the recordset, but get an 
     'error saying 'either BOF or EOF is true, or the current record has been deleted' 
     'I tried adding If statements with MsgBox print outs checking for rs.EOF or rs.BOF 
     'being true right after rs.MoveFirst, but neither evaluates to true... 
    Next 
End Function 

這種方法的工作原理,但我必須不斷REDIM數組:

Function LoadData(filter_val) 
    Dim arr 
    Dim rs 
    Set rs = GetRS(filter_val) 

    Dim counter 
    counter = 0 
    ReDim arr(counter) 

    Do Until rs.EOF 
     Set arr(counter) = New obj 

     'load data from rs into object 

     rs.MoveNext 

     If Not rs.EOF 
     counter = counter + 1 
     ReDim Preserve arr(counter) 
     End If 

    Loop 
End Function 
+1

你的第一種方法將調整該陣列是一個比記錄集的大小大。那是你要的嗎?這可能就是爲什麼你在預期之前到達EOF的原因。或者設置'counter = -1'或'ReDim arr(counter-1)' – langstrom

回答

3

重新排列陣列的表現令人驚訝,所以我會去ReDim。增加數組的大小最基本的方式就是將其初始化爲空數組:

ReDim arr(-1) 

,然後通過一個與每個迭代增加一些之前增加了上邊界:

Do Until rs.EOF 
    ReDim Preserve arr(UBound(arr)+1) 
    Set arr(UBound(arr)) = New obj 

    'load data from rs into object 

    rs.MoveNext 
Loop 

這樣你不需要一個計數器變量來跟蹤數組的大小。

+0

感謝您的建議,我會繼續這樣做。對於我自己的學習,你能否指出一個資源,解釋爲什麼重新標註性能好?我不是計算機科學家,但我的直覺告訴我'ReDim Preserve'會是一個代價高昂的操作,特別是如果這個數組元素是自定義類對象,它們包含大量數據。它不需要重新加載整個數組,只是分配更多的內存用於額外的數組元素或東西? – FredGooch

+0

我無法解釋它爲什麼表現如此出色。我會期待相反的情況,因爲'ReDim Preserve'重新創建數組並複製所有現有元素(即AFAIK)。然而,使用幾百個thousend元素對'ReDim Preserve','Scripting.Dictionary'和'System.Collections.ArrayList'進行基準測試證明是另一回事。 –

+0

這就是我的想法。有趣!總是要學習更多。 – FredGooch

-1

這似乎更容易,從MSDN

GetRows方法(ADO)

檢索一個記錄對象的多個記錄到一個數組。

語法


array = recordset.GetRows(Rows, Start, Fields)

返回值


返回一個變量,其值是一個二維陣列。

參數


可選。 GetRowsOptionEnum值,指示要檢索的記錄數。默認值是adGetRowsRest。 開始 可選。一個字符串值或Variant,其值爲GetRows操作應從其開始的記錄的書籤。您也可以使用BookmarkEnum值。 字段 可選。表示單個字段名稱或序號位置的變體,或者字段名稱或序號位置編號的數組。 ADO只返回這些字段中的數據。


而且只是陣列變暗至7,如果max是7

+0

我在評論中提出了這個建議,但很快意識到OP正在將'ADO.Recordset'記錄存儲在自定義類New obj *(1D Array)*中。因此刪除了我的評論。 – Lankymart