5

Dapper dot net を使用して、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これは、私のクラスのいくつかのプリミティブ プロパティに対応しています。

他の 3 つの結果セットには多くの行があり、クラスに 3 つの複雑な配列プロパティが設定されますResults

どういうわけか、私は得ています

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

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

Linq2Sql を使用する LinqPad から呼び出したときに、プロシージャが正しく機能することを確認しました。

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

4

1 に答える 1

9

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

于 2012-10-10T10:40:19.610 に答える