2009-04-02 2 views
2

SQL을 Access로 내보내는 데 exe를 사용하고 있습니다. 여러 뷰를 내보내는 여러 클라이언트가 있고 DTS 패키지를 설정하고 유지 관리하는 오버 헤드가 너무 많아서 DTS를 사용하고 싶지 않습니다. .MS Access interop - 데이터 가져 오기

* 편집 :이 프로세스는 매일 밤 많은 클라이언트가 자동화하므로 전체 프로세스를 시작하고 저장 프로 시저의 커서 내에서 제어해야합니다. 내보내기를 위해 프로젝트별로 데이터를 필터링해야하기 때문입니다.

나는 액세스 및 가장 유망한가 상호 운용성 Access를 사용하고 내가보기에서 가져 오기를하고 문제를 명중 가지고

doCmd.TransferDatabase(Access.AcDataTransferType.acImport... 

를 실행하고 있으며, 실행에 SQL에서 데이터를 얻을 수있는 많은 방법을 시도 가져 오기를 수동으로 수행하면보기가 데이터를 충분히 빨리 반환하지 않기 때문에 액세스가 시간 초과되었음을 알리는 MessageBox 대화 상자를 팝업합니다. 나는 이것이 interop에서도 일어난다 고 생각하지만, 숨겨져 있기 때문에 그 방법은 결코 돌아 오지 않는다!

이 메시지가 나타나지 않도록하거나 가져 오기 명령의 시간 초과를 늘릴 수있는 방법이 있습니까?

현재의 공격 계획은 뷰를 테이블로 전개 한 다음 해당 테이블에서 가져온 다음 병합 된 테이블을 삭제하는 것입니다.

이 문제를 해결하는 방법에 대한 제안 사항에 만족합니다.

편집 : 내가 뭐하는 거지에

추가 정보 :

우리는 각각의 표준 데이터 모델이 여러 클라이언트가 있습니다. '모듈'중 하나는 액세스 내보내기 (sproc)입니다. 매개 변수 테이블에서 내보낼 뷰를 읽고 내 보낸다. 보기는 프로젝트별로 필터링되며 각 프로젝트 (모든보기에는 프로젝트 필드가 있음)에 대한 액세스 파일이 생성됩니다.

SQL 2005를 실행 중이며 SQL 2005로 빨리 이동하지는 않습니다. 몇달.

그런 다음 각 데이터베이스에서 구성된 모듈을 실행하는 모듈 실행 작업이 있습니다. 이 모듈 실행에서 실행되는 많은 가져 오기/내보내기/다른 작업이 있으며 액세스 내보내기가이 프레임 워크에 적합해야합니다. 그래서 우리의 매개 변수 프레임 워크를 통해 구성 할 수있는 일반 SQL -> 액세스 내보내기가 필요합니다.

현재 sproc은 내가 작성한 exe를 호출하고 interop를 통해 내 exe 액세스를 엽니 다. 서버에 문제가 있다는 것을 알고 있지만 모듈 실행은 한 번에 하나의 모듈 만 실행하므로 프로 시저가 실행됩니다. 한 번에 두 개 이상의 인스턴스를 실행하지 마십시오.

답변

1

내가 할 수있는 방법에 정착 한 실행을 떠날 수 있었다.

http://support.microsoft.com/kb/317114은 액세스 프로세스를 시작하는 기본 단계를 설명합니다.

프로세스를 ShellGetApp 메서드의 로컬 변수 대신 클래스 변수로 변경했습니다. 이 방법은 Quit 함수를 호출 할 때 어떤 이유로 든 닫지 않으면 프로세스를 명시 적으로 종료 할 수 있습니다.

app.Quit(Access.AcQuitOption.acQuitSaveAll); 
if (!accessProcess.HasExited) 
{ 
    Console.WriteLine("Access did not exit after being asked nicely, killing process manually"); 
    accessProcess.Kill(); 
} 

그런 다음 여기에 시간 초과 함수를 사용하여 액세스 호출에 시간 초과를 지정했습니다. 이 시간 초과 나뿐만 아니라 액세스 프로세스를 종료 할 수있는 경우 (타임 아웃이 대화 창에 팝업 때문에 수 내가 프로세스가 영원히 정지하고 싶지 않다. 나는 여기에 시간 제한 방법을 얻었다.

Implement C# Generic Timeout

1

VBA를 사용해 보셨습니까? 연결을 구성하는 옵션이 더 많습니다. 이전에는이 ​​컨텍스트에서 시간 초과 조정을 사용 했었습니다.

또한 일반적으로보기를 직접 쿼리하는 것이 가장 간단하다는 것을 알았습니다 (아무 것도 사용할 수 없거나 전송하는 데 오랜 시간이 걸릴 수있는 한). 중간 임시 테이블을 만드는 것이 좋은 이유 일 수 있습니다.

이 항목에 대해 단일 사용자 모드에서 Acces를 명시 적으로 여는 것이 도움이 될 수 있습니다.

+0

방금 ​​내 질문을 편집 했으므로 저장 프로 시저에서 프로세스를 자동화해야합니다. 또한 VBA는 액세스 interop을 사용합니다. 이는 outlook/Excel과 비교하여 매우 제한되어 있으므로 VBA와 마찬가지로 Com interop을 통해 수행 할 수 있어야합니다. 중급 테이블 내가 노크와 함께 실행할 수 있습니까? –

+0

Interop을 통해 DoCmd가 기본적으로 Access Querydefs, 매크로 및 메뉴 항목을 호출한다는 것을 의미하는 것으로 생각한다면 Access VBA는 훨씬 더 많은 작업을 수행합니다. DoCmd가 유용하다는 사실을 결코 발견하지 못했습니다. 또 다른 확실한 명제는 SQL의 커서를 사용하여 Access 인스턴스를 실행하는 것입니다. 나는이 올바른 것을 이해하고 있는가? – dkretz

+0

나는 당신이 원하는대로 그것을 할 수 있도록 도와 줄 것이다. 그러나 나는 상황에 대한 이유와 사물의 이유를 이해할 필요가있다. – dkretz

1

ADO를 사용하여 원본 데이터와 대상 데이터에 모두 연결했습니다.필요에 따라 연결 및 명령 시간 초과 값을 설정하고 각 레코드 세트를 읽고 추가 할 수 있습니다.

없음 특히 빠른 없지만, 우리는 하룻밤

+0

아 그래, 나는 또한이 실행을 가지고 있었지만 우리가 내보내는 테이블 중 일부는 1 백만 행 이상을 반환합니다 (6 밀리를 반환하는 테이블을 가짐). 그래서이 방법이 너무 느립니다. –

0

을 이 책을 읽는 다른 사람들을 위해 SSIS가이 문제를 해결할 수있는 해결책을 제시했음을 언급 할 것입니다 .SIS와 DTS의 차이점은 꽤 많이 있습니다. 일

각 클라이언트에 대해 다른보기 집합을 내보낼 수 있도록 내보내기 프로세스를 매개 변수화하는 것은 어렵지 않습니다 .t가있는 텍스트 파일의 줄을 반복 할 수 있습니다 보기 이름을 입력하거나 구성 데이터베이스에 대한 쿼리를 사용하여보기 목록을 가져옵니다. 다른 매개 변수는 클라이언트 별 및/또는보기 별 기준으로 동일한 구성 데이터베이스에서 가져올 수 있습니다.

자식 프로세스 또는 pacakge (구성된 경우)를 실행하여 클라이언트 별 사전 및 사후 처리를 수행하는 옵션도있을 수 있습니다.

관련 문제