2015-05-05 3 views
1

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

Но у меня возникли проблемы при простом использовании 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.

Update 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 Я не думаю, что проблема может исходить из этого, но вы никогда не знаете.

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

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

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

Спасибо.

+0

Мы не можем видеть данные или код хранимой процедуры, я не уверен, как мы можем помочь без дополнительной информации. –

+0

Здравствуйте, 'IF (Err_Msg <> '')' находится в 'FOR SELECT' и принудительно возвращает сообщение с сообщением об ошибке в случае, если профиль пользователя не разрешен. Другой тест IF (ip_user = 0) THEN находится за пределами FOR SELECT, если имя пользователя не найдено. Но я не думаю, что проблема возникла из хранимой процедуры, когда она возвращает значения под Delphi 4/BDE и Delphi XE7/FireDac. Проблема заключается в Delphi XE7/BDE. Благодарю. –

ответ

1

FINAL Ну я нашел мое решение на самом деле очень просто, когда вы знаете это ... Замена Params[x].AsString с Params[x].AsAnsiString работает !! Я нашел это решение через несколько часов после обновления 2, но не успел сообщить об этом. Сожалею. Спасибо за помощь.

Смежные вопросы