我有一个MySql数据库,该数据库有一个users表,所有其他表都连接到users表。
如果我们登录到id = 1的用户,我们希望使用user_id = 1向mysql发出所有请求,那么将仅显示该特定用户的数据。
我在Delphi应用程序中有一个登录屏幕,用户可以在其中输入他的用户名和密码。成功登录后,我要使用user_id并在整个应用程序中进行呼叫。我该怎么办?
成功登录后,我应该以某种方式在Delphi中存储此ID并在我们要拨打电话时进行访问吗?如果是这样,如何将这个ID保存在Delphi中,以便可以几种形式使用它?
答案 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;
很显然,您可以(通常应该)将所有数据库访问组件添加到数据模块中 并在执行数据库访问的表单中使用它。
希望一切都清楚了,如果没有的话再问。