为什么小数SqlParameter会被破坏?

时间:2010-12-22 11:03:11

标签: .net sql decimal sqlparameters

我正以下列方式向sproc发送一个十进制值:

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

我也遇到过这个问题。

微软承认这个问题(我发现)的最接近文件记录是:

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

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

编辑:我遇到了类似的问题,发现就在昨天整天更新SqlParameter没有做任何事情,因为只要我添加了它就会丢失我SqlCommand的参数。而是编辑SqlParameter中的SqlCommand以设置所需的精度:

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;
  }
}

答案 2 :(得分:0)

为什么要将十进制值包装在引号中,将其转换为字符串?