Dapper 오류 : 각 그리드는 한 번만 반복 할 수 있습니다.

dapper

문제

내 코드는 다음과 같습니다.

   try
        {
            SqlConnection mapperConnection = SqlAccessHelper.SqlHelper.GetOpenConnection(SqlConnectionHelper.SqlConnectionString());
            var parameters = new DynamicParameters();
            parameters.Add("@P_MarketId", marketId, DbType.Int32);
            parameters.Add("@P_Output", dbType: DbType.Int32, direction: ParameterDirection.Output);

            using (var multi = mapperConnection.QueryMultiple("USP_FetchMarketRecords", parameters, (SqlTransaction)null, 1000000, CommandType.StoredProcedure))
            {
                    IEnumerable<MarketRecord.FItem> FItem = multi.Read<MarketRecord.FItem>();                        
                    IEnumerable<MarketRecord.FSubsystem> FSubsystem = multi.Read<MarketRecord.FSubsystem>();
                    objCResponseVO.addObject("FItem",FItem);
                    objCResponseVO.addObject("FSubsystem",FSubsystem);
            }
        }
        catch (Exception ex) {
            throw ex;
        }

처음에는 괜찮습니다. FSubsystem에 대한 두 번째 읽기에서는 "각 그리드는 한 번만 반복 할 수 있습니다"라는 예외를 제공합니다. 여기 뭐가 잘못 됐니? IEnumerable Read () 메서드를 두 번째 읽기 동안 읽었을 때 공개 속성에서 추적했을 때 true입니다. 나는 이것을 어떻게 극복 할 수 있습니까?

수락 된 답변

기본 데이터 판독기는 전달 전용 장치입니다. 두 번째 Read 를 호출 하면 독자가 다음 표로 앞으로 이동합니다 . 각 그리드는 전달 전용 방식으로 사용해야합니다. 예를 들어 명령문을 재정렬 할 수 있습니다.

using (var multi = mapperConnection.QueryMultiple("USP_FetchMarketRecords",
    parameters, (SqlTransaction)null, 1000000, CommandType.StoredProcedure))
{
        IEnumerable<MarketRecord.FItem> FItem =
            multi.Read<MarketRecord.FItem>();                        
        objCResponseVO.addObject("FItem",FItem);

        IEnumerable<MarketRecord.FSubsystem> FSubsystem =
            multi.Read<MarketRecord.FSubsystem>();            
        objCResponseVO.addObject("FSubsystem",FSubsystem);
}

또는 버퍼링 할 수 있습니다.

using (var multi = mapperConnection.QueryMultiple("USP_FetchMarketRecords",
    parameters, (SqlTransaction)null, 1000000, CommandType.StoredProcedure))
{
        IEnumerable<MarketRecord.FItem> FItem =
            multi.Read<MarketRecord.FItem>().ToList();
        IEnumerable<MarketRecord.FSubsystem> FSubsystem =
            multi.Read<MarketRecord.FSubsystem>().ToList();
        objCResponseVO.addObject("FItem",FItem);
        objCResponseVO.addObject("FSubsystem",FSubsystem);
}

인기 답변

나는 비슷한 문제를 겪었다. 내 것은 SQL Server 대신 Postgresql이지만이 경우 중요하지 않다고 생각합니다.

결과의 끝에 ToList ()를 추가하는 것이 트릭을 만들었습니다. 희망은 당신을 위해 또한 작동합니다.

            string sql = @"
                    select * from usuario where id=@id;

                    select  idarea 
                    from    areausuario
                    where   idusuario = @id;

                    select * from area;
                    ";


        var res = this.Connection.QueryMultiple(sql, p);

        var usuarioData = res.Read<Entities.Usuario>().First();
        var areasSelected = res.Read<int>().ToList();
        var areas = res.Read<Entities.CatalogoPadreSelection>().ToList();


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.