2013-08-19 1 views
1

.NET 클래스 개체에서 ADODB.RecordSet을 할당해야하고 올바르게 수행하고 있는지 확실하지 않습니다. 클래스 Order의 객체로 구성된 orderList라는 List가 있고이 목록에서 RecordSet을 생성해야한다고 가정합니다 (참조로 adodb가 있습니다). 내 코드는 다음과 같습니다 :VBOD에서 개체의 값을 할당하는 ADODB.RecordSet의 성능이 좋지 않음

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

내가 성능을 향상하기 위해 필드 참조를 사용하여 결국합니다. 필자의 원래 코드에서는 개선 할 수있는 최소한 한 가지가 있습니다. 그러한 문장 인 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 레코드의 경우 레코드 세트 할당을 수행하는 데 약 6 초가 걸립니다. 정말 빠르지는 않으므로 사용자가 얻을 수있는 최대 레코드 수를 제한해야합니다.

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 
+0

답장을 보내 주셔서 감사합니다. 실제로 정수 인덱스를 사용하는 테스트에서 성능이 향상되지는 않지만 소비되는 시간은 거의 같습니다. 그러나 필드 참조를 사용하면 성능이 향상되지만 내 경우에는 절반 정도의 시간이 절약됩니다. 이것은 내가하는 방법입니다 : For Each 루프 전에, 나는 ADODB.Field = rs.Fields.Item ("ID"), Dim f2 ADODB.Field = rs.Fields.Item ("Sender")와 같이 Dim f1을 선언합니다. 루프 내부에서 f1.value = o.ID f2.value = o.Sender와 같은 참조를 사용할 수 있습니다. – tete

+0

니스! 질문에 대한 업데이트 또는 답변으로 게시하여 더 나은 가시성을 얻을 수 있습니다. – nunzabar