关于.net:Dapper GridReader 已经处理错误 | 珊瑚贝

Dapper GridReader already Disposed Error


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    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 个复杂数组属性。

由于某种原因,我得到了

Cannot access a disposed object.Object name: ‘GridReader’.

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

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

我做错了什么?

  • 你确定,你的结果集填写正确吗?如果其中一个结果为空,则会发生此异常。因为您的简洁代码对我来说看起来不错。
  • @Alex 不,它不会因为空网格而发生;空网格很好(见我的回答)
  • @MarcGravell 抱歉,当按预期返回较少的网格时,我像您一样检查了它。应该改写我的评论。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 中。

  • 感谢您验证我的客户端代码是否正确。这是我第一次使用 Dapper 的 QueryMultiple,所以我不确定我是否做错了什么。我将打开 SQL 分析器,看看我能看到什么。
  • @Ronnie 出于调试的目的,也许只是通过 ADO.NET ExecuteReader 调用它,然后查看有多少个网格(即您可以调用多少次 NextResult(),加一)
  • 问题在于我的存储过程返回错误结果集而不是引发错误。再次感谢。
  • 我今天刚碰到这个。问题和你描述的完全一样。谢谢!


来源:https://www.codenong.com/12809907/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?