首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TADODataset中捕获Post方法的错误代码

TADODataset中捕获Post方法的错误代码
EN

Stack Overflow用户
提问于 2019-05-25 03:01:28
回答 1查看 282关注 0票数 1

我有一个数据集,我用它来捕获错误:

代码语言:javascript
复制
try
  FDataSource.DataSet.Post;    
  ShowMessage('success message!');
except
  on E : EDatabaseError do
  begin
    if (Pos('duplicate value', E.Message) > 0) or (Pos('duplicate key', E.Message) > 0) then
      ShowMessage('my custom error message')
    else
      ShowMessage('generic db error message');
  end;
end;

这是一个可怕的解决方案,因为它依赖于在错误消息中查找字符串“duplicate value”或“duplicate key”。

我希望能够得到一些错误代码。

有没有办法弄到它?

EN

回答 1

Stack Overflow用户

发布于 2019-05-25 03:31:02

您也许能够通过AdoConnection对象捕获错误。

TAdoConnection有一个Errors对象(请参阅AdoInt.Pas中的定义)。为了研究它,我在服务器上使用了一个存储的proc,其定义如下

代码语言:javascript
复制
create PROCEDURE [dbo].[spRaiseError](@AnError int)
AS
BEGIN
  declare @Msg Char(20)
  if @AnError > 0
    begin
      Select @Msg = 'MyError ' + convert(Char(8), @AnError)
      RaisError(@Msg, 16, -1)
    end
  else
    select 1
END

然后,在我的Delphi代码中,我得到了如下内容:

代码语言:javascript
复制
uses [...] AdoInt, AdoDB, [...]

procedure TForm1.Button1Click(Sender: TObject);
var
  S : String;
  IErrors : Errors;
  IError : Error;
  ErrorCount : Integer;
  i : Integer;
begin
  S := 'exec spRaiseError ' + Edit1.Text;
  AdoQuery1.SQL.Text := S;
  try
    AdoQuery1.Open;
  except
    IErrors := AdoConnection1.Errors;
    ErrorCount := IErrors.Count;
    for i := 0 to ErrorCount - 1 do begin
      IError := IErrors.Item[i];
      S := Format('error: %d, source: %s description: %s', [i, IError.Source, IError.Description]);
      Memo1.Lines.Add(S);
    end;
    Caption := IntToStr(ErrorCount);
  end;
end;

如果我将ADOQuery1的Sql.Text设置为'select * from get‘,我会得到

错误: 0,源:用于SQL Server的Microsoft OLE DB提供程序描述:无效的对象名称'anything‘。

如果您尝试使用它,您会发现Errors集合的内容是累积的,但是Errors有一个Clear方法来清除它。

有关更多信息,请参阅https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/error-object?view=sql-server-2017 https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/errorvalueenum?view=sql-server-2017 (链接由雷米·勒博提供)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56298284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档