Dapper가 "리더가 닫혀있을 때 FieldCount를 잘못 호출하려고했습니다." "QueryMultiple"을 사용할 때

asp.net-web-api2 c# dapper

문제

Dapper.NET의 QueryMultiple 메서드에 대한 래퍼 메서드가 있습니다. 성공적으로 3 개의 쿼리가있는 저장 프로 시저에서 데이터를 가져 오며, 모두 SELECT 쿼리입니다. 하지만 데이터를 ReadAsync 후에는 Read 또는 ReadAsync 를 사용하여 클래스 변수에 데이터를 할당 할 수 없습니다. 나는 아래 코드를 붙이고있다.

public Tuple<IEnumerable<T1>, IEnumerable<T2>, IEnumerable<T3>> 
        QueryMultiple<T1, T2, T3>()
    {
        try
        {
            var data = MultiQuery("[App].[USP_GetAllCategories]");
            var category = data.Read<T1>();
            var subcategory = data.Read<T2>();
            var subSubcategory = data.Read<T3>();
            return new Tuple<IEnumerable<T1>, IEnumerable<T2>, IEnumerable<T3>>(
                category, subcategory, subSubcategory);
        }
        catch (Exception)
        {
            return null;
        }
    }

    public SqlMapper.GridReader MultiQuery(string storedProcedureName)
    {
        using (var connection = LocalConnection())
        {
            try
            {
                return connection.QueryMultiple(
                    sql: storedProcedureName,
                    commandType: CommandType.StoredProcedure);
            }
            catch (Exception)
            {
                return null;
            }
            finally
            {
                CloseConnection(connection);
            }
        }
    }

수락 된 답변

MultiQuery 메서드를 살펴보십시오. 특히 finally 블록을 살펴보십시오. 이제 블록이 데이터가 소비되기 전에 호출되었음을 고려하십시오. 기본적으로 그렇게하지 마십시오.

그것이 나 였다면 :

using (var connection = LocalConnection())
uaing (var data = conn.QueryMultiple("[App].[USP_GetAllCategories]",
    command type: CommandType.StoredProcedure))
{
    //... Consume
}

command-type을 추가하는 QueryMultipleSP 확장 메소드를 작성하는 것이 도움이된다면, 아마도 그렇게 할 것이지만 ...



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