【问题标题】:ADODB.RecordSet assigning value from objects in VB.NET performs badly从 VB.NET 中的对象分配值的 ADODB.RecordSet 表现不佳
【发布时间】:2013-08-21 11:00:47
【问题描述】:

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

【问题讨论】:

    标签: .net ado adodb


    【解决方案1】:

    我不知道有什么捷径;我在我的一个项目中使用了类似的代码。但是,我相当肯定,如果您通过索引而不是 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
    

    【讨论】:

    • 感谢您的回复。实际上在我的测试中使用整数索引不会提高性能,消耗的时间几乎相同。但是,如果我使用字段引用,它会提高性能,就我而言,它节省了大约一半的时间。我是这样做的:在 For Each 循环之前,我声明 Dim f1 As ADODB.Field = rs.Fields.Item("ID"), Dim f2 As ADODB.Field = rs.Fields.Item("Sender"),在循环内部,我可以使用这些引用,例如 f1.value = o.ID f2.value = o.Sender.
    • 不错!您可能希望将其发布为您问题的更新或答案,以便获得更好的可见性。
    【解决方案2】:

    最后我使用字段引用来提高性能。在我的原始代码中,至少有一点可以改进的是,这样的句子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 秒。不是真的超级快,所以我们必须限制用户可以获得的最大记录数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 2020-02-18
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多