Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何从数据库导入数据/信息值并将其显示在标签标题中?_Database_Ms Access_Delphi_Delphi 10.3 Rio_Tadoquery - Fatal编程技术网

Database 如何从数据库导入数据/信息值并将其显示在标签标题中?

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

我使用的数据库(都连接在一起):ADOConnection1、ADOQuery1、DataSource1、MS Access、Delphi 10.3

我正试图从我的数据库(在ms access数据库上)中获取值(所有类型,主要是字符串),并将它们作为数据库中的可显示文本放到文本标签中,以供精确连接的用户使用

所以我会尽可能多的给你提供信息

以下是我正在使用的完整代码:

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
)和一个显示查询(命名为like
ShowDataQuery
)绝对没有错。如果你把这两个操作符分开,你的代码实际上会更清晰。啊,我可以做到,我没有想过用两个查询来分开它们,因为我整天都在做我的程序,所以我对此感到非常紧张。但我会记下这些,我也会试着把它们分开,减少我的代码,让它像你说的那样工作。为此我非常感谢你,真的很感激你!
 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;