1

我们需要从我们的 .NET 类对象中分配一个 ADODB.RecordSet,我不确定我是否做得对。假设我有一个名为 orderList 的列表,它由 class 的对象组成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对象,因为这是另一个组件的输入要求。

4

2 回答 2

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
于 2013-08-20T11:46:45.830 回答
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 秒。不是真的超级快,所以我们必须限制用户可以获得的最大记录数。

于 2013-08-20T12:33:24.147 回答