Erreur Dapper GridReader déjà éliminée

.net dapper sql sql-server

Question

J'utilise Dapper dot net pour exécuter une procédure stockée qui renvoie 4 jeux de résultats. Voici comment je le fais:

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

Le premier ensemble de résultats ne contiendra que 1 ligne. Cela correspond à quelques propriétés primitives sur ma classe Results .

Les 3 autres jeux de résultats auront plusieurs lignes et rempliront 3 propriétés de tableau complexes dans la classe Results .

Pour une raison quelconque, je reçois

Impossible d'accéder à un objet éliminé. Nom de l'objet: 'GridReader'.

Vérifiez mon code pour voir où.

J'ai vérifié que la procédure fonctionne correctement lorsqu'elle est appelée depuis LinqPad, qui utilise Linq2Sql.

Qu'est-ce que je fais mal?

Réponse acceptée

Le lecteur se disposera quand il ne pourra plus trouver de grilles de résultats; En gros, votre code C # semble correct, mais la suggestion est que votre proc ne renvoie que 1 grille. Ce qui suit fonctionne bien, par exemple:

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

Je pourrais essayer d'améliorer le message d'erreur, mais je soupçonne que l'erreur est dans votre SP.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi