5

私たちはDapper.Netを幅広く使用しており、非常に満足しています。ただし、 multi.Readを使用してストアドプロシージャから出力パラメータを取得しようとすると、問題が発生します。

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

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

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

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

4

1 に答える 1

7

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

于 2012-10-24T11:13:08.750 に答える