2012-10-24 1 views
5

Dapper.Netを広く使用しており、非常に満足しています。 multi.Readに使用してストアドプロシージャから出力パラメータを取得しようとしたときにしかし、我々はこの問題に遭遇しています出力パラメータは常にmulti.Readでnullです。

var p = new DynamicParameters(); 
p.Add("@id", id); 
p.Add("TotalRows", dbType: DbType.Int32, direction: ParameterDirection.Output); 

using (var multi = cnn.QueryMultiple(string.Format("dbo.[{0}]", spName), p, 
    commandType: CommandType.StoredProcedure)) 
{ 
    int TotalRows = p.Get<int>("@TotalRows"); //This is always null 

    var results = multi.Read<New_Supplier>().ToList<IDBSupplier>(); 
    var areas = multi.Read<node>().ToList<IDBNode>(); 
    var categories = multi.Read<node>().ToList<IDBNode>(); 
    int TotalRows = multi.Read<int>().FirstOrDefault(); // This works 

} 

しかし、我々は、単一の結果セットに出力パラメータを取得するためにconnection.Query構文を使用している場合移入さ:

var result = cnn.Query<New_Supplier>(string.Format("spname"), p, 
    commandType: CommandType.StoredProcedure).ToList<New_Supplier>(); 
int TotalRows = p.Get<int>("@TotalRows"); 

エラーがDapperのDynamicParametersで出力パラメータのAttachedParamのsqlValueは常にnullであるということです。

これを回避するために、出力パラメータの値をストアドプロシージャの結果セットに追加し、それをそのようにしています。

なぜパラメータは常にnullですか?

答えて

6

TDSストリームでは、OUTパラメータは、のです。あなたのQuery<T>例では、はTDSストリーム消費している:あなたは、ストリームを消費しているため

ので
var result = cnn.Query<New_Supplier>(string.Format("spname"), p, 
    commandType: CommandType.StoredProcedure).ToList<New_Supplier>(); 
int TotalRows = p.Get<int>("@TotalRows"); 

を、新しいパラメータ値に達している、とあなたは値が利用できる必要があります。 QueryMultipleの例では、にはがTDSストリームの最後に達していません。 p.Get移動してみてください:ことが動作しない場合は

var p = new DynamicParameters(); 
p.Add("@id", id); 
p.Add("TotalRows", dbType: DbType.Int32, direction: ParameterDirection.Output); 

using (var multi = cnn.QueryMultiple(string.Format("dbo.[{0}]", spName), p, 
    commandType: CommandType.StoredProcedure)) 
{  
    var results = multi.Read<New_Supplier>().ToList<IDBSupplier>(); 
    var areas = multi.Read<node>().ToList<IDBNode>(); 
    var categories = multi.Read<node>().ToList<IDBNode>(); 
} 
int TotalRows = p.Get<int>("@TotalRows"); 

、私に知らせて、P

+0

おかげでマルク、それが動作します。私は*単純なものでなければならないことを知っていましたが、ちょうどそれを見ることができませんでした.... – Simon

+2

@Simonこれはおそらく明らかですが、追加するだけでADO.NETを直接使用する場合と全く同じ動作になります。 –

関連する問題