У меня есть настройка базы данных MS SQL 2017, и я отправляю теги RFID в таблицу, а затем запрашиваю таблицу позже, чтобы узнать, существует ли пользователь в системе.
Я получаю сообщение об ошибке:
'Arithmatic overflow error converting varchar to data type numeric'.
Я попытался изменить тип rfid_id на VARCHAR(MAX), но безуспешно.
Моя таблица:
CREATE TABLE worker_table ('worker_id INT IDENTITY(1,1) PRIMARY KEY,
rfid_id VARCHAR(30) NOT NULL,
worker_customer_name VARCHAR(30) NOT NULL,
site_id INTEGER NOT NULL REFERENCES site_table(site_id))
Это прекрасно работает.
Данные, которые я вставляю в таблицу для данного RFID:
INSERT INTO worker_table(rfid_id, worker_customer_name, site_id, worker_id
VALUES ($'10103967375$', $'USER_1$', $'1$', $'1'))
Это также отлично работает для большинства RFID-меток.
Однако некоторые теги имеют разную длину, например 330004531017 или 9600007487626. Некоторые теги пишут в базу данных OK, а некоторые возвращают ошибку.
Также, если я запрашиваю базу данных с помощью:
SELECT CASE WHEN EXISTS(SELECT * FROM worker_table WHERE rfid_id =9600007487626) THEN 100 ELSE 200 END)
Это нормально работает для большинства тегов, но для некоторых возвращает ту же ошибку.
PS В настоящее время я отправляю rfid_id в виде строки с моего ПЛК.
Мои знания в SQL ограничены, поэтому любая помощь будет очень признательна, пожалуйста, и спасибо.
Используйте одинарные кавычки, потому что ваш тег представляет собой строку:
SELECT (CASE WHEN EXISTS (SELECT 1
FROM worker_table
WHERE rfid_id = '9600007487626'
)
THEN 100 ELSE 200
END)
Когда вы опускаете одинарные кавычки, значение является числом, а rfid_id
преобразуется в число — отсюда и переполнение.
Просто используйте сравнение строк.
Привет, Гордон, на самом деле я отправляю rfid_id в одинарных кавычках. См. необработанный код ниже, где я создаю строку для отправки с ПЛК. Я просто упростил это для поста. Если вы будете следовать 'strQ' по мере его создания, вы получите rfid_id внутри ''.
memset(ADR(strQ), 0, SIZEOF(strQ)); strcpy(ADR(strQ), ADR('INSERT INTO worker_table')); strcat(ADR(strQ), ADR(' (rfid_id, woker_nme, site_id, worker_id )')); strcat(ADR(strQ), ADR(' ЗНАЧЕНИЯ ($'')); strcat(ADR(strQ), ADR(myData.rfid_id)); strcat(ADR(strQ), ADR('$', $'') ); strcat(ADR(strQ), ADR(myData.woker_name)); strcat(ADR(strQ), ADR('$', $'')); ftoa(myData.site_id, ADR(strQ) + strlen(ADR (strQ))); strcat(ADR(strQ), ADR('$', $'')); ftoa(myData.worker_id, ADR(strQ) + strlen(ADR(strQ))); strcat(ADR(strQ ), ADR('$')'));
Привет Гордон, спасибо! Оказывается, я добавлял rfid_id в виде строки внутри ''. Но когда я запрашивал, существует ли пользователь для входа в систему (я также делаю это перед добавлением нового пользователя), я не использовал ''.
В SQL Server максимальная точность числового типа данных по умолчанию равна 38, а в более ранней версии
который поддерживался только до символов
По причине, когда вы конвертируете varchar в числовое переполнение, произошло
rfid_id — это строка (символы), и ее следует проверять с помощью «9600007487626» с кавычками, не так ли?