В статье рассматривается проблема передачи аргументов хранимой процедуре в FireDAC, когда при использовании корректных значений аргументов возникает ошибка "Out of range value for column 'aArg2' at row 0". Мы рассмотрим причину этой проблемы и предложим решение, а также альтернативный подход для передачи аргументов хранимой процедуре.
Причина проблемы
Проблема возникает из-за того, что FireDAC отправляет аргументы в их бинарном представлении, в то время как HeidiSQL использует простые текстовые запросы. В данном случае, значения аргументов aArgX передаются как тип Byte, но в MariaDB они определены как TINYINT UNSIGNED, что означает, что они должны принимать значения от 0 до 255. Однако, FireDAC не учитывает атрибут UNSIGNED и пытается передать значения за пределами этого диапазона, что и приводит к ошибке.
Решение проблемы
Чтобы решить эту проблему, мы можем изменить тип данных аргументов aArgX в хранимой процедуре на TINYINT, а не на TINYINT UNSIGNED. Это позволит FireDAC корректно передавать значения в диапазоне от -128 до 127. Вот измененная версия хранимой процедуры:
CREATE DEFINER=`root`@`localhost` PROCEDURE `MyProc`(
IN `aMyID` BIGINT,
IN `aBool1` TINYINT(1),
IN `aFOURCC` CHAR(4),
IN `aComment` TINYTEXT,
IN `aArg1` TINYINT,
IN `aArg2` TINYINT,
IN `aArg3` TINYINT,
IN `aArg4` TINYINT
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
INSERT INTO `Data`(`MyID`, `Bool1`, `FOURCC`, `Comment`, `Arg1`, `Arg2`, `Arg3`, `Arg4`)
VALUES(aMyID, aBool1, aFOURCC, aComment, aArg1, aArg2, aArg3, aArg4);
END
После изменения типа данных в хранимой процедуре, функция TMyDataModule.OpenProc в Delphi будет работать корректно и без ошибок.
Альтернативное решение
Если по какой-либо причине невозможно изменить тип данных аргументов в хранимой процедуре, мы можем использовать альтернативный подход для передачи аргументов. Вместо передачи аргументов напрямую, мы можем сформировать запрос с параметрами и выполнить его с помощью TFDQuery. Вот пример кода на Object Pascal (Delphi):
В этом примере мы создаем TFDQuery, устанавливаем текст SQL-запроса и передаем значения параметров с помощью ParamByName. Этот подход гарантирует, что значения аргументов будут корректно передаваться в хранимую процедуру, даже если тип данных в MariaDB отличается от типа данных в Delphi.
В заключение, мы рассмотрели проблему передачи аргументов хранимой процедуре в FireDAC и предложили два решения: изменение типа данных в хранимой процедуре и использование альтернативного подхода с TFDQuery. Выбор решения зависит от конкретной ситуации и возможностей изменения схемы базы данных.
В статье рассматривается проблема передачи аргументов хранимой процедуре в FireDAC, когда при использовании корректных значений аргументов возникает ошибка 'Out of range value for column 'aArg2' at row 0'. Мы рассмотрим причину этой проблемы и предложим р
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.