Dapperで特定の精度で出力パラメータとして小数点を使用する

c# dapper

質問

私はカスタムと厄介なコードの代わりにDapperを評価しており、これまでのところすべてが非常に良好で有望でした。しかし、今朝私は動的パラメータの問題に遭遇し、解決策を見つけることができません。

ストアドプロシージャは、2つの10進数の出力パラメータで結果を返す顧客の勘定残高と利用可能残高を計算します。これらの小数値は、Precision = 18およびScale = 2のストアドプロシージャで宣言されています。この手順は、現在の標準方法と完全に一致します。しかしDapperでは、これらのパラメータを渡してスケールを指定する方法を見つけることができないので、私が戻すのは10進値の整数部分です。

using (IDbConnection connection = OpenConnection())
{
    var args = new DynamicParameters(new { custID = customerID});

    // No way to set the scale here?
    args.Add("@accnt", dbType: DbType.Decimal, direction: ParameterDirection.Output);
    args.Add("@avail", dbType: DbType.Decimal, direction: ParameterDirection.Output);

    var results = connection.QueryMultiple("Customer_CalcBalance", args, commandType:CommandType.StoredProcedure);
    decimal account = args.Get<decimal>("@accnt");
    decimal availab = args.Get<decimal>("@avail");
}

そしてここに質問がありますが、小数出力パラメータのスケールを渡す方法がありますか?または、正確な小数点の値を取得するために私の目標を達成する別の方法がありますか?

受け入れられた回答

まあ、この問題を解決する方法はないようです(少なくとも暫定的な答えは見つけられませんでした)ので、残りの作業を続行するために実装したこの回避策を適用します。

var args = new DynamicParameters(new { custID = customerID});
args.Add("@accnt", dbType: DbType.Single, direction: ParameterDirection.Output);
args.Add("@avail", dbType: DbType.Single, direction: ParameterDirection.Output);

var results = connection.QueryMultiple("Customer_CalcBalance", args, commandType:CommandType.StoredProcedure);
decimal account = args.Get<decimal>("@accnt");
decimal availab = args.Get<decimal>("@avail");

私は期待される型Decimal代わりにSingleとして出力パラメータを渡しました。
このようにして、SqlParameter.Scaleプロパティが0以外の値に設定され、出力パラメータを読み込もうとすると小数点以下の桁を取得することができます。
誰かがより良い解決策を持っているなら私に知らせてください。


人気のある回答

パーティーに少し遅れましたが、2015年にこれが修正されたと言いたいと思いました。 ここにGitHubの問題があります。使用例:

public void Issue261_Decimals()
{
    var parameters = new DynamicParameters();
    parameters.Add("c", dbType: DbType.Decimal, direction: ParameterDirection.Output, precision: 10, scale: 5);
    connection.Execute("create proc #Issue261 @c decimal(10,5) OUTPUT as begin set @c=11.884 end");
    connection.Execute("#Issue261", parameters, commandType: CommandType.StoredProcedure);
    var c = parameters.Get<Decimal>("c");
    c.IsEqualTo(11.884M);
}


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