Delphi AdoDB Connection.Execute()异常处理

7hiiyaii  于 2023-05-06  发布在  其他
关注(0)|答案(2)|浏览(261)

我有这个密码

try
  ADOconnection1.connected:=true;
  ADOconnection1.Execute(memo1.Lines.text);
  if AdoConnection1.Connected then  AdoConnection1.Close;
  ShowMessage('Floorplan imported to DB');
except
  ShowMessage('DB error');
end;

工作正常,但异常处理还不够。
数据库错误消息显示查询存在语法错误。但是如何处理这样的异常呢?
Msg 2628,Level 16,State 1,Line 2
字符串或二进制数据将在表“sites.dbo.sites_plans”的列“building”中被截断。
截断值:'ISI_Head'。
语句已终止。
如果我在SQL Server Management Studio中手动运行查询,则没有插入任何内容,SQL Server会抛出错误,但我的应用程序显示“Floorplan imported to DB”,这是错误的。因为没有什么是真正插入的。
是否可以从

ADOconnection1.Execute(memo1.Lines.text);

插入了多少行?或者返回一些代码来处理错误?
谢谢你的帮助

92dk7w1h

92dk7w1h1#

您必须处理exceptions才能知道究竟引发了什么异常。你可以用这种方式改变代码中的异常块来准确地捕捉异常消息。

except
  on e: exception do
  begin
    ShowMessage('DB error'#13#10 + e.Message + #13#10 + e.ClassName);
  end;
end;

您可以根据e.Message的值进行操作。
This也很有用。
在 Delphi 中,你会收到SQL Server的“查询执行响应”文本。如果要解析提取细节,需要在Exception中的e.Message上手动完成。
如果你想知道更多的细节,比如有多少行受到影响,你也必须手动返回查询,并在 Delphi 端处理。
通过在SQL Server中使用Stored Procedures,您可以在输出参数中准备详细信息,并在 Delphi 端处理除主查询外的其他信息。
例如,您可以通过selecting SQL Server**@@ROWCOUNT**参数查找查询后插入的行数。

1hdlvixo

1hdlvixo2#

TADOConnection.Execute()有一个带有var RowsAffected输出参数的重载。

var
  RowsAffected: Integer;

try
  ADOconnection1.Connected := True;
  try
    ADOconnection1.Execute(Memo1.Lines.Text, RowsAffected);
  finally
    AdoConnection1.Close;
  end;
  if RowsAffected > 0 then
    ShowMessage('Floorplan imported to DB')
  else
    SbowMessage('Floorplan not imported to DB'); 
except
  ShowMessage('DB error');
end;

相关问题