DOBON.NETプログラミング道掲示板
(現在 過去ログ4 を表示中)
HOME
HELP
新規作成
新着記事
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
[
最新記事及び返信フォームをトピックトップへ
]
[ トピック内全5記事(1-5 表示) ] <<
0
>>
■34689
/ inTopicNo.1)
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
/ inTopicNo.2)
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
/ inTopicNo.3)
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
/ inTopicNo.4)
Re[3]: C#からストアドにDecimalを渡すと値が丸められる
▲
▼
■
□投稿者/ tomy
一般人(6回)-(2021/04/07(Wed) 16:43:04)
あっ、すみません!
当時のソースコードにロールバックしてよくよく見てみたら、型を間違っていました。
SqlCommand.Parameters.Addに渡す際、小数点以下13桁より小さい桁を切り捨てる必要があったので、切り捨てる関数を呼んでいたのですが、この戻り値がDouble型になっていました。
すみません、とんだ勘違いをしておりました。
引用返信
削除キー/
編集
削除
■34693
/ inTopicNo.5)
Re[4]: C#からストアドにDecimalを渡すと値が丸められる
▲
▼
■
□投稿者/ tomy
一般人(7回)-(2021/04/07(Wed) 16:45:29)
(すみません、解決済にしわすれていました)
自己解決で申し訳ありません。
SqlParameterにはDecimalを指定していながら、実際の値はDoubleを渡していたことが原因でした。
(でも、SqlParameterのValueに渡した段階ではちゃんと1234.123456790123になっていたんですけどね・・・)
解決
済
み!
引用返信
削除キー/
編集
削除
トピック内ページ移動 / <<
0
>>
このトピックに書きこむ
過去ログには書き込み不可
Mode/
通常管理
表示許可
Pass/
HOME
HELP
新規作成
新着記事
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
-
Child Tree
-