2008-10-27 3 views
5

두 데이터베이스가 있습니다. 하나는 MS Access 파일이고 다른 하나는 SQL Server 데이터베이스입니다. Access 데이터베이스의 데이터를 기반으로 SQL Server 데이터베이스의 데이터를 필터링하는 SELECT 명령을 만들어야합니다. ADO.NET으로이를 수행하는 가장 좋은 방법은 무엇입니까?여러 데이터베이스에서 상호 참조

각 데이터베이스에서 필요한 데이터를 두 개의 새 테이블로 가져올 수 있습니까? 단일 Dataset에 이것을 넣으십시오. 그런 다음 데이터 집합에서 다른 SELECT 명령을 수행하여 데이터를 결합합니까?

추가 정보 : Access 데이터베이스가 영구적이지 않습니다. 사용할 Access 파일은 런타임에 사용자가 설정합니다.

다음은 왜 두 개의 데이터베이스가 있는지 설명하기위한 배경 정보입니다. 우리 회사는 CAD 프로그램을 사용하여 건물을 설계합니다. 이 프로그램은 CAD 모델에서 사용 된 재료를 Access 데이터베이스에 저장합니다. 각 모델마다 하나의 파일이 있습니다. 각 모델에 대한 원가 계산 정보를 생성하는 프로그램을 작성 중입니다. 이것은 SQL Server 데이터베이스에 저장된 현재 자재 가격을 기반으로합니다.


난 그냥 SQL 서버 DB의 임시 테이블에 액세스 DB에서 데이터를 가져 결국

내 솔루션. 필요한 모든 처리를 수행 한 다음 임시 테이블을 제거하십시오. 그것은 꽤 해결책이 아니었지만 효과가있었습니다.

답변

3

당신은 당신이 할 필요가없는 경우에서 모두 데이터 집합을 끌어 싶지 않아요. 파일 위치가 변경 될 수 있고 서버 자체에서 쉽게 사용할 수 없기 때문에 Tomalak의 솔루션을 구현하는 데 문제가있을 수도 있습니다.

내 생각 엔 사용자가 사람들/제품 또는 그들이 관심이있는 것이 무엇이든간에 Access 데이터베이스를 설정했기 때문에 두 데이터베이스에서 선택해야하는 이유입니다. 이 경우 Access 테이블이 SQL Server 테이블보다 작을 수 있습니다. 가장 좋은 방법은 Access 데이터를 가져 와서 SQL Server에 대한 필터링 된 쿼리를 생성하여 네트워크를 통해 전송되는 데이터를 최소화 할 수 있도록하는 것입니다.

그래서, 가장 중요한 사항은 다음과 같습니다

  1. 필터 데이터는 서버에 네트워크 트래픽을 최소화 할 수있는 데이터베이스가
  2. ADO.NET보다 필터링에 빠르게 될 것입니다도 있기 때문에 애플리케이션으로 가져 오기 위해 데이터 세트를 선택해야하는 경우 작은 데이터 세트를 가져온 다음 다른 데이터 세트를 필터링하는 데 사용하십시오.
+0

동의. 각 클라이언트에 Access 데이터베이스가 있기 때문에 많은 '임시'연결된 서버를 설정하는 것은 무리가 있습니다. – neonski

+0

각 Access 데이터베이스마다 다른 데이터가 있습니까? 그렇다면이 설정을 설계 한 바보는 누구입니까? –

+0

사실 드문 일이 아닙니다. 모든 판매를하는 기업 데이터베이스가 있지만 동부 해안 지역 관리자는 동부 해안 클라이언트가있는 액세스 데이터베이스를보고에 사용합니다. 또는 통계 팀이보고있는 사람을 좁히고 있습니다. –

0

먼저 서버에서 작업해야합니다. Access DB를 "링크 된 서버"로 참조하십시오.

그런 다음 원하는대로 데이터를 가져 오거나 채우면 SQL 서버에서 쿼리 할 수 ​​있습니다. 이 웹 페이지는 어떻게하는지에 대한 좋은 개요를 제공합니다.

http://blogs.meetandplay.com/WTilton/archive/2005/04/22/318.aspx

0

ODBC를 통해 액세스 프런트 엔드에서 SQL Server로 연결하고 양쪽 테이블이 로컬 인 것처럼 SQL을 작성하면 어떻게됩니까? 그런 다음 서버에서 추적을 수행하여 Jet이 서버로 보내는 것을 정확히 볼 수 있습니다. 이런 종류의 제트기가 얼마나 효율적인지에 놀랄 수 있습니다. 키 입력란 (예 :, 및 SQL Server 여부에 관계없이 ID 필드), Jet가 ID 목록을 보내는 경우가있을 수 있습니다. 또는 SQL을 작성하여 (WHERE 절에서 IN SELECT ...를 사용하여) 그렇게 할 수 있습니다.

기본적으로 얼마나 효율적인지는 WHERE 절이 실행될 위치에 따라 달라집니다. 예를 들어, 단일 필드에서 연결된 SQL Server 테이블을 사용하여 로컬 Jet 테이블에 가입하고 로컬 테이블의 값을 기반으로 결과를 필터링하는 경우 Jet에서 수행 할 수있는 유일한 작업은 매우 효율적입니다. SQL Server 테이블을 필터링하는 데 필요한 것은 무엇이든간에 서버로 보내야합니다.

다시 말하지만, 사용자가하려는 정보 (예 : 필터링 할 입력란)에 따라 달라집니다. 그러나 Jet에게 그것이 똑똑한 지 알 수있는 기회를주십시오. Jet이 그것을 망칠 박쥐를 추측하는 것과는 대조적입니다. Jet가 효율적으로 작동하게하려면 약간의 조정이 필요하지만 클라이언트 쪽 로직을 모두 유지할 수 있다면 서버의 모든 Access 데이터베이스를 추적하는 것보다 훨씬 편할 것입니다.

0

질문을 올바르게 읽으면 여러 데이터베이스에서 상호 참조를 시도하지 않습니다.

특정이 경우에 포함 할 수 FILE,에 대한 세부 정보를 참조 할 단지 필요가

:

기본 키, 부모 파일 체크섬 (이 수정 인 경우), 파일 체크섬, 마지막으로 알려진 저자, 개정 번호 , 마지막 변경 날짜 ...

그리고 그 기본 키는 프로그램을 사용하여 해당 파일을 분석하여 얻은 정보를 추가 할 때 사용됩니다.

실제로 분산 데이터베이스가 필요한 경우 LDAP와 같은 비 관계형 데이터베이스를 사용하는 것이 좋습니다.

LDAP를 사용할 수 없지만 관계형 데이터베이스를 사용해야하는 경우 GUID를 사용하여 기본 키가 양호한 지 확인하십시오.

0

정보가 충분하지 않기 때문에 몇 가지 가정을해야 할 것입니다.

가정 :

  1. SQL 서버와 Access 데이터베이스 같은 컴퓨터
  2. SQL 서버는 파일 공유를 통해 Access 데이터베이스를 볼 수 없습니다하거나이를 너무 어려울 것에 없습니다. 당신은 할 필요가 없습니다
  3. 는 액세스 데이터베이스와 만의 조회 요소로 TEH 액세스 데이터베이스에서 데이터를 사용하는 SQL 서버 간의 조인하여 WHERE 절

위의 가정이 맞다면, 당신은 할 수 단순히 ADO를 사용하여 Access 데이터베이스를 열고 필요한 데이터를 검색 할 수 있습니다. 가능하면 데이터 집합이나 데이터 테이블에 있습니다. 그런 다음 필요한 데이터를 추출하고이를 동적 Where 절, 준비된 명령문 또는 저장 프로 시저에 대한 매개 변수를 통해 SQL Server에 대한 다른 ADO 쿼리에 공급합니다.

사람들이 제공하는 다른 솔루션은 모두 데이터에 조인을하거나 두 데이터베이스를 모두 포함하는 SQL을 실행해야한다고 가정합니다. 그렇게하려면 링크 된 데이터베이스를 사용해야하며, 그렇지 않으면 테이블에 데이터를 가져와야합니다 (임시로).

1

SQL Server가 Access 데이터베이스에 액세스 할 수 있다고 가정하면이 데이터베이스에 대해 OPENROWSET 쿼리를 구성 할 수 있습니다.

SELECT a.* 
FROM SqlTable 
JOIN OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0', 
    'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'', 
    Orders 
) as b ON 
    a.Id = b.Id 

당신은 다른 MDB를에 도착하는 런타임에 Access 데이터베이스의 경로를 변경합니다.

관련 문제