ДЕСЯТИЧНЫЕ значения преобразуются в INT 1 самостоятельно

#sql #sql-server #int #decimal #sql-insert

#sql #sql-сервер #int #десятичные #sql-вставка

Вопрос:

У меня есть приложение на C #, в котором пользователь заполняет форму для хранения продукта в базе данных SQL Server.

Проблема в том, что каждый раз, когда продукт сохраняется (через пользователя, заполняющего форму), цена (десятичная) автоматически преобразуется в int и к ней добавляется 1.

Сначала я думал, что это проблема с приложением, однако процесс регистрации довольно прост, и я не нашел там никакой ошибки, поэтому я вставил строку непосредственно с SQL Server, и проблема возникла сама собой, так что это говорит мне, что проблема в SQL Server, не в приложении.

Выполнение

 insert into product (code, description, unit_price, stock, category_code)
values (7, 'Window Cleaner', 20.50, 20, 3)
  

Приводит к тому, что цена равна 21.

Это определение таблицы

 CODE INT NOT NULL,
DESCRIPTION VARCHAR(30) NOT NULL,
UNIT_PRICE DECIMAL NOT NULL,
STOCK INT NOT NULL,
CATEGORY_CODE INT NOT NULL
CONSTRAINT PK_PRODUCT PRIMARY KEY(CODE),
CONSTRAINT FK_CATEGORY_CODE FOREIGN KEY (CATEGORY_CODE) REFERENCES Category(CODE),
CONSTRAINT PRODUCT_POSITIVE_VALUES CHECK(UNIT_PRICE > 0 AND CODE >= 0 AND STOCK >= 0)
  

Комментарии:

1. Вы пробовали значение с более низкой десятичной частью, например 20.30? Чтобы проверить, является ли это округлением, а не просто добавлением 1

Ответ №1:

Для определения вашего столбца вы использовали следующее:

 UNIT_PRICE DECIMAL NOT NULL
  

Это не имеет ни точности, ни масштаба и поэтому будет использовать точность по умолчанию (18) и масштаб (0). Шкала по умолчанию 0 фактически является int . Поэтому, когда вы вставляете / обновляете значение, значение будет округлено до int . Чтобы решить вашу проблему, определите свой столбец с правильной точностью и масштабом, например

 UNIT_PRICE DECIMAL(9,2) NOT NULL
  

Ссылка