我们需要从.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
对象,因为这是另一个组件的输入要求。
答案 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秒。不是非常快,所以我们必须限制用户可以获得的最大记录数。