Dapper给出“关闭阅读器时无效尝试调用FieldCount”。尝试使用“ QueryMultiple”时

hai*_*zal 5 c# dapper asp.net-web-api2

我有一个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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

看你的MultiQuery方法。特别要看一下该finally块。现在考虑:在使用数据之前已调用该块。基本上,不要那样做。

如果是我:

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

如果编写QueryMultipleSP添加命令类型的扩展方法很有帮助,则可以这样做,但是...

  • 您可以将 MultiQuery 包装在具有回调参数的包装方法中:`Func&lt;SqlMapper.GridReader,T&gt; callback`。包装器方法将返回对 `using` 块内的回调的调用。它确保连接始终被正确关闭/处理,并且客户端代码可以使用 `GridReader` 执行它需要的操作。 (2认同)