gpt4 book ai didi

sql - delphi ExecSQL 成功还是失败

转载 作者:行者123 更新时间:2023-12-03 15:43:34 26 4
gpt4 key购买 nike

您好,我有这个函数可以使用 TUniQuery 更新我的 Access DB:

var
Res:Boolean;
begin
Res:=false;
try
with MyQuery do
begin
Active := false;
SQL.Clear;
SQL.Add('Update MYTABLE');
SQL.Add('set username='+QuotedStr(NewUserName));
SQL.Add(',password='+QuotedStr(NewPassword));
SQL.Add('where username='+QuotedStr(ACurrentUserName));
ExecSQL;
Res:=true;
end;
except
Res:=False;
end ;
Result:=Res;
end;

使用 Try ... except 是否足以知道“ExecSQL”何时成功或失败?

或者还有其他更好的方法吗?

谢谢

最佳答案

如果没有引发异常,您可能会认为更新已成功。这意味着数据库可以响应并解析并执行您的语句,没有语法错误。

在如图所示的语句中,您可能还想确保一行已更新,因为我认为这就是您的意图。

要检查这一点,您可以使用 ExecSQL 方法的结果,该方法返回受语句执行影响的行数。因此,您可以将代码更改为:

begin
with MyQuery do
begin
Active := false;
SQL.Clear;
SQL.Add('Update MYTABLE');
SQL.Add('set username='+QuotedStr(NewUserName));
SQL.Add(',password='+QuotedStr(NewPassword));
SQL.Add('where username='+QuotedStr(ACurrentUserName));
Result := ExecSQL = 1; //exactly 1 row updated
end;
end;

我还更改了无条件异常处理程序,因为它可能不是处理任何异常的正确位置,并且还删除了用于存储结果的局部变量,因为这确实没有必要。

阅读您添加的文字并重新思考您的问题后:

Is the use of Try ... except enough to KNOW when " ExecSQL " succeeds or fails ?

您确实必须改变关于异常处理和从此例程返回 bool 值的想法。异常是作为一个关于如何解决程序中的异常和错误情况的全新概念引入的,但是您正在扼杀这种全新的(恕我直言,更好)方法,并诉诸旧的方法来返回指示成功或失败的值。

特别是吃掉任何异常的 try/exception block 是一种不好的做法,因为您将杀死可能因太多原因引发的异常:内存不足、网络问题(例如连接丢失)数据库等

您必须重新考虑您的方法,并在应用程序的适当级别处理这些异常或错误情况。

我的建议是:

  • 将其从函数更改为过程,新的约定是:仅在成功时返回,否则引发异常。
  • 如果发生异常,让它飞出例程并在其他地方处理该情况
  • 如果没有恰好更新 1 行,则引发您自己的异常
  • 更改查询以使用参数(避免 SQL 注入(inject))

例程可能如下所示:

procedure TMySecurityManager.ChangeUserNameAndPassword();
begin
MyQuery.SQL.Text := 'Update MYTABLE'
+ ' set username = :NewUserName'
+ ' , password = :NewPassword'
+ ' where username = :username';
MyQuery.Params.ParamByName('NewUserName').AsString := NewUserName;
MyQuery.Params.ParamByName('NewPassword').AsString := NewPassword;
MyQuery.Params.ParamByName('username').AsString := ACurrentUserName;
if MyQuery.ExecSQL <> 1 then
raise EUpdateFailed.Create('A internal error occurred while updating the username and password');
//EUpdateFailed is a hypotetical exception class you defined.
end;

关于sql - delphi ExecSQL 成功还是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14511442/

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