2009-04-12 6 views
6

Microsoft SQL Server 2005의 저장 프로 시저에 세 개의 SELECT 문을 코딩했습니다. 두 SELECT 문 모두 select 문에 대해 여러 레코드 및 테이블 목록을 반환합니다. 은 다르다. 하나는 마스터 테이블의 레코드이고 다른 하나는 자식 테이블의 레코드입니다. C# 코드에서는 이러한 모든 레코드를 가져와 모든 데이터를 하나의 개체에 넣기를 원합니다. SqlDataReader를 사용하고 있습니다. 그것으로 가능하거나 다른 것을해야합니까?저장 프로 시저에 둘 이상의 SELECT 문이있는 경우 SqlDataReader를 사용하는 방법

답변

17

데이터 검색기에서 the NextResult 메서드를 사용하면 쿼리의 여러 결과를 탐색 할 수 있습니다. 배경으로 그와 그래서

var moreResults = true; 
while (moreResults) 
{ 
    while (reader.Read()) 
    { 
    ... 
    } 
    moreResults = reader.NextResult(); 
} 

를, 마스터없는 결과는 첫째, 채우기 마스터 및 세부 목적은 다음과 같이 할 수 온다 가정하면 : 모든 데이터를 통해

반복하려면

당신은 같은 것을 할 것

을 ,

var masters = new Dictionary<int, Master>(); 

var idOrdinal = reader.GetOrdinal("id"); 
while (reader.Read()) 
{ 
    var id = reader.GetInt32(idOrdinal); 
    masters.Add(id, new Master{Id=id, ....}); 
} 

다음 세부 레코드로 이동하고 해당 주인에게 그 추가 :

첫째, 마스터 레코드의 사전을 구축

reader.NextResult(); 

var masterIdOrdinal = reader.GetOrdinal("masterId"); 
while (reader.Read()) 
{ 
    var masterId = reader.GetInt32(masterIdOrdinal); 

    var master = masters[masterId]; 
    master.Details.Add(new Detail{....}); 
} 

분명히 열 이름을 데이터에있는 이름으로 대체하고 마스터 및 상세 개체의 전체 초기화를 제공해야합니다. 세부 결과 집합이 마스터 ID로 정렬 된 경우 마지막 루프는 사전에서 각 마스터를 한 번만 조회하도록 최적화 할 수 있습니다. 그러나 결과가 작 으면 이득이 그렇게 크지 않을 것입니다.

+0

좋은 답변이지만 질문의 일부를 답장하지 않고 남겨두고 있다고 생각합니다. ;-) – Cerebrus

2

... 내가이 모든 기록을 얻으려면 하나의 객체에 모든 데이터를 넣어 C# 코드 .IN 마스터 테이블 와 자식 테이블에서 다른 하나 개를 선택 기록 ...

Peter의 솔루션은 하나의 DataReader을 사용하여 여러 결과를 검색하는 기본적인 문제를 해결합니다. 그러나 마스터 - 세부 테이블 간의 관계를 복제하는 개체에 데이터를 저장하려면 대신 DataSet을 사용해야합니다.

데이터 세트는 DataTable을 여러 개 포함 할 수 있으며 테이블간에 고유 한 관계를 완벽하게 지원하여 테이블간에 DataRelation을 만들 수 있습니다. 그런 다음 마스터 또는 세부 정보 테이블에서 GetChildRows() 또는 GetParentRows()을 각각 호출하여 각 시나리오에 대한 관련 레코드를 가져올 수 있습니다.

이렇게하는 방법을 설명하는 온라인 샘플이 많이 있습니다. 내 그룹의 Here's one discussion thread에서 단계를 나열하고 절차를 시연 할 수있는 몇 가지 코드를 제공했습니다.

+0

감사합니다. 자, 내가 시작한 것을 끝냈습니다 :) –