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

时间:2018-12-09 18:16:51

标签: delphi

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

如果我们登录到id = 1的用户,我们希望使用user_id = 1向mysql发出所有请求,那么将仅显示该特定用户的数据。

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

成功登录后,我应该以某种方式在Delphi中存储此ID并在我们要拨打电话时进行访问吗?如果是这样,如何将这个ID保存在Delphi中,以便可以几种形式使用它?

1 个答案:

答案 0 :(得分:2)

一种方法是将DataModule添加到您的项目中,然后将UserID设置为

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

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

  [...]
  var
    DataModule1 : TDataModule1;

然后,将您的项目使用的db-access组件添加到TDataModule1中,例如一个问题 用于访问存储用户详细信息的“用户”表的组件以及一种用于 尝试登录给定的用户,以及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的名称下。请注意,此方法忽略了对用户密码的任何引用:这是因为如果您将数据库连接组件的LoginPrompt属性保留为默认的True值,则当用户输入密码时,它将弹出提示输入用户密码的提示。 LogInUser方法执行。

您已经做好了准备,请转到登录表单的单元,然后将其编辑为USE DataModule1u

然后,您可以向其中添加代码以使用LogInUser方法,如下所示:

   if DataModule1.LogInUser(UserName) then begin

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

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

希望一切都清楚了,如果没有的话再问。