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 行。它对应于我的
其他 3 个结果集将有很多行,并将填充
由于某种原因,我得到了
Cannot access a disposed object.Object name: 'GridReader'.
检查我的代码,看看在哪里。
我已经验证,当从使用 Linq2Sql 的 LinqPad 调用时,该过程工作正常。
我做错了什么?
阅读器在找不到更多结果网格时会自行处理;基本上,您的 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 中。