代码之家  ›  专栏  ›  技术社区  ›  Soon Santos

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

  •  0
  • Soon Santos  · 技术社区  · 7 年前

    我有一个mysql数据库,它有一个用户表,所有其他表都连接到用户表。

    如果我们登录到一个id=1的用户。我们希望使用用户_id=1向MySQL发出所有请求,因此只显示来自该特定用户的数据。

    我在Delphi应用程序中有一个登录屏幕,用户可以在其中输入用户名和密码。在成功登录之后,我想让这个用户通过这个应用程序进行调用。我该怎么做?

    在成功登录之后,我是否应该以某种方式在Delphi中提取这个ID,并在我们想打电话时访问它?如果是这样,我如何将这个ID保存在Delphi中,以便在多个表单中使用它?

    1 回复  |  直到 7 年前
        1
  •  2
  •   MartynA    7 年前

    这样做的一种方法是向项目中添加一个数据模块,并使 UserID 一 这个领域。

    因此,使用Delphi的默认命名,您将

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

    然后,将项目使用的DB访问组件(例如查询)添加到TDataModule1中。 用于访问存储用户详细信息的用户表的组件,以及用于 尝试在给定的用户中登录,也可以使用数据库访问组件使用的类型的数据库连接组件。所以您可以添加这样的方法:

      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 . 请注意,此方法省略了对用户密码的任何引用:这是因为如果您离开DB连接组件的 LoginPrompt 默认情况下的属性 True 值,当 LogInUser 方法执行。

    一旦你做到了这一点,就去你的登录表单的单位并编辑它来使用 DATAMODULU1U .

    然后您可以向它添加代码以使用 登录用户 方法如下:

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

    显然,您可以(通常也应该)将所有DB访问组件添加到数据模块中 并在进行数据库访问的表单中使用它。

    希望这一切都清楚,如果不清楚,那就问吧。