Dapper GridReaderはすでにDisposed Error

.net dapper sql sql-server

質問

私はDapperドットネットを使って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クラスの2つのプリミティブプロパティに対応しています。

他の3つの結果セットは多くの行を持ち、 Resultsクラスに3つの複雑な配列プロパティを設定します。

何らかの理由で、私は

廃棄されたオブジェクトにアクセスできません。オブジェクト名: 'GridReader'。

私のコードをチェックしてどこを確認してください。

Linq2Sqlを使用するLinqPadから呼び出されたときに、プロシージャが正常に動作していることを確認しました。

私は間違って何をしていますか?

受け入れられた回答

リーダーは、結果のグリッドが見つからない場合は、それ自体を廃棄します。基本的には、あなたの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にエラーがあると思われます。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ