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