首页 文章

如何在整个Delphi应用程序中使用ID

提问于
浏览
0

我有一个MySql数据库,它有一个users表,所有其他表都连接到users表 .

如果我们登录到id = 1的用户 . 我们想使用user_id = 1向mysql发出所有请求,因此它只会显示来自该特定用户的数据 .

我的Delphi应用程序中有一个登录屏幕,用户可以在其中输入用户名和密码 . 成功登录后,我想要使用user_id并在整个应用程序中进行调用 . 我该怎么办?

成功登录后,我是否应该以某种方式在Delphi中输入此ID并在我们想要拨打电话时访问它?如果是这样,我如何在Delphi中保存此ID,以便以多种形式使用它?

1 回答

  • 2

    一种方法是将DataModule添加到项目中,并使 UserID 为其中的一个字段 .

    所以,使用Delphi的默认命名,你会有

    type
      TDataModule1 = class(TDataModule)
      [...]
      public
        property UserID : Integer read FUserID;
      end;
    
      [...]
      var
        DataModule1 : TDataModule1;
    

    然后,将TDataModule1添加到项目使用的db-access组件中,例如用于访问存储用户详细信息的Users表的Query组件,以及尝试登录给定用户的方法,以及db-access组件使用的类型的db-connection组件 . 所以你可以添加这样的方法:

    function TDataModule1.LogInUser(const UserName : String) : Boolean;
      begin
        try
          if qUsers.Active then
            qUsers.Close;
          FUserID := -1; // deliberately set an invalid UserID
          Assert(Trim(UserName) <> ''));  // raise exception if UserName is blank
          //  qUsers Sql.Text property would be something like 'select * from users where username = :username'
          qUsers.ParamByName(UserName).Value := UserName;
          qUsers.Open;
          if qUsers.Locate('UserName', UserName, []) then
            FUserID := qUsers.FieldByName('UserID').AsInteger;
        finally
          Result := FUserID >= 0;  // assuming   zero is a valid UserID
        end;
      end;
    

    并以 DataModule1u 的名称保存模块 . 请注意,此方法省略了对默认 True 值的用户's password: This is because if you leave your db connection component' s LoginPrompt 属性的任何引用,它将在 LogInUser 方法执行时弹出用户密码的提示 .

    一旦你've got that far, go to your Login form'单位并编辑它为USE DataModule1u .

    然后你可以添加代码来使用 LogInUser 方法,如下所示:

    if DataModule1.LogInUser(UserName) then begin
    
         Caption := 'User: ' + IntToStr(DataModule1.UserID);
         //  do something else with DataModule1.UserID's value
       end;
    

    显然,您可以(并且通常应该)将所有数据库访问组件添加到数据模块中,并在执行db-access的表单中使用它 .

    希望这一切都清楚,如果不是那么问 .

相关问题