如果数据库方面关于ADO出错为: procedure TDm.ADOQuery1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); var adoerrors:errors; adoerror:error; i:integer; begin adoerrors:=ADOCONNECTION1.Errors; for i:=0 to adoerrors.count-1 do begin adoerror:=adoerrors.item[i]; if adoerror.nativeerror=2627 then begin Application.MessageBox('编号已存在,请输入其它编号。','提示', Mb_Defbutton1+Mb_IconInformation+MB_ok); break; end else if adoerror.nativeerror=515 then begin Application.MessageBox('编号不能为空,请重新输入。','提示', Mb_Defbutton1+Mb_IconInformation+MB_ok); break; end else Application.MessageBox('输入数据非法,请重新输入。','提示', Mb_Defbutton1+Mb_IconInformation+MB_ok); break; end; with dataset do begin if state =dsinsert then cancel else if state=dsedit then begin edit; for i:=1 to fieldcount-1 do fields[i].Value :=fields[i].OldValue; end; end; Action:=daAbort; end;
except
finallly
end;
F8
procedure TDm.ADOQuery1PostError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
var
adoerrors:errors;
adoerror:error;
i:integer;
begin
adoerrors:=ADOCONNECTION1.Errors;
for i:=0 to adoerrors.count-1 do
begin
adoerror:=adoerrors.item[i];
if adoerror.nativeerror=2627 then
begin
Application.MessageBox('编号已存在,请输入其它编号。','提示',
Mb_Defbutton1+Mb_IconInformation+MB_ok);
break;
end
else
if adoerror.nativeerror=515 then
begin
Application.MessageBox('编号不能为空,请重新输入。','提示',
Mb_Defbutton1+Mb_IconInformation+MB_ok);
break;
end
else
Application.MessageBox('输入数据非法,请重新输入。','提示',
Mb_Defbutton1+Mb_IconInformation+MB_ok);
break;
end;
with dataset do
begin
if state =dsinsert then cancel
else if state=dsedit then
begin
edit;
for i:=1 to fieldcount-1 do
fields[i].Value :=fields[i].OldValue;
end;
end;
Action:=daAbort;
end;
except
end;try
finally
end;截Application.OnException事件.
try ...
except
on EZeroDivide do HandleZeroDivide;
on EOverflow do HandleOverflow;
on EMathError do HandleMathError;
end;
try
//此处加入程序正常运行时的语句
...
except
//此处加入程序不正常运行时的语句1
except
//此处加入程序不正常运行时的语句2
except
//此处加入程序不正常运行时的语句3
...
except
//此处加入程序不正常运行时的语句n
...
end;
try
//此处加入程序正常运行时的语句
finallly
//此处不管是什么错误,都会按此语句处理
end;
还有个问题就是捕捉了EDataBaseError错误怎么转换成ado错误啊?
//在主程序中实现下述过程
//application.OnException := MyException;
//以下用MyError封装了MessageDlg();
procedure MyException(Sender: TObject; E: Exception);
var
adoErrors: Errors;
adoError: Error;
iCount: Integer;begin
if E is EDataBaseError then
begin
adoErrors:=form1.ADOConnection1.Errors; //ADO错误类型是什么?
for iCount :=0 to adoErrors.Count-1 do
begin
adoError := adoErrors.Item[iCount]; case adoError.NativeError of 32 : //无法定位行集,记录被其他用户修改
MyError('该记录已被其他用户修改,请重新修改记录!'); 515 : //不能为 NULL
MyError('记录不能为空,请重新输入!'); 1023 : //不能插入空行
MyError('不能插入空行,请输入数据!'); 2627 : //违反主键约束
MyError('主键重复,请重新输入!'); else //ADO其它错误
MyError(adoError.Description + ' ' + inttostr(adoError.NativeError)); end; // case
break ; //跳出for
end; //for
end // if
else
MyError(E.message); //其它错误end;