2015-04-23 110 views
2

我目前正在使用Excel VBA和SQL查詢。我試圖把我放到我的記錄集中的內容轉儲到一個二維數組中,這樣我可以在函數的後面部分使用這些信息。問題是我只知道從記錄集中提取信息的兩種方法:CopyFromRecordset和rs.Fields。如何將記錄集值分配給二維數組

這是我嘗試的代碼。

Dim ID_Array(150, 2) As String 
Set rs = New ADODB.Recordset 
Set oConn = New ADODB.Connection 

strSql = "select id, name from groups" 
rs.Open strSql, oConn 

Do While Not rs.EOF 
    With ActiveSheet 
    For Index = 0 To 171 
     ID_Array(Index, 0) = CStr(rs.Fields(0).Value) 

     'Safety check to make sure the value isn't null (was having problems before) 
     If rs.Fields(1).Value <> Null Then 
      ID_Array(Index, 1) = CStr(rs.Fields(1).Value) 
     End If 

    rs.MoveNext 
    Next 
    End With 
Loop 
rs.Close 

我敢肯定,我沒有正確分配這些值,因爲當我去從記錄拉他們,很多要麼是錯誤的或根本不顯示(名字部分,特別是,甚至不會出現一個一個MsgBox命令字符串,所以我假設它沒有正確分配)。

任何人都有這方面的經驗?如何將rs的id部分分配給ID_Array的第一維,並將rs的名稱部分分配給ID_Array的第二維?

回答

1

如果您使用ADODB.Recordset,則不需要接下來的內循環。

嘗試使用此代碼,應該工作:

Dim ID_Array() As String 
Set rs = New ADODB.Recordset 
Set oConn = New ADODB.Connection 

strSql = "select id, name from groups" 
rs.Open strSql, oConn 

Index = 0 
Do While Not rs.EOF 
    'With ActiveSheet 
    'For Index = 0 To 171 you dont need for..next, Do While Not rs.EOF show you record one by one 
     ReDim Preserve ID_Array(1, Index) 
     ID_Array(0, Index) = CStr(rs.Fields(0).Value) 

     'Safety check to make sure the value isn't null (was having problems before) 
     If rs.Fields(1).Value <> vbNullString Then 
      ID_Array(1, Index) = CStr(rs.Fields(1).Value) 
     End If 
    Index = Index + 1 
    rs.MoveNext 
    'Next 
    'End With 
Loop 
rs.Close 
End Sub 
+0

感謝您的答覆。我實際上回顧了我的代碼,基本上完成了同樣的事情。但是,現在我面臨着一個不同的問題。由於空檢查,rs的「名稱」部分不復制。每當我拿走空檢查,它給了我一個「無效的空使用」錯誤消息。 – Alfabit

+0

@Alfabit:在我看來,你不能從ADODB.Recordset賦值給變量的空值,你必須檢查每個字段。 – Dawid

-1

爲了避免NULL錯誤,更新查詢,以包括NVL功能與空間取代。修剪你的.Value,你應該全部設置。請注意,用空白字符串['']替換不起作用。另外,請注意所需的格式化數據庫字段,如日期。如果沒有匹配的格式,您將替換值會出錯。

NVL(SQL_FieldName,' ')New_SQL_FieldName