5

我正在使用 Dapper dot net 执行一个返回 4 个结果集的存储过程。这是我的做法:

    public Results Search(Query query)
    {
        if (query == null) throw new ArgumentNullException("query");

        Results results;
        var q = _sqlConnection.QueryMultiple("MySchema.MySproc", query,
                                             commandType: CommandType.StoredProcedure);
        {
            results = q.Read<Results>().First();
            results.CheckAlertResults = q.Read<Results.CheckAlertResult>().ToArray(); // Cannot access a disposed object.Object name: 'GridReader'.
            results.PersonAlertResultRows = q.Read<Results.PersonAlertResultRow>().ToArray();
            results.RoutingAlertResults = q.Read<Results.RoutingAlertResult>().ToArray();
        }

        return results;
    }

第一个结果集将仅包含 1 行。它对应于我的Results类上的几个原始属性。

其他 3 个结果集将有很多行,并将填充Results类上的 3 个复杂数组属性。

出于某种原因,我得到

无法访问已处置的对象。对象名称:“GridReader”。

检查我的代码,看看在哪里。

我已经验证从使用 Linq2Sql 的 LinqPad 调用该过程时可以正常工作。

我究竟做错了什么?

4

1 回答 1

9

阅读器在找不到更多结果网格时会自行处理;基本上,您的 C# 代码看起来不错,但建议是您的 proc 只返回 1 个网格。以下工作正常,例如:

using (var reader = connection.QueryMultiple(
    "select 1; select 2 where 1 = 0; select 3 where 1 = 0; select 4;"))
{
    var one = reader.Read<int>().ToArray();
    var two = reader.Read<int>().ToArray();
    var three = reader.Read<int>().ToArray();
    var four = reader.Read<int>().ToArray();
    try { // only returned four grids; expect a fifth read to fail
        reader.Read<int>();
        throw new InvalidOperationException("this should not have worked!");
    }
    catch (ObjectDisposedException) {/* expected; success */}

    one.Length.IsEqualTo(1);
    one[0].IsEqualTo(1);
    two.Length.IsEqualTo(0);
    three.Length.IsEqualTo(0);
    four.Length.IsEqualTo(1);
    four[0].IsEqualTo(4);
}

我可能会尝试改进错误消息,但我怀疑错误出在您的 SP 中。

于 2012-10-10T10:40:19.610 回答