传递记录集类型错误

Passing Recordset Type Error

我在尝试将 Recordset 传递给我的 类 之一的方法时遇到类型错误。 我的代码如下所示:

Dim rs As ADODB.recordset
Set rs = New ADODB.recordset
'do some connection stuff
'create command
rs.Open cmd
dataWriter.write(rs)

方法如下所示:

sub write(byRef record as ADODB.recordset)
    range("A1").CopyFromRecordset record
end sub

除了我在尝试将记录集传递给 write 子时遇到的类型错误外,一切正常(例如,如果我在第一段代码中调用 range("A1").copyfromrecordset rs,它工作正常)。

有什么想法吗?谢谢

dataWriter.write (rs)

删除括号。这些迫使 rs 评估 并通过 ByVal 不管 write 的签名说了什么: 基本上你将记录集的默认 属性 值(这是它的 Fields 属性 getter,所以一个 ADODB.Fields 对象)传递到一个参数中ADODB.Recordset,因此出现 类型不匹配 错误。

dataWriter.Write rs

将传递记录集引用...实际上应该传递 ByVal,因为 Write 根本不需要重新分配该引用。

Sub Write(ByVal record As ADODB.Recordset)
    Range("A1").CopyFromRecordset record
End Sub

要点是括号 计算 表达式 - 在直接窗格中试试这个:

?TypeName(New ADODB.Recordset)
 Recordset

?TypeName((New ADODB.Recordset))
 Fields

请注意,Range("A1") 隐式引用活动工作表,这是草率的。您应该在那里明确地使用 target 参数:

Sub Write(ByVal record As ADODB.Recordset, ByVal target As Excel.Worksheet)
    target.Range("A1").CopyFromRecordset record
End Sub