Delphi XE7 и BDE TStoredProc беда?

Я должен перенести старый Delphi 4/BDE/Firebird 1.5. В качестве первого шага я хотел бы преобразовать его в Delphi XE7/BDE/Firebird 1.5. Когда все или большинство ошибок миграции будут исправлены, я обновлю Firebird и позже смогу изменить BDE.

Но у меня есть проблемы с простым использованием TStoredProc с не возвращает никаких значений в своем списке параметров после ExecProc,

Под Delphi 4, чтобы протестировать новый проект, я поставил TDatabase и TStoredProc составная часть. в 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;   

Хорошее значение "10061" для этого теста показано с помощью ParamByName('IP_USER') или же Params[3],

Я делаю то же самое в Delphi XE7, новой форме, помещаю два компонента, и соединение с моей базой данных Firebird кажется хорошим, и я выбрал хранимую процедуру во время разработки.

Но во время выполнения у меня всегда есть "0" либо с помощью ParamByName или же Params[3],

Используя FireDac, я могу прочитать хорошее значение, но так как у меня много компонентов BDE и большого количества кода, мне не нравится преобразовывать коды Delphi и изменять слой BDE одновременно.

Обновление 1: Как и просили, вот код SQL процедуры:

ALTER PROCEDURE PROC_VERIF_USER (
  XID_MASTER Integer,
  XLOG Varchar(20),
  XPASS Varchar(13) )
RETURNS (
  IP_USER Integer,
  IP_PROFIL Integer,
  LIB_USER Varchar(50),
  LOG_USER Varchar(20),
  PASS_USER Varchar(13),
  ERR_MSG Varchar(100) )
AS
  Declare variable vexclu char(1);
  Declare variable vitmp integer;
begin
  ip_user = 0;
  Err_Msg = '';
  FOR SELECT
    SO.IP_SOCIETE,
    SO.SOCIETE_CLE,
    SO.SOCIETE_EAN13,
    SO.SOCIETE_RAISON_SOCIALE,
    SO.SOCIETE_EXCLU,
    SO.ID_CLASSE_PRINCIPALE
  FROM SOCIETE SO
  WHERE
    (SO.ID_MASTER = 1) AND
    (SO.IDS_SOCIETE_TYPE = 'U') AND
    (SO.SOCIETE_CLE = CHARUPPER(:xlog)) AND
    (SCOMPARE(SO.SOCIETE_EAN13, :xpass)=0)
  PLAN (SOCIETE INDEX (FIX_SOCIETE_CLE))
  INTO :ip_user, :log_user, :pass_user, :lib_user, :vexclu, :ip_profil
  DO
  BEGIN
    IF ((Err_Msg = '') and (icompare(ip_profil,0)<>0)) THEN
    BEGIN
     SELECT      F_SUBSTR(CHR(13)||:XID_MASTER||CHR(13),CHR(13)||OBJET_LIBELLE||CHR(13))
     FROM OBJET
     WHERE IP_OBJET = :ip_profil
     INTO :vitmp;
       if (vitmp >- 1) then Err_Msg = '%s : Utilisateur non autorisé dans   cette société ';
  END
    IF (Err_Msg <> '') THEN
    BEGIN
      ip_user = 0;
      EXIT;
    END
 END
 IF (ip_user=0) THEN
   Err_Msg = '%s : Utilisateur ou mot de passe inconnu';
 end^

Поскольку это работает под Delphi 4 / BDE и Delphi XE7/FireDac, я не думаю, что проблема может возникнуть из-за этого, но вы никогда не знаете.

Обновление 2: я добавил приостановку в моей процедуре и использую BDE TQuery с SELECT * FROM PROC_VERIF_USER(:master,:username,:password) и я читаю данные с FieldByName() и это работает...

У меня действительно проблемы с BDE TStoredProc составная часть...

Я собираюсь попробовать другую процедуру из моей базы данных, чтобы убедиться, что проблема не в процедуре.

Благодарю.

1 ответ

Решение

ЗАКЛЮЧИТЕЛЬНО Ну, я нашел мое решение на самом деле очень просто, когда вы это знаете... Замена Params[x].AsString с Params[x].AsAnsiString работает!! Я нашел это решение через несколько часов после обновления 2, но у меня не было времени сообщить об этом. Сожалею. Спасибо за помощь.

Другие вопросы по тегам