Database 如何从数据库导入数据/信息值并将其显示在标签标题中?
我使用的数据库(都连接在一起):ADOConnection1、ADOQuery1、DataSource1、MS Access、Delphi 10.3 我正试图从我的数据库(在ms access数据库上)中获取值(所有类型,主要是字符串),并将它们作为数据库中的可显示文本放到文本标签中,以供精确连接的用户使用 所以我会尽可能多的给你提供信息 以下是我正在使用的完整代码:Database 如何从数据库导入数据/信息值并将其显示在标签标题中?,database,ms-access,delphi,delphi-10.3-rio,tadoquery,Database,Ms Access,Delphi,Delphi 10.3 Rio,Tadoquery,我使用的数据库(都连接在一起):ADOConnection1、ADOQuery1、DataSource1、MS Access、Delphi 10.3 我正试图从我的数据库(在ms access数据库上)中获取值(所有类型,主要是字符串),并将它们作为数据库中的可显示文本放到文本标签中,以供精确连接的用户使用 所以我会尽可能多的给你提供信息 以下是我正在使用的完整代码: procedure TLogin_Page.BitBtn2Click(Sender: TObject); begin
procedure TLogin_Page.BitBtn2Click(Sender: TObject);
begin
with DataModule5 do
begin
// using the following code will check if the credentials are correct, if its correct then Login
ADOQuery1.SQL.Text := 'SELECT UserCode FROM Credentials ' +
'WHERE (UserCode = :UserCode) ' +
'AND (Password = :Password)';
ADOQuery1.Parameters.ParamByName('UserCode').Value := username_field.Text;
ADOQuery1.Parameters.ParamByName('Password').Value := THashMD5.GetHashString(password_field.Text);
ADOQuery1.Open;
if not ADOQuery1.IsEmpty then
begin
ShowMessage('Welcome ' + username_field.text + ' !');
EasyPharmacy_Page.Show;
Login_Page.Hide;
// clears fields once logged in
username_field.Text:='';
password_field.Text:='';
end else
messageDlg('Incorrect Credentials', mtCustom, [mbOK], 0);
end;
// once the user connected, import all of the informations of the connected user
// the infos should be imported to labels texts in "MyAccountPage" form
// code below doesnt show values from database to label texts
with DataModule5 do
begin
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.add ('SELECT * FROM Credentials ' +
'WHERE (UserCode = :UserCode) ' +
'AND (Password = :Password) ' +
'AND (FirstName = :FirstName) ' +
'AND (LastName = :LastName) ' +
'AND (Age = :Age) ' +
'AND (Adminstrator = :Adminstrator) ');
Parameters.ParamByName('UserCode').Value;
Parameters.ParamByName('UserCode').DataType:= ftString;
// password hashed
Parameters.ParamByName('Password').GetHashCode;
Parameters.ParamByName('Password').Value;
Parameters.ParamByName('Password').DataType:= ftString;
// first name
Parameters.ParamByName('FirstName').Value;
Parameters.ParamByName('FirstName').DataType:= ftString;
// last name
Parameters.ParamByName('LastName').Value;
Parameters.ParamByName('LastName').DataType:= ftString;
// age
Parameters.ParamByName('Age').Value;
Parameters.ParamByName('Age').DataType:= ftInteger;
// administrator permissions
Parameters.ParamByName('Adminstrator').Value;
Parameters.ParamByName('Adminstrator').DataType:= ftboolean;
Prepared := true;
with MyAccountPage do
begin
open;
UsernameDetail.Caption := FieldByName('UserCode').AsString;
PasswordDetail.Caption := FieldByName('Password').asString;
FirstName.Caption := FieldByName('FirstName').AsString;
LastName.Caption := FieldByName('LastName').AsString;
MyAge.Caption := FieldByName('Age').AsString;
end;
end;
end;
end;
我不确定我遇到的问题是否存在于我在这里使用的代码中,它似乎不起作用,或者做了我想做的事情(将值显示到标签?):
当我运行我的程序时,它只清除用户信息应该显示的标签和标题
如果您想知道我在将数据插入数据库的“注册”页面中写了什么:
with DataModule5 do
begin
ADOquery1.Close;
ADOquery1.SQL.Clear;
ADOquery1.SQL.Add('INSERT INTO Credentials ([UserCode], [Password], [FirstName], [LastName], [Age], [Adminstrator]) ');
ADOquery1.SQL.Add('VALUES (:UserCode, :Password, :FirstName, :LastName, :Age, :Adminstrator) ');
// Username + Password Data
ADOquery1.Parameters.ParamByName('UserCode').Value := username_text.Text;
ADOquery1.Parameters.ParamByName('Password').Value := THashMD5.GetHashString(Confirm_Password_Text.Text);
// User's First and Last name Data
ADOquery1.Parameters.ParamByName('FirstName').Value := FName_input.Text;
ADOquery1.Parameters.ParamByName('LastName').Value := LName_input.Text;
ADOquery1.Parameters.ParamByName('Age').value := Age_input.Text;
// Administrator's Permission
if AdminPrivilege.Checked = true then
begin
ADOquery1.Parameters.ParamByName('Adminstrator').Value:=-1;
end;
if AdminPrivilege.Checked = False then
begin
ADOquery1.Parameters.Parambyname('Adminstrator').Value:=0;
end;
ADOquery1.ExecSQL;
ShowMessage('a new account has been created successfully');
end;
如果我的代码有问题,请告诉我…在BitBtn2中单击可将Prepared属性设置为true,但不是查询的Active属性。我成功解决了我遇到的问题(感谢@ken white的澄清) 我将
TLabel
组件替换为TDBText
,然后在loggin过程中设置每个TDBText标签的datasource+Datafield,以显示从数据库到标签的数据,代码如下:
with DataModule5 do
begin
// using the following code will check if the credentials are correct, if its correct then Login
ADOQuery1.SQL.Text := 'SELECT * FROM Credentials ' +
'WHERE (UserCode = :UserCode) ' +
'AND (Password = :Password)';
ADOQuery1.Parameters.ParamByName('UserCode').Value := username_field.Text;
ADOQuery1.Parameters.ParamByName('Password').Value := THashMD5.GetHashString(password_field.Text);
ADOQuery1.Open;
if not ADOQuery1.IsEmpty then
begin
ShowMessage('Welcome ' + username_field.text + ' !');
EasyPharmacy_Page.Show;
// displayable profile information:
with MyAccountPage do
begin
//Connecting DataSource
with DataModule5 do
begin
usernamedetail.DataSource := DataSource1; // UserName
PasswordDetail.Datasource := DataSource1; // PassWord
FirstName.Datasource := DataSource1; // FirstName
LastName.Datasource := DataSource1; // LastName
MyAge.Datasource := DataSource1; // MyAge
end;
// filling DataField
UsernameDetail.DataField := 'UserCode';
PasswordDetail.DataField := 'Password';
FirstName.DataField := 'FirstName';
LastName.DataField := 'LastName';
MyAge.DataField := 'Age';
end;
Login_Page.Hide;
// clears fields once logged in
username_field.Text:='';
password_field.Text:='';
end else
messageDlg('Incorrect Credentials', mtCustom, [mbOK], 0);
end;
为什么用标签而不是文本框显示数据?@June7嘿,你说的文本框是什么意思?回顾一下。标签用于静态显示数据的描述性信息、文本框(或组合框、复选框、单选按钮)。除了清除数据,你还想让代码做什么?@June7我不想让代码清除数据,或者你提到的任何事情。我只想将我的数据从数据库导入到用户配置文件界面中的标签连接的用户应该有他的帐户信息(来自数据库)显示在标签文本中,仅此而已。我的delphi版本中不存在Ttextbox组件我设置的
prepared
用于DataModule5.ADOQuery1.prepared
这并没有提供问题的答案。一旦你有足够的钱,你将能够;相反你为什么要用代码做这些工作?几乎所有这些都可以在设计时使用Object Inspector完成。我知道,但当我从Object Inspector设置它们时,我在尝试“创建新帐户”时遇到了另一个问题,我必须将DBText.Datasource
和DBText.DataField
保持为空(从Object Inspector属性)为了避免任何问题,这就是为什么将这些设置在代码端更好的原因,工作起来没有任何问题。您可以在设计时使用硬编码值设置查询,连接所有控件,然后编辑查询以使用参数进行设置。然后在运行时,您所要做的就是设置参数并打开查询,其他一切都由VCL自动完成。您在这里编写了太多不必要的代码。如果需要,可以使用两个不同的查询—一个用于创建新帐户,另一个用于随后进行选择。然后使用SELECT查询连接控件以显示数据。要编写的代码仍然减少了80%。正如我所说,如果需要,您可以使用两个独立的查询,而不是一个。不理解如何正确地完成它并不是编写大量代码的理由;解决的办法是学会正确操作,这样你就可以在每个应用程序中节省所有的时间。拥有一个单独的ADOQuery(例如命名为NewAccountQuery
)和一个显示查询(命名为likeShowDataQuery
)绝对没有错。如果你把这两个操作符分开,你的代码实际上会更清晰。啊,我可以做到,我没有想过用两个查询来分开它们,因为我整天都在做我的程序,所以我对此感到非常紧张。但我会记下这些,我也会试着把它们分开,减少我的代码,让它像你说的那样工作。为此我非常感谢你,真的很感激你!
with DataModule5 do
begin
// using the following code will check if the credentials are correct, if its correct then Login
ADOQuery1.SQL.Text := 'SELECT * FROM Credentials ' +
'WHERE (UserCode = :UserCode) ' +
'AND (Password = :Password)';
ADOQuery1.Parameters.ParamByName('UserCode').Value := username_field.Text;
ADOQuery1.Parameters.ParamByName('Password').Value := THashMD5.GetHashString(password_field.Text);
ADOQuery1.Open;
if not ADOQuery1.IsEmpty then
begin
ShowMessage('Welcome ' + username_field.text + ' !');
EasyPharmacy_Page.Show;
// displayable profile information:
with MyAccountPage do
begin
//Connecting DataSource
with DataModule5 do
begin
usernamedetail.DataSource := DataSource1; // UserName
PasswordDetail.Datasource := DataSource1; // PassWord
FirstName.Datasource := DataSource1; // FirstName
LastName.Datasource := DataSource1; // LastName
MyAge.Datasource := DataSource1; // MyAge
end;
// filling DataField
UsernameDetail.DataField := 'UserCode';
PasswordDetail.DataField := 'Password';
FirstName.DataField := 'FirstName';
LastName.DataField := 'LastName';
MyAge.DataField := 'Age';
end;
Login_Page.Hide;
// clears fields once logged in
username_field.Text:='';
password_field.Text:='';
end else
messageDlg('Incorrect Credentials', mtCustom, [mbOK], 0);
end;