2015-04-23 106 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

相关问题