我正在尝试将一个十进制值上传到数据库中。
在上传之前(调试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)
);
说明:我正在尝试上传一个十进制数字,该数字通常在点的最大两端各为一位,在每一侧最多为两位(不起作用的测试是在每一端只有一位)>
答案 0 :(得分:2)
您的screensize
变量是DECIMAL (18, 4)
。因此,它最多可以容纳18位数字,并且允许您在浮点数后有4位数字,并且如果您有更多的浮点数,则将四舍五入。
答案 1 :(得分:1)
理解SQL中的十进制类型背后的工作至关重要。以DECIMAL(size,d)作为大小,确定值的总长度,包括浮点后的数字。例如,如果您的值是'500000.00',而十进制(8,2)表示您只能有一个总共8位数字,小数点后只能输入2位数字。
在您的情况下,参数大小为DECIMAL(18,4),这意味着如果一个数字的位数大于sql server将被截断的位数,则只允许使用4个浮点数字。
答案 2 :(得分:0)
此问题是由您对参数@screensize
的定义引起的
您已将其声明为SqlDbType.Int类型,即使您可以将参数的Value属性设置为其他类型的值(如十进制),当您将该参数发送给数据库引擎时,它也会四舍五入为最接近的整数,您会在数据库表中看到该值。
使用参数时,最重要的是为它们提供数据库表中期望的数据类型。
将该参数声明为
cmd.Parameters.Add(new SqlParameter("@screensize", SqlDbType.Decimal));