2011-03-18 5 views
2

VB 6.0 응용 프로그램을 사용하여 Adodb 레코드 집합을 내보내려고합니다. For Loop로 할 수 있습니다. 그러나 레코드 세트에는 100,000 개의 열과 200,000 개의 행이 포함되어 있습니다. 엄니를 완성하는 데 엄청난 시간을 소비하고 있습니다. 같은 결과를 얻을 수있는 빠른 방법이 있습니까? 감사의 말레코드 집합을 Excel로 내보내기

답변

1

ADODB.Recordset 개체의 성능을 크게 향상시킬 수있는 몇 가지 방법이 있습니다. 당신이 Recordset.Field.Value 참조에 후기 바인딩을 피하기 때문에

Dim rs As New ADODB.Recordset 
Dim fldLastName As ADODB.Field, fldFirstName As ADODB.Field 

rs.Open "SELECT au_lname, au_fname FROM authors", "DSN=pubs", , , adCmdText 

Set fldLastName = rs.Fields("au_lname") 
Set fldFirstName = rs.Fields("au_fname") 

Do Until rs.EOF 
    csvOutput = csvOutput & fldLastName & "," & fldFirstName & vbCrLf 
    rs.MoveNext 
Loop 
rs.Close 

이 정말 물건 속도를 높일 수 있습니다 : 나는 일을 속도를 사용했습니다 최고의 팁 중 하나는 루프에서 명시 적 field 객체를 생성하는 것입니다 항목. 시도 해보면 성능이 크게 향상됩니다. 내가 설명했던 것과 같은 대형 레코드 세트로 작업했으며이 기술을 사용하여 성능을 견딜 수있게 만들었습니다.

그런데 여기 ADODB 코드의 성능을 향상시키는 데 도움이되는 몇 가지 팁이있는 MSDN의 우수 기사가 있습니다 (ADO Performance Best Practices). 이 기사는 꽤 오래되었지만 몇 년 만에 다시 읽은 후에도 여전히 적용될 것이라고 생각합니다.

+0

왜 당신은 단순히 예를 들어, Recordset 개체의'GetString' 메소드를 호출보다 csvOutput' 200K 시간 '의'딥 카피 '를 만드는 것을 포함 루프가 더 잘 수행 할 생각하십니까 'csvOutput = rs.GetString (,, ",", vbCrLf)'는 200K가 아닌'csvOutput'에 대한 하나의 할당만을 의미합니다. – onedaywhen

1

제안 :

Excel 개체 모델은 CopyFromRecordset 방법이있다. Excel이 될 수 Transpose 워크 시트 기능이 -

레코드 객체를 사용하면 엑셀 Range 객체의 Value 재산 ('트랜스'행과 그 반대로 = 컬럼에 '트랜스'할 수있는 배열을 반환하는 GetRows 방법이있다 오브젝트 모델을 개입시켜 불려갑니다).

Excel 2007 이전에는 워크 시트가 65,536 행으로 제한되어 있었고 위에서 언급 한 Excel 방법도 비슷하게 제한 될 수 있습니다.

Recordset 개체는 모든 행을 한 번에 문자열에 쓰고 (루프 할 필요가 없음) GetString 메서드를 사용합니다.

레코드 집합을 완전히 무시하고 Access SQL (ACE, Jet 등)을 사용하여 Excel에 직접 데이터를 쓸 수 있습니다.

SELECT * 
    INTO [Excel 8.0;DATABASE=C:\MyNewWorkbook.xls].MyNewTable 
    FROM [ODBC;Driver={SQL Server};Server=MyServer;Database=MyDB;UID=Admin;PWD=***].MyDBTable; 
+0

꽤 굉장합니다. 저는 항상 루프 기법을 사용하여 꽤 행복했지만 여러분이 제시하는 옵션은 훨씬 좋아졌습니다. –