Microsoft SQL Server 2005의 저장 프로 시저에 세 개의 SELECT 문을 코딩했습니다. 두 SELECT 문 모두 select 문에 대해 여러 레코드 및 테이블 목록을 반환합니다. 은 다르다. 하나는 마스터 테이블의 레코드이고 다른 하나는 자식 테이블의 레코드입니다. C# 코드에서는 이러한 모든 레코드를 가져와 모든 데이터를 하나의 개체에 넣기를 원합니다. SqlDataReader를 사용하고 있습니다. 그것으로 가능하거나 다른 것을해야합니까?저장 프로 시저에 둘 이상의 SELECT 문이있는 경우 SqlDataReader를 사용하는 방법
답변
데이터 검색기에서 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로 정렬 된 경우 마지막 루프는 사전에서 각 마스터를 한 번만 조회하도록 최적화 할 수 있습니다. 그러나 결과가 작 으면 이득이 그렇게 크지 않을 것입니다.
... 내가이 모든 기록을 얻으려면 하나의 객체에 모든 데이터를 넣어 C# 코드 .IN 마스터 테이블 와 자식 테이블에서 다른 하나 개를 선택 기록 ...
Peter의 솔루션은 하나의 DataReader
을 사용하여 여러 결과를 검색하는 기본적인 문제를 해결합니다. 그러나 마스터 - 세부 테이블 간의 관계를 복제하는 개체에 데이터를 저장하려면 대신 DataSet
을 사용해야합니다.
데이터 세트는 DataTable
을 여러 개 포함 할 수 있으며 테이블간에 고유 한 관계를 완벽하게 지원하여 테이블간에 DataRelation
을 만들 수 있습니다. 그런 다음 마스터 또는 세부 정보 테이블에서 GetChildRows()
또는 GetParentRows()
을 각각 호출하여 각 시나리오에 대한 관련 레코드를 가져올 수 있습니다.
이렇게하는 방법을 설명하는 온라인 샘플이 많이 있습니다. 내 그룹의 Here's one discussion thread에서 단계를 나열하고 절차를 시연 할 수있는 몇 가지 코드를 제공했습니다.
감사합니다. 자, 내가 시작한 것을 끝냈습니다 :) –
좋은 답변이지만 질문의 일부를 답장하지 않고 남겨두고 있다고 생각합니다. ;-) – Cerebrus