Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

"Проблема с передачей аргументов хранимой процедуре в FireDAC"

Delphi , Базы данных , Ошибки БД

В статье рассматривается проблема передачи аргументов хранимой процедуре в 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):

procedure TMyDataModule.InsertIntoData(MyID: Int64; Bool1: Boolean; FOURCC: string; Comment: string; Arg1, Arg2, Arg3, Arg4: Byte);
var
  Query: TFDQuery;
begin
  Query := TFDQuery.Create(nil);
  try
    Query.Connection := MyConnectionComponent;
    Query.SQL.Text := 'INSERT INTO Data(MyID, Bool1, FOURCC, Comment, Arg1, Arg2, Arg3, Arg4) VALUES(:MyID, :Bool1, :FOURCC, :Comment, :Arg1, :Arg2, :Arg3, :Arg4)';
    Query.ParamByName('MyID').AsInteger := MyID;
    Query.ParamByName('Bool1').AsBoolean := Bool1;
    Query.ParamByName('FOURCC').AsString := FOURCC;
    Query.ParamByName('Comment').AsString := Comment;
    Query.ParamByName('Arg1').AsByte := Arg1;
    Query.ParamByName('Arg2').AsByte := Arg2;
    Query.ParamByName('Arg3').AsByte := Arg3;
    Query.ParamByName('Arg4').AsByte := Arg4;
    Query.ExecSQL;
  finally
    Query.Free;
  end;
end;

В этом примере мы создаем 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ошибки БД ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-23 12:37:59/0.0036039352416992/0