При переходе с Delphi 4 и BDE на Delphi XE7 и BDE, разработчики могут столкнуться с проблемами, связанными с использованием компонента TStoredProc. В частности, при вызове хранимой процедуры, которая не возвращает значения в параметрах, может возникнуть ситуация, когда значения в параметрах остаются нулевыми. Это может быть связано с особенностями обработки параметров в новых версиях Delphi.
Описание проблемы
Разработчик столкнулся с проблемой, при которой после вызова метода ExecProc у компонента TStoredProc параметры, которые должны были быть заполнены хранимой процедурой, оставались не измененными (с нулевыми значениями) в Delphi XE7. В то время как в Delphi 4 все работало корректно.
Шаги для воспроизведения проблемы
Создание нового проекта в Delphi XE7.
Добавление компонентов TDatabase и TStoredProc.
Настройка соединения с базой данных Firebird.
Выбор хранимой процедуры в дизайнере.
В коде формы в событии FormShow выполнение следующего кода:
if not Database1.Connected then
Database1.Connected := True;
with VerifUser2 do
begin
DatabaseName := Database1.DatabaseName;
Params[0].AsInteger := 1;
Params[1].AsString := 'nico';
Params[2].AsString := '';
ExecProc;
ShowMessage(ParamByName('IP_USER').AsString);
end;
Ожидается, что параметр ParamByName('IP_USER') или Params[3] будет содержать значение, возвращаемое хранимой процедурой, но фактически оба параметра имеют значение 0.
Обновление 1: Код хранимой процедуры
В контексте обновления 1 приведен SQL код хранимой процедуры PROC_VERIF_USER, которая возвращает несколько параметров, включая IP_USER.
Процедура работает корректно как в Delphi 4 с BDE, так и в Delphi XE7 с FireDac, что исключает проблему в самом коде процедуры.
Обновление 2: Использование TQuery и SELECT * FROM PROC_VERIF_USER
Разработчик также упоминает, что добавление suspend в хранимую процедуру и использование TQuery для выполнения запроса SELECT * FROM PROC_VERIF_USER(:master,:username,:password) с чтением данных через FieldByName() привело к успешному результату. Это указывает на проблему, связанную с компонентом TStoredProc в BDE.
Подтвержденное решение
После ряда испытаний было обнаружено, что замена типов данных параметров с Params[x].AsString на Params[x].AsAnsiString решает проблему. Это простое изменение в коде позволяет корректно читать параметры хранимой процедуры после вызова ExecProc.
Пример кода с решением
if not Database1.Connected then
Database1.Connected := True;
with VerifUser2 do
begin
DatabaseName := Database1.DatabaseName;
Params[0].AsInteger := 1;
Params[1].AsAnsiString := 'nico';
Params[2].AsAnsiString := '';
ExecProc;
ShowMessage(ParamByName('IP_USER').AsString); // Теперь должен отображать корректное значение
end;
Заключение
Переход на новые версии Delphi может сопровождаться различными проблемами, в том числе и связанными с использованием компонентов BDE. В данном случае, проблема была решена путем изменения типа данных параметров, что позволило корректно работать с хранимой процедурой в Delphi XE7.
Разработчик столкнулся с проблемой чтения параметров хранимой процедуры в Delphi XE7 после перехода с BDE на FireDac, где значения параметров оставались нулевыми после вызова `ExecProc`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.