在 Delphi 中从 DataModule 读取和写入 .accdb 文件
Reading and writing .accdb file from DataModule in Delphi
我正在制作一个学校项目,其中包括创建数据库以及读取和写入数据库。在 DataModule 中,我使用 TAdoCommand 在 运行 时间内创建了数据库,效果很好,现在我需要读取和写入它。我使用访问将一些测试数据放入数据库,但它无法读取数据库。
DataModule 这是设计中的数据模块的图片。我创建了一个连接、查询、数据源和 table,它们都链接在一起。 TAdoCommand 用于创建数据库。查询中的SQL命令为“SELECT用户名,密码
来自用户
然后我有一个登录表单,我希望用它来读取用户 table 和数据库以检查用户是否存在于数据库中。
procedure TLoginFrm.LoginBtnClick(Sender: TObject);
var Username, Password : String;
i, NoOfRecords : Integer;
IsMatch : Boolean;
begin
NoOfRecords := modFile.adoDataSet.RecordCount;
if NoOfRecords = 0 then
begin
NewUserFrm.Show;
Application.Messagebox('There are currently no users. Please create new user.','Error');
UsernameBox.Text := '';
PasswordBox.Text := '';
end
else
begin
IsMatch := False;
modFile.adoDataSet.First;
Username := modFile.adoDataSet.FieldByName('Username').AsString;
Password := modFile.adoDataSet.FieldByName('Password').AsString;
for i := 1 to NoOfRecords do
begin
if (Username = UsernameBox.Text) and (Password = PasswordBox.Text) then
begin
LoginFrm.Hide;
CurrentUser := Username;
MainMenuFrm.Show;
IsMatch := True;
end
else
begin
modFile.adoDataSet.Next;
Username := modFile.adoDataSet.FieldByName('Username').AsString;
Password := modFile.adoDataSet.FieldByName('Password').AsString;
end;
end;//End of for loop
if not IsMatch then
begin
Application.MessageBox('Incorrect username or password. Try again.','Error');
UsernameBox.Text := '';
PasswordBox.Text := '';
LoginBtn.SetFocus;
end;
end;//End of parent Else
end;
当我使用 Access 输入测试数据时,它 returns 消息框 "Incorrect username or password. Try again"。所以它认识到 table 中有超过 0 条记录,但是它无法读取实际数据。我哪里错了?
你 For
循环在这里不适合你。相反,您需要以这种方式迭代数据集:
else
begin
isMatch := false;
modFile.AdoDataset.first;
while not modFile.AdoDataset.eof do
begin
Username := modFile.AdoDataset.fieldbyname('Username').asstring;
Password := modFile.AdoDataset.fieldbyname('Password').asstring;
if (uppercase(Username) = uppercase(UsernameBox.text)) and (uppercase(Password) = uppercase(PasswordBox.text)) then
begin
IsMatch := True;
LoginFrm.Hide;
CurrentUser := Username;
MainForm.Show;
Exit; // no need to continue on once you have a match
end;
modFile.AdoDataset.next;
end;
end
else ...
您也可以完全跳过使用循环而只使用定位
else
begin
isMatch := modFile.AdoDataset.Locate('Username;Password', VarArrayOf[UsernameBox.text, PasswordBox.text], [loCaseInsensitive]);// remove loCaseInsensitive if you prefer case sensitivity
if isMatch then
begin
CurrentUser := UsernameBox.text;
Loginfrm.Hide;
MainForm.Show;
end;
end;
我正在制作一个学校项目,其中包括创建数据库以及读取和写入数据库。在 DataModule 中,我使用 TAdoCommand 在 运行 时间内创建了数据库,效果很好,现在我需要读取和写入它。我使用访问将一些测试数据放入数据库,但它无法读取数据库。
DataModule 这是设计中的数据模块的图片。我创建了一个连接、查询、数据源和 table,它们都链接在一起。 TAdoCommand 用于创建数据库。查询中的SQL命令为“SELECT用户名,密码 来自用户
然后我有一个登录表单,我希望用它来读取用户 table 和数据库以检查用户是否存在于数据库中。
procedure TLoginFrm.LoginBtnClick(Sender: TObject);
var Username, Password : String;
i, NoOfRecords : Integer;
IsMatch : Boolean;
begin
NoOfRecords := modFile.adoDataSet.RecordCount;
if NoOfRecords = 0 then
begin
NewUserFrm.Show;
Application.Messagebox('There are currently no users. Please create new user.','Error');
UsernameBox.Text := '';
PasswordBox.Text := '';
end
else
begin
IsMatch := False;
modFile.adoDataSet.First;
Username := modFile.adoDataSet.FieldByName('Username').AsString;
Password := modFile.adoDataSet.FieldByName('Password').AsString;
for i := 1 to NoOfRecords do
begin
if (Username = UsernameBox.Text) and (Password = PasswordBox.Text) then
begin
LoginFrm.Hide;
CurrentUser := Username;
MainMenuFrm.Show;
IsMatch := True;
end
else
begin
modFile.adoDataSet.Next;
Username := modFile.adoDataSet.FieldByName('Username').AsString;
Password := modFile.adoDataSet.FieldByName('Password').AsString;
end;
end;//End of for loop
if not IsMatch then
begin
Application.MessageBox('Incorrect username or password. Try again.','Error');
UsernameBox.Text := '';
PasswordBox.Text := '';
LoginBtn.SetFocus;
end;
end;//End of parent Else
end;
当我使用 Access 输入测试数据时,它 returns 消息框 "Incorrect username or password. Try again"。所以它认识到 table 中有超过 0 条记录,但是它无法读取实际数据。我哪里错了?
你 For
循环在这里不适合你。相反,您需要以这种方式迭代数据集:
else
begin
isMatch := false;
modFile.AdoDataset.first;
while not modFile.AdoDataset.eof do
begin
Username := modFile.AdoDataset.fieldbyname('Username').asstring;
Password := modFile.AdoDataset.fieldbyname('Password').asstring;
if (uppercase(Username) = uppercase(UsernameBox.text)) and (uppercase(Password) = uppercase(PasswordBox.text)) then
begin
IsMatch := True;
LoginFrm.Hide;
CurrentUser := Username;
MainForm.Show;
Exit; // no need to continue on once you have a match
end;
modFile.AdoDataset.next;
end;
end
else ...
您也可以完全跳过使用循环而只使用定位
else
begin
isMatch := modFile.AdoDataset.Locate('Username;Password', VarArrayOf[UsernameBox.text, PasswordBox.text], [loCaseInsensitive]);// remove loCaseInsensitive if you prefer case sensitivity
if isMatch then
begin
CurrentUser := UsernameBox.text;
Loginfrm.Hide;
MainForm.Show;
end;
end;