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! 失败。’请问怎样才可以获得具体的
表名和字段名??
要将错误信息写如数据库的日志表中(自建),在以前使用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! 失败。’请问怎样才可以获得具体的
表名和字段名??