c# - 将参数从 C# : Which SQLDbType to use for numeric(18, 0) 传递到存储过程

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

我在 SQL Server 中有一个存储过程,它的输出参数 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;

存储过程正确执行,并正确返回输出参数,但是当我在 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/

相关文章:

sql - 读取sql中字符后面的每个字符串

sql-server - 获取每个 ID 和状态的前 3 个值

python - pymssql : Inserting mutliple values into a table

sql-server-2008 - SQL 更新语句 - "SET"附近的语法错误?

sql - 从 View 导出数据

sql - 添加非聚集索引会锁定我的表吗?

c# - ASP.NET MVC 使用 Dapper 管理 SQLConnection

c# - 更改程序集名称会出错

c# - MVC-4 文件上传成功消息

c# - 无法从 Azure 应用程序配置服务读取设置