【问题标题】:Decimal value gets rounded when entering DB输入 DB 时小数值被四舍五入
【发布时间】:2019-03-31 15:41:29
【问题描述】:

我正在尝试将十进制值上传到数据库中。

在上传之前(在调试 C# 时)它是小数,但是当插入到数据库时它是小数,所以小数点后除了零之外没有任何数字。为什么?

变量声明:

decimal screen_size = 0;
cmd.Parameters.Add(new SqlParameter("@devicename", SqlDbType.NVarChar));
cmd.Parameters.Add(new SqlParameter("@batterylife", SqlDbType.Int));
cmd.Parameters.Add(new SqlParameter("@price", SqlDbType.Int));
cmd.Parameters.Add(new SqlParameter("@BasemarkX", SqlDbType.Int));
cmd.Parameters.Add(new SqlParameter("@ImageURL", SqlDbType.VarChar, int.MaxValue));
cmd.Parameters.Add(new SqlParameter("@year", SqlDbType.Int)); 
cmd.Parameters.Add(new SqlParameter("@screensize", SqlDbType.Int));

作业:

screen_size = decimal.Parse(Regex.Match(screenSize, @"\d+(\.\d+)?").Value);

上传:

cmd.CommandText =
   "UPDATE Phones " +
   "SET price = @price, BasemarkX = @BasemarkX, year = @year, batterylife = @batterylife, screensize = @screensize " +
   "WHERE devicename = @devicename";

    //set parameters values
    cmd.Parameters["@devicename"].Value = model;
    cmd.Parameters["@batterylife"].Value = batterylife;
    cmd.Parameters["@price"].Value = price;
    cmd.Parameters["@BasemarkX"].Value = bench;
    cmd.Parameters["@year"].Value = year;
    cmd.Parameters["@ImageURL"].Value = imgURL;
    cmd.Parameters["@screensize"].Value = screen_size;

    cmd.ExecuteNonQuery();

数据库:

CREATE TABLE [dbo].[Phones] (
[Id]          INT             IDENTITY (1, 1) NOT NULL,
[devicename]  NVARCHAR (50)   NULL,
[batterylife] INT             DEFAULT ((0)) NULL,
[price]       INT             DEFAULT ((0)) NULL,
[BasemarkX]   INT             DEFAULT ((0)) NULL,
[year]        INT             DEFAULT ((0)) NULL,
[ImageURL]    NVARCHAR (MAX)  NULL,
[screensize]  DECIMAL (18, 4) DEFAULT ((0)) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);

澄清:我正在尝试上传一个十进制数,通常每个点的每一端都有一个数字,每边最多两个(它不起作用的测试是每端只有一个数字)

【问题讨论】:

  • 您能否展示定义命令参数的代码部分?
  • 我同意史蒂夫的观点,知道@screensize 参数的类型到cmd 会有所帮助
  • @ryanwc 如果我理解正确,@screensize 的类型写在 DB 下:
  • 请显示您声明 cmd 变量和创建参数的位置的整个代码。上面的代码不足以准确识别问题。我们只能猜猜错了
  • @Steve 知道错误出在哪里

标签: c# sql database decimal


【解决方案1】:

screensize 变量是 DECIMAL (18, 4)。所以它最多可以容纳 18 位数字,并且浮点数之后允许有 4 位数字,如果浮点数更多,它将被四舍五入。

【讨论】:

  • 这真的解决了“小数点后除了零之外没有任何数字”的问题吗?
  • @AntonínLejsek 如果要保存的号码是23.0000521
  • 好吧,如果你遇到这样的屏幕尺寸,请告诉我 ;-)
  • 就像@AntonínLejsek 提到的那样,这不是我要处理的数字
【解决方案2】:

问题是你定义的参数@screensize引起的
您已将其声明为 SqlDbType.Int 类型,即使您可以将参数的 Value 属性设置为不同类型的值(如小数),当您将该参数发送到数据库引擎时,它也将是四舍五入到最接近的整数,您会在数据库表中看到该值。

当使用参数时,为它们提供数据库表中预期的数据类型至关重要。

将该参数声明为

cmd.Parameters.Add(new SqlParameter("@screensize", SqlDbType.Decimal));

【讨论】:

    【解决方案3】:

    了解 SQL 中小数类型的工作原理至关重要。 DECIMAL(size,d),作为大小,决定了包含浮点数之后的数值的总长度,例如如果你有一个值'500000.00',而decimal(8,2)表示你只能有一个共8位,小数点后只允许2位。

    在您的情况下,参数大小为 DECIMAL (18, 4),这意味着如果数字的位数超过 sql server 将截断的位数,则只允许 4 个浮点数。

    【讨论】:

    • thnx 但这与对我不起作用的最后一个答案相同
    • 那是因为,"cmd.Parameters.Add(new SqlParameter("@screensize", SqlDbType.Int));" “SqldbType.Int”应该是SqldbType.decimal,请选择正确的数据类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2023-03-27
    相关资源
    最近更新 更多