2012-08-07 4 views
2

이것이 ADO.NET에서 가능할 지 모르겠지만 여전히 전문가가 실행하고 싶습니다.다중 연결 문자열

나는 다음과 같은 SQL 쿼리가 :

select a.name, b.id 
from datasource1_table a, datasource2_table b 
where a.id=b.id 

1) datasource1_table - SQL 서버 "SQLServer1"연결을

2) datasource2_table - SQL 서버 "SQLServer2"연결

그래서 내가 연결이 두 서버 모두에 대한 로그인이있는 문자열. 위의 SQL을 한 번에 실행하고 싶습니다.

가능합니까?

추가 정보 나 설명이 필요한 경우 알려주십시오.

미리 감사드립니다.

+0

동일한 데이터베이스 서버에있는 테이블이 있습니까? 아니면 완전히 다른 서버에 있습니까? 다른 서버에있는 경우 두 데이터베이스의 데이터를 별도로 선택하지 않고 DataTables를 통해 메모리에 합류하지 않으면 매우 어렵습니다. – dash

+0

서버는 다른 위치에 있으며 오라클, SQL 서버 또는 MySQL과 같은 dbtype 일 수 있습니다. –

답변

4

정확하게는 아닙니다. 하나의 SqlConnection과 SqlCommand 만 연결할 수 있습니다. 할 수있는 일은 SQLServer2를 가리키는 SQLServer1에 linked server을 만드는 것입니다. 그러면 다음과 같이 참조 할 수 있습니다.

select a.name, b.id 
from datasource1_table a, myLinkedServer.myDb.dbo.datasource2_table b 
where a.id=b.id 

참고로 실제 조인을 사용하도록 현재 구문이 변경됩니다.

연결된 서버가 옵션이 아닌 경우 두 개의 쿼리를 실행하고 결과를 처리해야 할 수 있습니다.

+0

실제로 링크 된/원격 서버는 유지 관리가 더 복잡 할 수 있지만 과도하게 복잡 할 수는 있습니다. 나는 DBA가 그들을 세우지 않을 많은 곳에서 일 해왔다. – dash

+0

감사합니다. 링크 된 서버는 옵션이 아닙니다. mysql, sql server 또는 oracle과 같은 모든 db 유형에서도 연결할 수 있습니다. –

+0

연결된 서버가 없으면 두 개의 별도 쿼리를 실행 한 다음 결과를 처리해야한다고 생각합니다. –

0

하나의 서버를 sp_linkedserver를 사용하여 다른 서버에 추가 할 수 있습니다. 그런 다음 일반 ado.net 연결 및 쿼리를 사용하십시오.

SELECT * FROM OPENQUERY (LinkedServerName,'SELECT * FROM myDatabase.Customer') 

그렇지 않습니까? 당신이 연결된 서버를 사용할 수없는 점을 감안

+1

또는 두 개의 연결로 Nhibernate를 사용하십시오. 자세한 내용은 http://mikehadlow.blogspot.com/2008/10/mapping-entities-to-multiple-databases.html을 참조하십시오 – brainboost

+0

좋은 소식입니다. 하지만 내 프로세스가 다른 서버의 여러 데이터 소스에 연결할 수 있습니다. "동일한 서버에있는 한 데이터베이스를 통해 조인을 수행하는 NHibernate" –

1

, 당신은 DataRelation 클래스 귀하의 예에서

을 조사 두 SELECT의를 수행 할 수 있습니다

DataSet domain = new DataSet(); 

DataTable dataFromA = null; 
DataTable dataFromB = null; 

using(SqlConnection conn1 = new SqlConnection("FirstConnectionString")) 
{ 
    DataTable dataFromA = //result from SELECT id, name FROM TableA 
} 


using(SqlConnection conn2 = new SqlConnection("SecondConnectionString")) 
{ 
    DataTable dataFromB = //result from SELECT id, name FROM TableB 
} 

domain.Tables.Add(dataFromA); 
domain.Tables.Add(dataFromB); 

내가 여기 과정을 부연했다.

당신이 메모리에 모두 데이터 테이블이 있으면, 당신은 그들 사이하여 DataRelation 만들 수 있습니다 : 당신은 당신이 원하는 어쨌든이 relationship을 explot 수

DataRelation idRelationship = new DataRelation("ABLink", dataFromA.Columns["Id"], dataFromB.Columns["Id"]); 

을 :

foreach(DataRow aRow in dataFromA.Rows) 
{ 
    //matching B Rows: 
    DataRow[] bRows = aRow.GetChildRows(idRelationship); 
} 

이 효과적으로 인 -입니다 두 테이블 사이의 메모리 인덱스.

+0

대쉬 - 샘플을 가져 주셔서 감사합니다. –

+0

@MuraliBala 우리는 Linked Server를 사용할 수 없기 때문에 이미 똑같은 일을합니다. 알고 있어야 할 점은 큰 테이블에서는 메모리가 문제가된다는 것입니다. 이 경우 두 개의 DataReader를 사용할 수 있습니다. 하나는 첫 번째 서버에 대한 연결에서 테이블을 반복하고 다른 하나는 두 번째 서버에 대한 연결에서 테이블을 반복합니다. – dash

+0

감사합니다. @ 대시 –

0

나는 지금과 같은 상황이었습니다. DBA는 내가 링크 서버를 사용하는 것을 허용하지 않았습니다.

따라서 솔루션으로 두 개의 서로 다른 데이터베이스 서버에 연결하고 메모리에 레코드 세트를 가져 오는 WCF 서비스를 구현했습니다. 두 데이터베이스의 데이터가 메모리에 저장되면 우리는이 데이터베이스를 가지고 놀 수 있습니다.

메모리를 모두 차지하면서 처리중인 데이터의 양을 고려해야합니다. 데이터를 최소화하기 위해 필요한 데이터 만 검색 할 수 있습니다 (예 : select *를 사용하지 마십시오).