DelphiXE7和BDE TStoredProc麻烦吗?
Delphi XE7 and BDE TStoredProc trouble?
我必须迁移旧的 Delphi 4/BDE/Firebird 1.5。作为第一步,我想在 Delphi XE7/BDE/Firebird 1.5 下转换它。当所有或大部分迁移错误得到纠正时,我将更新 Firebird 并可能稍后更改 BDE。
但是我在简单使用 TStoredProc
时遇到了问题,在 ExecProc
.
之后他的参数列表中没有 return 任何值
在 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 数据库连接似乎很好,我在设计时选择了一个存储过程。
但在 运行 时,我总是使用 ParamByName
或 Params[3]
得到 '0'。
使用 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)
,我用 [= 读取数据24=] 并且有效...
BDE TStoredProc
组件我真的有问题...
我将尝试我的数据库的其他过程,以确保问题不会来自该过程。
谢谢。
FINAL 嗯,我发现我的解决方案其实很简单,当你知道的时候......
将 Params[x].AsString
替换为 Params[x].AsAnsiString
有效!!
我在 Update 2 几个小时后找到了这个解决方案,但没有时间报告它。对不起。
谢谢你的帮助。
我必须迁移旧的 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 数据库连接似乎很好,我在设计时选择了一个存储过程。
但在 运行 时,我总是使用 ParamByName
或 Params[3]
得到 '0'。
使用 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)
,我用 [= 读取数据24=] 并且有效...
BDE TStoredProc
组件我真的有问题...
我将尝试我的数据库的其他过程,以确保问题不会来自该过程。
谢谢。
FINAL 嗯,我发现我的解决方案其实很简单,当你知道的时候......
将 Params[x].AsString
替换为 Params[x].AsAnsiString
有效!!
我在 Update 2 几个小时后找到了这个解决方案,但没有时间报告它。对不起。
谢谢你的帮助。