我在SQL Server中有一个存储过程,其输出参数为pf type numeric(18,0)
。从C#我创建一个SqlParameter
SqlDbType.Decimal
,我将精度设置为18并缩放为0.
这是我的代码:
queryParameters[2] = new SqlParameter("@Id", SqlDbType.Decimal);
queryParameters[2].Precision = 18; // # digits
queryParameters[2].Scale = 0; // # decimals
queryParameters[2].Direction = ParameterDirection.Output;
存储过程正确执行,并正确返回输出参数,但当我将其解析为C#中的long变量时,如下所示:
long id = (long)queryParameters[2].Value;
它说不能转换它。
但是如果我将SqlParameter
类型修改为SqlDbType.Bigint
,那么它就可以了。
通过将其作为SqlDbType.BigInt
传递,我正在做的是正确的吗?或者最好将其作为SqlDbType.Decimal
传递,然后使用小数C#变量而不是长?
将其作为SqlDbType.Decimal
传递然后执行以下操作也是有效的:
decimal id = (decimal)queryParameters[2].Value;
那么什么方法最好考虑到这个数字是一个没有小数的整数?
答案 0 :(得分:2)
如果在数据库中将其定义为numeric(...)
,则必须在C#中为decimal
- 是否(当前)在逗号后面有数字。
不要错误地将其表示为bigint
/ long
- 它只是简单的不是那种类型!另外 - 你为什么要首先解析/将其转换为long
?对我毫无意义.....它看起来像decimal
,像decimal
一样走路,像decimal
那样嘎嘎叫 - 然后你很确定 这是 a decimal
!
如果您的SQL Server类型突然变为numeric(20,2)
会发生什么?在C#中使用decimal
- 你很好,不需要进行任何更改。如果您使用了long
,那么现在需要开始将代码更改为decimal
。
始终使用最合适的类型 - 对于T-SQL numeric()
,这是C#/ .NET中的decimal
。