2010-04-29 4 views
2

Access에서 데이터 테이블을 Excel 변수로 가져온 다음이 변수를 통해 쿼리를 실행하여 프로세스 속도를 향상시킬 방법을 찾고 있습니다. C# .NET에서 액세스 데이터베이스의 데이터 테이블을 메모리로 읽어 들인 다음 LINQ를 사용하여이 데이터 집합을 쿼리하려고합니다. 그것은 현재 VBA에서 코딩 된 코드보다 훨씬 빠르며 실제 데이터베이스에 많은 호출을해야합니다. 느린 속도입니다. 언급 된 QueryTable을 보았지만, 데이터를 엑셀 시트에 붙여 넣어야합니다. 나는 모든 것을 메모리에 유지하고 가능한 한 Excel 시트와 VBA 코드 간의 상호 작용을 최소화하고 싶습니다.Excel의 메모리 내 데이터베이스

우리는 Excel + VBA를 사용하여이 작업을 수행 할 필요가 없기를 바랄뿐입니다. 도와 주셔서 감사합니다!

답변

1

에 쓰여진 한 물건의 일부를 읽을 수 있습니다 ADO 레코드 집합으로 읽은 다음 필요할 때마다 레코드 집합에서 필요한 데이터를 가져옵니다. 물론 이것은 읽으려는 테이블의 크기에 달려 있습니다.

+0

주먹을 끈다. 이제 C# 응용 프로그램에서 실행되는 데 약 20 초 밖에 걸리지 않으며 약 2 ~ 3 초가 소요됩니다. Recordset을 쿼리하는 방법을 혼란스럽게 생각합니다 ... Filter 메서드를 읽었지만 아직 성공하지 못했습니다. 이것은 올바른 접근 방식인가? – Frac

+0

레코드 세트는 필요한 모든 데이터를 다루는 하나의 큰 쿼리가있는 경우에만 유용합니다. 그러면 해당 레코드에서 정보를 얻을 수 있습니다. 일반적으로 .GetRows 메서드를 사용하여 배열을 만든 다음 거기에서 조작합니다. –

2

저는 LINQ for VBA와 같은 것을 알지 못합니다.

ADO 연결 옵션을 공개로 유지하면 해당 명령에 대해 명령을 Excecute 할 수 있습니다. LINQ만큼 빠르지는 않지만 모든 호출에 대해 Connection 객체를 만들고 파괴하는 것보다 빠릅니다.

테이블이 너무 크지 않은 경우 적절한 부모/자식 관계가 설정된 VBA에서 사용자 지정 클래스로 테이블을 읽는 경향이 있습니다. 매우 분명한 단점은 SQL을 사용하여 클래스의 데이터 레코드 세트를 가져올 수 없다는 것입니다. 하나 이상의 특정 레코드가 필요할 때 많은 루핑을 사용해야합니다. 즉, 1m 레코드가 있으면 데이터베이스를 호출하는 것이 더 빠를 것입니다.

당신이 마지막에 관심이 있다면, 당신은 내가 여기 http://www.dailydoseofexcel.com/archives/2008/12/07/vba-framework/

http://www.dailydoseofexcel.com/archives/2008/11/15/creating-classes-from-access-tables/

http://www.dailydoseofexcel.com/archives/2007/12/28/terminating-dependent-classes/ (읽기 롭 브루스의 코멘트)

관련 문제