Dapper give"读取器关闭时无法尝试调用FieldCount。"当试图使用" QueryMultiple"

时间:2016-01-04 05:04:30

标签: c# asp.net-web-api2 dapper

我有一个Dapper.NET QueryMultiple方法的包装器方法。它成功从存储过程中获取数据,该过程有3个查询,所有查询都是SELECT个查询。但在获取数据后,我无法使用ReadReadAsync将数据分配给类变量。我在下面附上我的代码。

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);
            }
        }
    }

1 个答案:

答案 0 :(得分:5)

查看您的MultiQuery方法。特别是,请查看finally块。现在考虑:在数据被消耗之前已经调用了该块。基本上,不要这样做。

如果是我:

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

如果编写一个添加命令类型的QueryMultipleSP扩展方法很有帮助,那么可能会这样做,但是......