gpt4 book ai didi

delphi - FireDac 连接问题

转载 作者:行者123 更新时间:2023-12-01 23:35:15 25 4
gpt4 key购买 nike

我使用的是这里的示例:

establishing connection

这样做:

procedure TDataModule2.DataModuleCreate(Sender: TObject);
begin
with FDGUIxLoginDialog1.VisibleItems do begin
Clear;
Add('Server=Strežnik');
Add('User_name=Uporabnik');
Add('Password=Geslo');
Add('Database=Baza');
end;
try
FDConnection1.Connected := True;
except
on E: EAbort do
application.terminate; // user pressed Cancel button in Login dialog

on E:EFDDBEngineException do
case E.Kind of
ekUserPwdInvalid: ; // user name or password are incorrect
//ekUserPwdExpired: ; // user password is expired
ekServerGone: ; // DBMS is not accessible due to some reason
else
// other issues
end;
end;
end;

但是,在登录对话框中单击“取消”后,应用程序不会终止,而是显示我的主窗体。我应该做什么来纠正这个问题?

此外,在这种情况下,如果密码错误,我该如何闪烁消息?

Firedac 正在连接到 SQL Server。

ps

即使这样也行不通:

.....
except
on E: EFDDBEngineException do
if E.Kind = ekUserPwdInvalid then
begin
ShowMessage('A user name or a password are invalid');
Abort;
end;

最佳答案

应用程序通常通过关闭其主窗体来退出。
您永远不应该通过发出异常来让应用程序退出;这是不好的形式。

EAbort 不是登录对话框发出的异常。事实上正常情况下登录对话框不会出现任何异常。
如果用户按取消,那么连接将不会获得呃..连接,您可以测试一下。
Here's a list of all the errors TFDConnection can generate .

以下代码应该可以工作:

type
TAction = (aSuccess, aGiveup, aWrongPassword, aPasswordExpired);

procedure TDataModule2.DataModuleCreate(Sender: TObject);
var
VI: TStrings;
WhatToDo: TAction;
begin
WhatToDo:= aSuccess;
VI:= FDGUIxLoginDialog1.VisibleItems;
VI.Clear;
VI.Add('Server=Strežnik');
VI.Add('User_name=Uporabnik');
VI.Add('Password=Geslo');
VI.Add('Database=Baza');
try
FDConnection1.Connected := True;
except
on E:EFDDBEngineException do case E.Kind of
ekUserPwdInvalid: WhatToDo:= aWrongPassword;
ekUserPwdExpired: WhatToDo:= aPasswordExpired;
else WhatToDo:= aGiveUp;
end; {case}
end;
if Not(FDConnection1.Connected) then WhatToDo:= aGiveUp;
case Action of
aWrongPassword: begin
ShowMessage('You've entered a wrong username or password please try again');
DataModuleCreate(Sender);
Action:= aSuccess;
end;
aPasswordExpired: ShowMessage('You password has expired, please request a new one from the PHB');
end;
if Action <> aSuccess then Application.Terminate;
end;

关于编码风格的评论
不要使用 withWith是邪恶的,而是使用临时变量并使用它来引用嵌套变量。

在错误发生时终止而不发出错误是非常愚蠢的。
如果应用程序在没有任何解释的情况下死掉,任何用户都不会高兴。

您永远不应该因错误的密码或用户名而终止。
至少给用户更改重试 3 或 4 次的机会。
如果他没有得到正确的结果,则发出“错误的用户名或密码”错误消息并退出。
永远不要告诉用户哪一个(用户名或密码)是错误的,攻击者可以使用它来生成用户名列表。

关于delphi - FireDac 连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32006827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com