1

.NET クラス オブジェクトから ADODB.RecordSet を割り当てる必要がありますが、正しく行っているかどうかわかりません。class のオブジェクトで構成される 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 秒以上です。注文数が 100 万を超える場合もあるため、これは遅いです。RecordSet私が学んだ限りではRecordSet、テーブルへの直接接続を通常実行しているため、適切に使用しているとは思えません。レコードを 1 つずつ割り当てるのは適切ではありません。しかし、これが私が思いつくことができる唯一の方法です(そして、いくつかのリンクはこれを示唆しています。そこでのパフォーマンスについては言及していませんが)。独自のデータ アクセス レイヤー ライブラリがあり、ほとんどのターゲット オブジェクトは常にメモリ内に存在します。そのため、RecordSet を直接データベースに使用したくありません。

私の質問は、コードを高速に実行するにはどのように変更すればよいですか? 「ソース」は必ずしもList. 任意の .NET タイプにすることができます。しかし、RecordSetそれは別のコンポーネントからの入力要件であるため、オブジェクトが必要です。

4

2 に答える 2

0

最後に、フィールド参照を使用してパフォーマンスを向上させます。私の元のコードでは、改善できることの少なくとも 1 つは、そのようなセンテンス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 に答える