DOBON.NETプログラミング道掲示板

■34689 / 親記事)  C#からストアドにDecimalを渡すと値が丸められる
  
□投稿者/ tomy 一般人(4回)-(2021/04/07(Wed) 14:20:28)
  • アイコン環境/言語:[Windows10/C#/VisualStudio2015/.Net Framework4.5] 
    分類:[.NET] 

    C#からストアドプロシージャ―にDecimal型の引数を渡す際、「12.1234567890123」という値なら正常に渡せますが、「1234.1234567890123」という値を渡そうとすると「1234.1234567890100」に変換されてしまいます。

    ストアドプロシージャの引数は

    @foo Decimal(19,13)

    となっており、整数6桁、小数13桁を格納できるようになっています。

    また、Management Studioからこのストアドプロシージャを呼び出した場合は「1234.1234567890123」という値を正しく渡せることを確認しています(ストアド内でテーブルにインサートする)

    C#のパラメータを作成する箇所は下記のようになっています。

    var param = new SqlParameter();
    param.ParameterName = "@foo";
    param.SqlDbType = SqlDbType.Decimal;
    param.Direction = ParameterDirection.Input;
    param.Value = "1234.1234567890123";


    Precision = 19;
    Scale = 13;

    など明示してみたりもしましたがうまくいきませんでした。

    時間がなかったので今回はVarcharで渡してストアド内でDecimalに変換して対応しました。
    ただ、普通にDecimalとして渡す方法がないものか、一応知識として知っておきたいのでご存知のかたがいらしたら教えてください。

    OS Windows10
    Visual Studio 2015
    C#
    SQL Server 2019

マルチポストを報告
違反を報告
引用返信 削除キー/
■34690 / ResNo.1)  Re[1]: C#からストアドにDecimalを渡すと値が丸められる
□投稿者/ 魔界の仮面弁士 大御所(1328回)-(2021/04/07(Wed) 16:00:31)
  • アイコン2021/04/07(Wed) 16:31:12 編集(投稿者)

    No34689に返信(tomyさんの記事)
    > ストアドプロシージャ―に
    > ストアドプロシージャの

    末尾の「ー(長音記号)」が「―(全角ダッシュ)」に
    なってしまうミスを、私も屡々やらかします…。


    > @foo Decimal(19,13)
    >「1234.1234567890123」という値を渡そうとすると
    >「1234.1234567890100」に変換されてしまいます。

    当方では再現しませんでした。
    SqlParameter の Precision と Scale を明示的に指定しても駄目ですか?

    /*
    CREATE PROCEDURE Example(@foo Decimal(19,13))
    AS
    BEGIN
    SET NOCOUNT ON
    SELECT @foo
    END
    */

    static void Main()
    {
     var cn = new SqlConnection(Properties.Settings.Default.ConnectionString);
     cn.Open();

     using (var cmd = cn.CreateCommand())
     {
      cmd.CommandText = "Example";
      cmd.CommandType = CommandType.StoredProcedure;

      var p = new SqlParameter();
      p.ParameterName = "@foo";
      p.SqlDbType = SqlDbType.Decimal;
      p.Direction = ParameterDirection.Input;
      p.Value = "1234.1234567890123";

      cmd.Parameters.Add(p);
      var r = cmd.ExecuteScalar();
     
      // 1234.1234567890123
      Console.WriteLine(r);
     }
     cn.Close();
    }

違反を報告
引用返信 削除キー/
■34691 / ResNo.2)  Re[2]: C#からストアドにDecimalを渡すと値が丸められる
□投稿者/ tomy 一般人(5回)-(2021/04/07(Wed) 16:34:39)
  • アイコンNo34690に返信(魔界の仮面弁士さんの記事)
    > SqlParameter の Precision と Scale はどうなっていますか?

    ソースコードはVarcharで指定するように書き換えてしまったので、デバッグ時の記憶ですが、SqlCommandのParametersをみたときは
    PrecisionとScaleは0だったと思います。

    しかしながら、いまパラメータをセットするコードだけのテストアプリを作ってみたら、Precision=17、Scale=13となっていて、結果的に正しく動作していました。
    アプリの作り方の問題かもしれません・・・。

    > また、SQL Server 側のパラメーターの有効桁数は?

    Decimal(19,13)になっています。



違反を報告
引用返信 削除キー/
■34692 / ResNo.3)  Re[3]: C#からストアドにDecimalを渡すと値が丸められる
□投稿者/ tomy 一般人(6回)-(2021/04/07(Wed) 16:43:04)
  • アイコンあっ、すみません!
    当時のソースコードにロールバックしてよくよく見てみたら、型を間違っていました。
    SqlCommand.Parameters.Addに渡す際、小数点以下13桁より小さい桁を切り捨てる必要があったので、切り捨てる関数を呼んでいたのですが、この戻り値がDouble型になっていました。

    すみません、とんだ勘違いをしておりました。

違反を報告
引用返信 削除キー/
■34693 / ResNo.4)  Re[4]: C#からストアドにDecimalを渡すと値が丸められる
□投稿者/ tomy 一般人(7回)-(2021/04/07(Wed) 16:45:29)
  • アイコン(すみません、解決済にしわすれていました)
    自己解決で申し訳ありません。

    SqlParameterにはDecimalを指定していながら、実際の値はDoubleを渡していたことが原因でした。
    (でも、SqlParameterのValueに渡した段階ではちゃんと1234.123456790123になっていたんですけどね・・・)

解決み!
違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -