从 C# 向存储过程传递参数:将哪个 SQLDbType 用于数字 (18, 0)

Passing parameter to stored procedure from C#: Which SQLDbType to use for numeric(18, 0)

我在 SQL 服务器中有一个存储过程,它的输出参数 pf 类型为 numeric(18,0)。在 C# 中,我创建了一个带有 SqlDbType.DecimalSqlParameter 并将精度设置为 18 并将比例设置为 0.

这是我的代码:

queryParameters[2] = new SqlParameter("@Id", SqlDbType.Decimal);
queryParameters[2].Precision = 18; // # digits
queryParameters[2].Scale = 0;      // # decimals
queryParameters[2].Direction = ParameterDirection.Output;

存储过程正确执行,并且returns输出参数正确,但是当我在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(...),那么它的 必须是 a decimal 在 C# 中 - 它(当前)是否有数字逗号与否。

不要将它错误地表示为 bigint / long - 很明显不是那种类型!另外-您为什么要首先尝试解析它/将其转换为 long ?对我来说毫无意义......它看起来像 decimal,走路像 decimal,叫声像 decimal - 那么你很确定 它是一个decimal!

如果您的 SQL 服务器类型突然更改为 numeric(20,2) 会怎样?通过在 C# 中使用 decimal - 你很好,不需要任何更改。如果您改用 long,现在您需要开始将代码更改为 decimal

始终 使用最合适的类型 - 对于 T-SQL numeric(),这是 C# / .NET 中的 decimal .