Dapper.NETと複数の結果セットを持つprocを格納

dapper multiple-resultsets sql-server stored-procedures

質問

Dapper.NETを使用して複数の結果セットを返すストアドプロシージャを使用する方法はありますか?

私の場合、最初の結果セットは1列の単一の行です。 0場合は呼び出しが成功し、2番目の結果セットにはデータの実際の行/列が含まれます。 (ゼロ以外の場合はエラーが発生し、2番目の結果セットは提供されません)

Dapper.NETでこれを処理する機会はありますか?これまでのところ、私はそのシングル0取り戻しているに過ぎません。

更新: OK、それはうまく動作します - 限り、結果を設定します。 2は単一のエンティティです:

Dapper.SqlMapper.GridReader reader = 
    _conn.QueryMultiple("sprocname", dynParams, 
    commandType: CommandType.StoredProcedure);

int status = reader.Read<int>().FirstOrDefault();
MyEntityType resultObj = reader.Read<MyEntityType>().FirstOrDefault();

今、 もう一つの要件があります。

その2番目の結果セットのDapperのマルチマッピング(1つの行をSQL​​ Serverから2つの別個のエンティティに分割して分割する)は、まだサポートされていないようです(少なくとも、 .Read<T>マルチ・マッピングを扱うことができる)。

その行を2つのエンティティに分割するにはどうすればよいですか?

受け入れられた回答

QueryMultipleメソッドを試しましたか?それはそれがあるべきだと言います:

複数の結果セットを返すコマンドを実行し、それぞれに順番にアクセスする

QueryMultipleを有効にするには、このusingステートメントを追加する必要があります。

using Dapper; /* to add extended method QueryMultiple public static GridReader QueryMultiple(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null); */

人気のある回答

QueryMultipleは、複数の結果セットを処理する機能をサポートしています。私たちが追加した唯一の設計上の制限は、グリッドリーダーのバッファリングを完全に無効にすることでした。これは、API全体がストリーミングされていることを意味します。

最も単純なケースでは、あなたは使うことができます:

var grid = connection.QueryMultiple("select 1 select 2");
grid.Read<int>().First().IsEqualTo(1);
grid.Read<int>().First().IsEqualTo(2);

もう少し洗練されたケースでは、このようなクレイジーなことをすることができます:

var p = new DynamicParameters();
p.Add("a", 11);
p.Add("r", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

connection.Execute(@"create proc #spEcho
@a int
as 
begin

select @a Id, 'ping' Name, 1 Id, 'pong1' Name
select @a Id, 'ping' Name, 2 Id, 'pong2' Name
return @a
end");

var grid = connection.QueryMultiple("#spEcho", p, 
                                     commandType: CommandType.StoredProcedure);

var result1 = grid.Read<dynamic, dynamic, Tuple<dynamic, dynamic>>(
                  (a, b) => Tuple.Create((object)a, (object)b)).ToList();
var result2 = grid.Read<dynamic, dynamic, Tuple<dynamic, dynamic>>(
                  (a, b) => Tuple.Create((object)a, (object)b)).ToList();

((int)(result1[0].Item1.Id)).IsEqualTo(11);
((int)(result1[0].Item2.Id)).IsEqualTo(1);

((int)(result2[0].Item1.Id)).IsEqualTo(11);
((int)(result2[0].Item2.Id)).IsEqualTo(2);

p.Get<int>("r").IsEqualTo(11);

QueryMultipleを有効にするには、このusingステートメントを追加する必要があります。

using Dapper; /* to add extended method QueryMultiple public static GridReader QueryMultiple(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null); */


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