Delphi 出现奇怪的 ADO 数据库问题
Having weird ADO database issues with Delphi
对于我一直在处理的学校项目的问题,我真的很感激能得到一些帮助。你们认为可能有什么问题?
我和一位朋友谈过,他说我必须确保在任何给定时间我只有 1 table 的活动 属性 设置为 true。我试过了,但似乎没有什么不同。可能是我做的不对?
这是我的程序代码:
procedure TForm1.btnChangePassUserClick(Sender: TObject);
var
sNewPass,sOldPass:string;
begin
sOldPass:= InputBox('Password verification','Please enter your current password','');
if sOldPass = sPassword then
begin
sNewPass := inputBox('Password change','Please enter a new Password with at least 1 number and letter','');
if isPasswordValid(sNewPass) then
begin
tblUsers.Active := True;
tblUsers.Edit;
tblUsers.Filtered := True;
tblUsers.Filter := 'UserID = ' +QuotedStr(sPassword);
tblUsers.First;
tblUsers['Password'] := sNewPass;
tblUsers.Post;
tblUsers.Filtered := False;
tblUsers.Filter := '';
if bRememberMe then
begin
ShowMessage('Password changed, please log in again for security purposes');
imgLogoutClick(Sender);
end;
sPassword := sNewPass;
end
else ShowMessage('Please ensure your password contains at least 1 letter and 1 number');
end
else ShowMessage('Incorrect Password');
end;
我得到的错误:
tblUsers: Dataset not in edit or insert mode
tblUsers.First
可能会导致滚动。我猜数据集发布在那个卷轴上。
在通过 tblUsers['Password'] := sNewPass;
分配新密码之前尝试调用 tblUsers.Edit
。
正如 MartynA 所建议的,还有另一个问题会阻止您的代码正常工作,即使上述问题已得到修复。 tblUsers.Filter := 'UserID = ' +QuotedStr(sPassword);
很可能不是您想做的。可能应该传递包含 UserID
的变量而不是 sPassword
.
如果我没记错的话,应该有一个函数叫Locate
。它也应该比过滤器更快。
您对 Edit
、Filter
和 Filtered
的使用都不正确。只有在实际编辑该行时才需要 Edit
;光标(记录指针)位置的任何更改都将取消或 post 更改,使 table 退出编辑模式(因此您的错误)。
您也不应使用 Filter
搜索要编辑的数据。请改用 Locate
。像这样的东西应该适合你(虽然它可能不是我在我自己的代码中使用的东西):
procedure TForm1.btnChangePassUserClick(Sender: TObject);
var
sNewPass,sOldPass:string;
begin
sOldPass:= InputBox('Password verification','Please enter your current password','');
if sOldPass = sPassword then
begin
sNewPass := inputBox('Password change','Please enter a new Password with at least 1 number and letter','');
if isPasswordValid(sNewPass) then
begin
tblUsers.Active := True;
// I'd think the search should be on the UserID rather than
// the password. Are you certain this is what you want to do?
if tblUsers.Locate('UserID', sPassword, []) then
begin
tblUsers.Edit;
tblUsers['Password'] := sNewPass;
tblUsers.Post;
end;
tblUsers.Active := False;
if bRememberMe then
begin
ShowMessage('Password changed, please log in again for security purposes');
imgLogoutClick(Sender);
end;
sPassword := sNewPass;
end
else ShowMessage('Please ensure your password contains at least 1 letter and 1 number');
end
else
ShowMessage('Incorrect Password');
end;
对于我一直在处理的学校项目的问题,我真的很感激能得到一些帮助。你们认为可能有什么问题?
我和一位朋友谈过,他说我必须确保在任何给定时间我只有 1 table 的活动 属性 设置为 true。我试过了,但似乎没有什么不同。可能是我做的不对?
这是我的程序代码:
procedure TForm1.btnChangePassUserClick(Sender: TObject);
var
sNewPass,sOldPass:string;
begin
sOldPass:= InputBox('Password verification','Please enter your current password','');
if sOldPass = sPassword then
begin
sNewPass := inputBox('Password change','Please enter a new Password with at least 1 number and letter','');
if isPasswordValid(sNewPass) then
begin
tblUsers.Active := True;
tblUsers.Edit;
tblUsers.Filtered := True;
tblUsers.Filter := 'UserID = ' +QuotedStr(sPassword);
tblUsers.First;
tblUsers['Password'] := sNewPass;
tblUsers.Post;
tblUsers.Filtered := False;
tblUsers.Filter := '';
if bRememberMe then
begin
ShowMessage('Password changed, please log in again for security purposes');
imgLogoutClick(Sender);
end;
sPassword := sNewPass;
end
else ShowMessage('Please ensure your password contains at least 1 letter and 1 number');
end
else ShowMessage('Incorrect Password');
end;
我得到的错误:
tblUsers: Dataset not in edit or insert mode
tblUsers.First
可能会导致滚动。我猜数据集发布在那个卷轴上。
在通过 tblUsers['Password'] := sNewPass;
分配新密码之前尝试调用 tblUsers.Edit
。
正如 MartynA 所建议的,还有另一个问题会阻止您的代码正常工作,即使上述问题已得到修复。 tblUsers.Filter := 'UserID = ' +QuotedStr(sPassword);
很可能不是您想做的。可能应该传递包含 UserID
的变量而不是 sPassword
.
如果我没记错的话,应该有一个函数叫Locate
。它也应该比过滤器更快。
您对 Edit
、Filter
和 Filtered
的使用都不正确。只有在实际编辑该行时才需要 Edit
;光标(记录指针)位置的任何更改都将取消或 post 更改,使 table 退出编辑模式(因此您的错误)。
您也不应使用 Filter
搜索要编辑的数据。请改用 Locate
。像这样的东西应该适合你(虽然它可能不是我在我自己的代码中使用的东西):
procedure TForm1.btnChangePassUserClick(Sender: TObject);
var
sNewPass,sOldPass:string;
begin
sOldPass:= InputBox('Password verification','Please enter your current password','');
if sOldPass = sPassword then
begin
sNewPass := inputBox('Password change','Please enter a new Password with at least 1 number and letter','');
if isPasswordValid(sNewPass) then
begin
tblUsers.Active := True;
// I'd think the search should be on the UserID rather than
// the password. Are you certain this is what you want to do?
if tblUsers.Locate('UserID', sPassword, []) then
begin
tblUsers.Edit;
tblUsers['Password'] := sNewPass;
tblUsers.Post;
end;
tblUsers.Active := False;
if bRememberMe then
begin
ShowMessage('Password changed, please log in again for security purposes');
imgLogoutClick(Sender);
end;
sPassword := sNewPass;
end
else ShowMessage('Please ensure your password contains at least 1 letter and 1 number');
end
else
ShowMessage('Incorrect Password');
end;