Dapper GridReader ya ha eliminado el error

.net dapper sql sql-server

Pregunta

Estoy usando Dapper dot net para ejecutar un procedimiento almacenado que devuelve 4 conjuntos de resultados. Así es como lo estoy haciendo:

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

El primer conjunto de resultados solo contendrá 1 fila. Corresponde a un par de propiedades primitivas en mi clase de Results .

Los otros 3 conjuntos de resultados tendrán muchas filas y completarán 3 propiedades de matriz complejas en la clase Results .

Por alguna razón, me estoy poniendo

No se puede acceder a un objeto eliminado. Nombre de objeto: 'GridReader'.

Verifique mi código para ver dónde.

He verificado que el procedimiento funciona correctamente cuando se llama desde LinqPad, que usa Linq2Sql.

¿Qué estoy haciendo mal?

Respuesta aceptada

El lector se eliminará cuando no encuentre más cuadrículas de resultados; Básicamente, su código de C # se ve bien, pero la sugerencia es que su proc solo devuelve 1 cuadrícula. Lo siguiente funciona bien, por ejemplo:

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

Podría intentar mejorar el mensaje de error, pero sospecho que el error está en tu SP.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué