簡體   English   中英

進入數據庫時​​小數取整

[英]Decimal value gets rounded when entering DB

我正在嘗試將一個十進制值上傳到數據庫中。

在上載之前(調試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();

D B:

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變量為DECIMAL (18, 4) screensize DECIMAL (18, 4) 因此,它最多可以容納18位數字,並且允許您在浮點數后有4位數字,並且如果您有更多的浮點數,則將四舍五入。

必須了解SQL中的十進制類型背后的工作。 以DECIMAL(size,d)作為大小,確定值的總長度,包括浮點后的數字。例如,如果您的值是'500000.00',而十進制(8,2)表示您只能有一個總共8位數字,小數點后僅允許2位數字。

在您的情況下,參數大小為DECIMAL(18,4),這意味着如果一個數字的位數比sql server將截斷的位數多,則只允許使用4個浮點數。

問題是由您定義參數@screensize
您已將其聲明為SqlDbType.Int類型,即使您可以將參數的Value屬性設置為其他類型的值(如十進制),當您將該參數發送給數據庫引擎時,它也會四舍五入到最接近的整數,您會在數據庫表中看到該值。

使用參數時,最重要的是為它們提供數據庫表中期望的數據類型。

將該參數聲明為

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM