#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