我在 SQL Server 中有一个存储过程,它的输出参数 pf 类型为 numeric(18,0)
。在 C# 中,我创建了一个带有 SqlDbType.Decimal
的 SqlParameter
,并将精度设置为 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 id = (long)queryParameters[2].Value;
它说不能转换它。
但是如果我将 SqlParameter
类型修改为 SqlDbType.Bigint
,那么它就可以工作了。
所以我通过将其作为 SqlDbType.BigInt
进行传递是正确的吗?或者最好将其作为 SqlDbType.Decimal
传递,然后使用十进制 C# 变量而不是 long?
将其作为 SqlDbType.Decimal
传递,然后执行以下操作也有效:
decimal id = (decimal)queryParameters[2].Value;
那么什么方法最好考虑到这个数字是一个没有小数的整数?
最佳答案
如果它在数据库中被定义为 numeric(...)
,那么它在 C# 中必须是 decimal
- 无论是(currently) 逗号后是否有数字。
不要将它错误地表示为 bigint
/long
- 它显然不是那种类型!另外 - 为什么你首先要尝试解析它/将它转换成 long
?对我来说毫无意义......它看起来像一个 decimal
,走路像一个 decimal
,叫声像一个 decimal
- 然后你'我很确定 它是 decimal
!
如果您的 SQL Server 类型突然更改为 numeric(20,2)
会怎样?通过在 C# 中使用 decimal
- 没问题,无需更改。如果您使用的是 long
,现在您需要开始将代码更改为 decimal
。
始终使用最合适的类型 - 对于 T-SQL numeric()
,这是 C#/.NET 中的 decimal
。
关于c# - 将参数从 C# : Which SQLDbType to use for numeric(18, 0) 传递到存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44048352/