如何捕捉ADO中的错误信息(200分)

  • 主题发起人 主题发起人 marshal
  • 开始时间 开始时间
M

marshal

Unregistered / Unconfirmed
GUEST, unregistred user!
我在DELPHI5中自己写了一个执行存贮过程的函数,当存储过程执行失败时,
要将错误信息写如数据库的日志表中(自建),在以前使用BDE时,能准确
描述错误信息,现在改用ADO,反而得不到准确信息了,函数代码如下,各
位大侠如果知道什么原因请告诉我,先谢谢了:
function ExecProc(ADOStoredProc:TADOStoredProc):Boolean;
var
adoqry:TADOQuery;
proce:TAdoStoredProc;
errorcontent:string;
begin
result:=True;
try
ADOStoredProc.ExecProc;
except on E:Exception do
begin
//把系统能捕做到的错误写入数据库中
Proce:=TAdoStoredProc.Create(nil);
Proce.ConnectionString:=GetConnString;
Proce.Prepared:=False;
Proce.ProcedureName:='up_Pub_ERR_Add'; //调用SQL Server上的存储过程
Proce.Prepared:=True;
Proce.Parameters.Refresh; //刷新参数列表
Proce.Parameters.ParamByName('@chrFunID').Value:=ADOStoredProc.ProcedureName;
Proce.Parameters.ParamByName('@intErrorID').Value:=-1;
Proce.Parameters.ParamByName('@chvContent').Value:=E.Message;
Proce.Parameters.ParamByName('@dDate').Value:=F_ReadSysDate;//得到系统时间
Proce.Parameters.ParamByName('@intStaffID').Value:=1;
Proce.ExecProc;
Proce.Free;//释放动态产生的存储过程
result:=False;
end;
end;
if ADOStoredProc.Parameters.ParamByName('@RETURN_VALUE').Value<>0 then
begin
//得到错误描述
adoqry:=TADOQuery.Create(nil);
adoqry.ConnectionString:=GetConnString;
adoqry.SQL.Clear;
//选择出中文描述,msglangid=2052
adoqry.SQL.Add('select description from master..sysmessages where error='+
IntToStr(ADOStoredProc.Parameters.ParamByName('@RETURN_VALUE').Value)+
' and msglangid=2052');
adoqry.Open;
if adoqry.RecordCount=0 then
errorcontent:='无法捕做的错误,请找技术支持人员!'
else
errorcontent:=adoqry.FieldByName('description').Value;
adoqry.Free;
//把错误写入数据库-SQL错误
Proce:=TAdoStoredProc.Create(nil);
Proce.ConnectionString:=GetConnString;
Proce.Prepared:=False;
Proce.ProcedureName:='up_Pub_ERR_Add';
Proce.Prepared:=True;
Proce.Parameters.Refresh;
Proce.Parameters.ParamByName('@chrFunID').Value:=ADOStoredProc.ProcedureName;
Proce.Parameters.ParamByName('@intErrorID').Value:=ADOStoredProc.Parameters.ParamByName('@RETURN_VALUE').Value;
Proce.Parameters.ParamByName('@chvContent').Value:=errorcontent;
Proce.Parameters.ParamByName('@dDate').Value:=F_ReadSysDate;
Proce.Parameters.ParamByName('@intStaffID').Value:=1;
Proce.ExecProc;
Proce.Free;
result:=False;
end;
//如果执行出错误,则把系统关闭!
if Result=False then
begin
Application.MessageBox('系统错误,请重新登录并与管理员联系!','错误',MB_ICONERROR);
ExitWindowsEx(EWX_FORCE,0);
end;
end;
我所获得的信息都是以%来代替表名与字段名的,例如‘无法将 NULL 值插入
列 '%1!',表 '%3!';该列不允许空值。%5! 失败。’请问怎样才可以获得具体的
表名和字段名??
  



 
ADO是用ADOconnection来捕获错误信息的.
adoconnection1.Errors....//自己试试
 
用ADOconnection也一样的
关键问题是很多错误捕捉不到,明明存储过程执行失败(通过数据库日志文件可以看出)
但是在Delphi中却没有出错信息,所以我才要在函数中去读数据库日志:
adoqry.SQL.Add('select description from master..sysmessages where error='+
IntToStr(ADOStoredProc.Parameters.ParamByName('@RETURN_VALUE').Value)+
' and msglangid=2052');
而同样的这个存储过程在BDE下执行时是会出错的,到底是什么原因???
 
都有出错信息的,看你怎么取,ado和bde的错误代码又不一样
这是ado的:
//根据原生错误码显示错误提示
for I := 0 to AParam.AConnection.Errors.Count - 1 do
begin
case AParam.AConnection.Errors.NativeError of
547 : begin
if pos('insert',AParam.AConnection.Errors.Description) > 0 then
begin
//'外键约束insert,delete,update';
if sErrText <> '' then sErrText := sErrText + #13;
sErrText := sErrText + 's';
end
else
if pos('delete',AParam.AConnection.Errors.Description) > 0 then
begin
if sErrText <> '' then sErrText := sErrText + #13;
sErrText := sErrText + 's';
end
else
if pos('update',AParam.AConnection.Errors.Description) > 0 then
begin
if sErrText <> '' then sErrText := sErrText + #13;
sErrText := sErrText + 's';
end;
end;//end of 547

945 : begin
if sErrText <> '' then sErrText := sErrText + #13;
sErrText := sErrText + '您的内存不足!';
end;//end of 945

4850 : begin
if sErrText <> '' then sErrText := sErrText + #13;
sErrText := sErrText + '数据库表被锁定!';
end;//end of 1204

2627 : begin
if sErrText <> '' then sErrText := sErrText + #13;
sErrText := sErrText + '输入的关键属性值已经存在!';
end;//end of 2627

7303 : begin
if sErrText <> '' then sErrText := sErrText + #13;
sErrText := sErrText + '网络初始化失败!请检查网络设置!';
end;//end of 7303

10024: begin
if sErrText <> '' then sErrText := sErrText + #13;
sErrText := sErrText + '网络连接超时!请检查网络设置!';
end;//end of 10024

else begin
if
end;
end;//end of case

end;//end of for
最后显示错误信息sErrText
 
var Lerrors:Errors;
LErrorLines:String;
i:integer;
begin
LErrors:=DMGlobal.GConnection.Errors;
if (LErrors<>nil) and (LErrors.count>0) then
begin
for i:=0 to LErrors.Count-1 do
begin
//LError:=LErrors.Item;
LErrorLines:=LErrorLines+'Error Number:'+vartostr(LErrors.Item.Number)+#10+#13;
LErrorLines:=LErrorLines+'Error Source:'+vartostr(LErrors.Item.Source)+#10+#13;
LErrorLines:=LErrorLines+'Error Description:'+vartostr(LErrors.Item.Description)+#10+#13;
LErrorLines:=LErrorLines+'Error HelpFile:'+vartostr(LErrors.Item.HelpFile)+#10+#13;
LErrorLines:=LErrorLines+'Error SQLState:'+vartostr(LErrors.Item.SQLState)+#10+#13;
LErrorLines:=LErrorLines+'Error NativeError:'+vartostr(LErrors.Item.NativeError)+#10+#13;
LErrorLines:=LErrorLines+'------------------------------------'+#10+#13;
end;
end;
showmessage(LErrorLines);
end;
 
多人接受答案了。
 
后退
顶部