2013-10-24 29 views
0

出現了一個愚蠢的問題,它接縫簡單,但我不明白。
得到了一個Excel工作表一個非常簡單的VBA代碼:在VBA中解析記錄集時出錯

Private Sub GET_MDW_DATA() 
    On Error GoTo ErrorHandler 
    Dim cn As ADODB.Connection 
    Set cn = New ADODB.Connection 
    Dim rs As ADODB.Recordset 
    Set rs = New ADODB.Recordset 
    Dim cmdSQLData As ADODB.Command 
    Set cmdSQLData = New ADODB.Command 

    Dim cnstr As String 

    Dim usr 
    Set usr = Nothing 
    usr = Sheet1.Cells(1, 4).Value 

    Dim pwd 
    Set pwd = Nothing 
    pwd = Sheet1.Cells(2, 4).Value 

    Dim odbcname 
    Set odbcname = Nothing 
    odbcname = Sheet1.Cells(1, 8).Value 

    Dim Category As String 
    Category = Sheet1.Cells(1, 6).Value 

    Dim Store As String 
    Store = Sheet1.Cells(2, 6).Value 

    cnstr = "Data Source=" & odbcname & "; Database=belccp_msi_d; Persist Security Info=True; User ID=" & usr & "; Password=" & pwd & "; Session Mode=ANSI;" 
    cn.Open cnstr 

    Set cmdSQLData.ActiveConnection = cn 
    Sheet1.Range("A6 : H1000000").Clear 

    Query = "SELECT SOMETHING FROM SOME DATABASE" 


    cmdSQLData.CommandText = Query 
    cmdSQLData.CommandType = adCmdText 
    cmdSQLData.CommandTimeout = 0 
    Set rs = cmdSQLData.Execute() 
    rs.MoveFirst 

    x = 6 
    Do While (rs.BOF = False or rs.EOF = False) 
     p = rs.GetRows(-1) 
     Sheet1.Range("A" & x).Value = p(0, 8) 
     Sheet1.Range("B" & x).Value = p(1, 8) 
     Sheet1.Range("C" & x).Value = p(2, 8) 
     Sheet1.Range("D" & x).Value = p(3, 8) 
     Sheet1.Range("E" & x).Value = p(4, 8) 
     Sheet1.Range("F" & x).Value = p(5, 8) 
     Sheet1.Range("G" & x).Value = p(6, 8) 
     Sheet1.Range("H" & x).Value = p(7, 8) 

     x = x + 1 

    Loop 

    cn.Close 
    Set cn = Nothing 
    Set rs = Nothing 
    Set cmdSQLData = Nothing 

如果我「打印」我的選擇,將它複製並在查詢執行它,它從我的數據庫返回30行,但是當我執行它從我的excel「代碼」它只返回1行,從30行只有一行。

我已經檢查過,只是在x=x+1rs.EOFTrue。這意味着要麼我的記錄集只有一個值(如果是這樣,爲什麼?因爲我的選擇返回30行)或者我沒有正確解析它。任何提示?

提前許多感謝,

+0

我不太清楚,但是你使用'rs.GetRows(-1)'的原因?因爲根據[this](http://msdn.microsoft.com/en-us/library/windows/desktop/ms675120(v = vs.85).aspx)和[this](http://msdn.microsoft .com/en-us/library/windows/desktop/ms677558(v = vs.85).aspx),它會一次將_ALL_記錄讀入你的'p'(因此是二維數組)。通常'rs(0)','rs(1)'等與'rs.MoveNext'就足夠了。 – Passerby

回答

1

,我在你的代碼注意到一個奇怪的事情是,你使用GetRows的功能在一個循環。

GetRows將記錄集加載到數組中。
您可以遍歷由GetRows返回的數組,或循環訪問記錄集。沒有理由爲什麼你會同時做這兩件事。

如果通過記錄你循環,你會是這樣的:

x = 6 'As you prefer 
rs.MoveFirst 
Do Until rs.EOF 

    Sheet1.Range("A" & x).Value = rs![field_name_1] 
    Sheet1.Range("B" & x).Value = rs![field_name_2] 
    Sheet1.Range("C" & x).Value = rs![field_name_3] 
    Sheet1.Range("D" & x).Value = rs![field_name_4] 
    Sheet1.Range("E" & x).Value = rs![field_name_5] 
    Sheet1.Range("F" & x).Value = rs![field_name_6] 
    Sheet1.Range("G" & x).Value = rs![field_name_7] 
    Sheet1.Range("H" & x).Value = rs![field_name_8] 

    rs.MoveNext 

Loop 

要檢查多少記錄有在您的記錄,使用:

rs.MoveLast 
iRecordCount = rs.RecordCount 
+0

當使用rs![field_name_1]它給我一些錯誤。我應該使用rs而不是rs [field_name_1],因爲它是從我的select中選擇的實際字段名稱? – BogdanM

+1

是的,你認爲是正確的。 – Trace

+1

非常感謝你! – BogdanM