【问题标题】:Why is the decimal SqlParameter getting mangled?为什么十进制 SqlParameter 被破坏?
【发布时间】:2010-12-22 11:03:10
【问题描述】:

我通过以下方式将十进制值发送到存储过程:

SqlParameter meh = new SqlParameter("Foo", SqlDbType.Decimal);
meh.Value = "0.00001";
meh.Precision = ((System.Byte)(12));
meh.Scale = ((System.Byte)(9));

当我分析数据库以查看正在对其运行的内容时,我看到的参数如下:

....,@Foo decimal(12,9),....,@Foo=10000,....

它似乎完全从小数点镜像,我该如何解决这个问题?请注意,我也尝试过先将字符串转换为实际的小数并使用它来设置“meh.Value”,但它仍然存在同样的问题。

更新

我注意到,如上例所示,原始值的小数点向右移动了 9 个位置,与刻度的值完全相同。这是什么原因造成的?

再次更新

我应该注意我使用的是 Sql Server 2008

【问题讨论】:

  • 您是否尝试过事后对表格进行选择并查看从中得到什么?
  • 如果生成的 SQL 实际针对数据库运行,则会引发以下错误:“将数据类型 int 转换为十进制时出错。”
  • 这可能是语言环境的问题吗?也许它将点解释为数字分隔符,就像他们在英国使用的那样,就像我们在美国使用逗号一样。由于您的值是一个正在被解析的字符串,它可能被解析为 1 而不是 0.00001。

标签: .net sql decimal sqlparameter


【解决方案1】:

为什么要显式使用 System.Byte 来表示 SqlParameter Precision 和 Scale?代码应该是这样的:

SqlParameter meh = new SqlParameter("Foo", SqlDbType.Decimal);
meh.Value = 0.00001;
meh.Precision = 12;
meh.Scale = 9;

【讨论】:

  • 对结果没有任何影响
  • 如果先设置精度和比例,然后设置值呢?
【解决方案2】:

我也遇到过这个问题。

Microsoft 承认该问题(我发现)的最接近记录的尝试在这里:

http://support.microsoft.com/?kbid=892406

不是一个很好的答案,但有助于你的理智。

编辑:我遇到了类似的问题,发现 就在昨天整天更新 SqlParameter 没有任何作用,因为每当我将该参数添加到我的SqlCommand。相反,编辑 SqlCommand 中的 SqlParameter 以设置您需要的精度:

void parameterCheck(SqlCommand cmd, object value, int index, SqlDbType dataType) {
  cmd.Parameters[index].Value = value;
  if (dataType == SqlDbType.Decimal) {
    cmd.Parameters[index].Precision = 12;
    cmd.Parameters[index].Size = 9;
  }
}

【讨论】:

  • 那篇文章似乎是针对 SQL Server 2000 的,我实际上使用的是 SQL Server 2008。我将更新帖子以反映这一点
【解决方案3】:

你为什么要把十进制值用引号括起来,变成一个字符串?

【讨论】:

  • 该值是字符串形式,因为它的来源没有在简化的代码示例中显示。我检查了调试器中的值,它显示为我所示。我也尝试过先将值显式解析为小数,但我仍然遇到同样的问题。
猜你喜欢
  • 2014-09-17
  • 2020-01-08
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2015-08-21
  • 2010-12-31
相关资源
最近更新 更多