저장 프로 시저에서 하나 이상의 선택 문장이있는 경우 SQLDATAREADER 사용 방법

StackOverflow https://stackoverflow.com/questions/741625

문제

Microsoft SQL Server 2005에서 저장 프로 시저에서 세 가지 선택 문을 코딩했습니다. 두 선택 문서는 여러 레코드의 레코드 수를 반환하고 선택 문은 다릅니다. 하나는 마스터 테이블에서 레코드를 선택하고 다른 하나는 자식 테이블에서 레코드를 선택합니다. C# 코드에서는이 모든 레코드를 가져 와서 모든 데이터를 하나의 객체에 넣고 싶습니다. 나는 sqldatareader를 사용하고 있습니다. 그것으로 가능합니까 아니면 다른 일을해야합니까?

도움이 되었습니까?

해결책

너는 사용한다 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에 정렬되면 마지막 루프는 사전에서 각 마스터를 한 번만 조회하도록 최적화 될 수 있습니다. 결과 집합이 작 으면 이득이 크지 않을 것입니다.

다른 팁

... 마스터 테이블 및 기타 하위 테이블에서 하나의 선택 레코드.

Peter의 솔루션은 단일로 여러 결과를 검색하는 기본 문제를 해결하기 위해 작동합니다. DataReader. 그러나 데이터를 마스터-파괴 테이블 사이의 관계를 복제하는 개체에 데이터를 저장하려면 DataSet 대신에.

데이터 세트에는 여러 가지가 포함될 수 있습니다 DataTableS 및 생성을 허용함으로써 테이블 간의 고유 한 관계에 대한 완전한 지원을 제공합니다. DataRelation테이블 사이. 그런 다음 전화하여 각 시나리오에 대한 관련 레코드를 얻을 수 있습니다. GetChildRows() 또는 GetParentRows() 마스터 또는 세부 사항 테이블에서 각각.

이 작업을 수행하는 방법을 설명하는 온라인 샘플이 많을 것입니다. 다음은 하나의 토론 스레드입니다 단계를 나열하고 절차를 시연하기위한 코드를 제공 한 내 그룹에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top