【问题标题】:Delphi XE7 and BDE TStoredProc trouble?Delphi XE7 和BDE TStoredProc 麻烦?
【发布时间】:2015-07-15 21:10:43
【问题描述】:

我必须迁移旧的 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 数据库的连接似乎很好,我在设计时选择了一个存储过程。

但在运行时,我总是使用 ParamByNameParams[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:我在我的程序中添加了一个暂停,并使用带有 SELECT * FROM PROC_VERIF_USER(:master,:username,:password) 的 BDE TQuery,我使用 FieldByName() 读取数据并且它可以工作...

BDE TStoredProc 组件确实有问题...

我将尝试我的数据库的其他过程,以确保问题不是来自该过程。

谢谢。

【问题讨论】:

  • 我们看不到存储过程的数据或代码,如果没有更多信息,我不确定如何提供帮助。
  • 您好,`IF (Err_Msg '')` 在`FOR SELECT` 中,如果不允许用户配置文件,则强制返回错误消息。另一个测试 IF (ip_user=0) THEN 在 FOR SELECT 之外,以防找不到用户名。但是,我不认为麻烦来自存储过程,因为她在 Delphi 4/BDE 和 Delphi XE7/FireDac 下返回值。问题出在 Delphi XE7/BDE 下。谢谢。

标签: delphi firebird delphi-xe7 bde


【解决方案1】:

FINAL 好吧,我发现我的解决方案实际上很简单,当您知道它时... 用Params[x].AsAnsiString 替换Params[x].AsString 有效!! 我在更新 2 后几个小时找到了这个解决方案,但没有时间报告它。对不起。 谢谢你的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多