ADODB.RecordSet从VB.NET中的对象分配值表现不佳

时间:2013-08-19 15:17:00

标签: .net ado adodb

我们需要从.NET类对象中分配一个ADODB.RecordSet,我不确定我是否做得对。假设我有一个名为orderList的List,它由类Order的对象组成,我需要从这个列表生成一个RecordSet(我有adodb作为参考)。我的代码如下所示:

Dim rs As Recordset = New Recordset
rs.Fields.Append("ID", DataTypeEnum.adInteger)
rs.Fields.Append("Sender", DataTypeEnum.adBSTR)
rs.Fields.Append("Receiver", DataTypeEnum.adBSTR)
...
rs.Open()

For Each o In orderList
    rs.AddNew()
    rs.Fields("ID").Value = o.ID
    rs.Fields("Sender").Value = o.Sender
    rs.Fields("Receiver").Value = o.Receiver
    ...
Next

在我的测试中,当列表有10000个对象时,它需要相对较长的时间:超过3秒。这很慢,因为订单数量甚至可能超过一百万。我怀疑我是否正确使用RecordSet,因为据我所知,RecordSet通常执行与表的直接连接。一个接一个地分配记录是不对的。但这是我能想到的唯一方法(有些链接暗示了这一点。虽然它没有提到那里的表现)。我们有自己的数据访问层库,并且大多数目标对象始终存在于内存中,这就是我们不希望将RecordSet直接用于数据库的原因。

所以我的问题是,我应该如何修改我的代码以使其快速运行? “来源”不一定需要是List。它可以是任何.NET类型。但目标是我必须有一个RecordSet对象,因为这是另一个组件的输入要求。

2 个答案:

答案 0 :(得分:2)

我不知道有任何捷径;我在我的一个项目中使用了类似的代码。但是,我相当肯定如果你通过索引而不是For循环中的名字引用你的字段,它会运行得更快。

试试这个,看看你是否获得了性能提升:

For Each o In orderList
    rs.AddNew()
    rs.Fields(0).Value = o.ID
    rs.Fields(1).Value = o.Sender
    rs.Fields(2).Value = o.Receiver
    ...
Next

答案 1 :(得分:0)

最后,我使用字段引用来提高性能。在我的原始代码中,至少有一件事可以改进,就是这样的句子rs.Fields("ID").Value = o.ID总是会执行一次耗费一些时间的查找。 @nunzabar建议使用整数索引,我认为这是有道理的。像rs.Fields(0).Value = o.ID之类的东西但是,至少在我的测试中它没有带来任何改进。然后我在循环之前分配字段引用:

Dim f1 As ADODB.Field = rs.Fields.Item("ID")
Dim f2 As ADODB.Field = rs.Fields.Item("Sender")
....
For Each o In orderList
    rs.AddNew()
    f1.Value = o.ID
    f2.Value = o.Sender
    ...
Next

这确实节省了一些时间(大约一半的时间)。

虽然我仍然不确定这是否是使用它的最佳方式,但这是迄今为止我能得到的最佳方式。目前,对于50,000条记录,执行Recordset分配大约需要6秒。不是非常快,所以我们必须限制用户可以获得的最大记录数。