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

时间:2017-05-18 12:53:48

标签: c# sql-server-2008 sql-server-2008-r2 sqlparameter sqldbtype

我在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;

那么什么方法最好考虑到这个数字是一个没有小数的整数?

1 个答案:

答案 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