我有一个数据集,我用它来捕获错误:
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”。
我希望能够得到一些错误代码。
有没有办法弄到它?
发布于 2019-05-25 03:31:02
您也许能够通过AdoConnection对象捕获错误。
TAdoConnection有一个Errors对象(请参阅AdoInt.Pas中的定义)。为了研究它,我在服务器上使用了一个存储的proc,其定义如下
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代码中,我得到了如下内容:
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 (链接由雷米·勒博提供)
https://stackoverflow.com/questions/56298284
复制相似问题