在往数据库插入记录时,捕捉主键冲突的except

时间:2021-11-29 21:41:51
oracle主键错误号为:ORA-00001
希望能填写这里
  except
   ////////////////////////////////////////////////////////////////
      ////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////
      delphi 要在这里捕捉主键冲突的错误?????????????????????????????
      result:=false;


//插入部门记录
function InsertDepartMent(Const DepartM : TDepartMent) : Boolean;
var
  //ADODep : TADOQuery;
  sql : String;
begin
  result := False;
   DM.adoCn.Connected := True;
  //ADODep := TADOQuery.Create(nil);

  DM.qrySql1.Connection := DM.adoCn;
sql := 'Insert into Department(DEPT_ID,DEPT_NAME,DIR_LD1,DIR_LD1_PHONE,'+
        'DIR_LD2,DIR_LD2_PHONE,DEP_LD1,DEP_LD1_PHONE,DEP_LD2,DEP_LD2_PHONE,'+
        'DEP_LD3,DEP_LD3_PHONE) values('+DepartM.Dept_ID+','''+
        DepartM.Dept_Name+''','''+DepartM.DirLeader1 +''','''+
        DepartM.DirLeader1_Mobile +''','''+DepartM.DirLeader2+''','''+
        DepartM.DirLeader2_Mobile+''','''+DepartM.DeptLeader1 +''','''+
        DepartM.DeptLeader1_Mobile +''','''+DepartM.DeptLeader2+''','''+
        DepartM.DeptLeader2_Mobile+''','''+DepartM.DeptLeader3+''','''+
        DepartM.DeptLeader3_Mobile+''')';
  //application.messagebox(sql,'DAMN IT');
  //exit;
  try
      DM.qrySql1.Close;
      DM.qrySql1.SQL.clear;
      DM.qrySql1.SQL.Add(sql);
      DM.qrySql1.ExecSQL;
      result:=true;
  except
   ////////////////////////////////////////////////////////////////
      ////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////
      delphi 要在这里捕捉主键冲突的错误?????????????????????????????
      result:=false;

  end;
  DM.qrySql1.close;
  DM.adoCn.Connected := False;
end;

7 个解决方案

#1


try
      DM.qrySql1.Close;
      DM.qrySql1.SQL.clear;
      DM.qrySql1.SQL.Add(sql);
      DM.qrySql1.ExecSQL;
      result:=true;
  except
      On E:Exception do
      begin
        ShowMessage(E.message);
        result:=false;
      end;

  end;

#2


delphi 要在这里捕捉主键冲突的错误 应该不象楼上那样写的吧

本来我在dal层的错误处理中就什么也没做,只是忽略错误,然后由bll层返回错误"主键重复"
try
      DM.qrySql1.Close;
      DM.qrySql1.SQL.clear;
      DM.qrySql1.SQL.Add(sql);
      DM.qrySql1.ExecSQL;
      result:=true;  
except
end;
感觉这样处理比楼上方法更好,现在只是想明确捕捉 由oracle返回的"主键冲突"异常.

#3


才学delphi一个礼拜就难倒那么多人了?
还是delphi人气太不行了???

#4


ShowMessage(E.message);
这些东西,使用者肯定看不明白的了

#5


不是有错误代码吗,在OnPostErr里写吧,根据返回的错误代码。

#6


在except内写
ShowMessage('主键冲突');

#7


晕 
怎么看问题的?

这样来解决:
try


except
   on e : EOraError do
    begin
      if e.ErrorCode = 2292 then
        ErrorInfo := '存在此部门的关连记录,禁止删除!'
      else
        ErrorInfo := '数据库操作错误';
      Result := False;
    end;
end;

ErrorCode := 1代表主键重复,针对插入记录的函数使用(同上)
不过我的是对oracle的,还有,不是使用ADO,因为ADO麻烦,要安装oracle客户端

#1


try
      DM.qrySql1.Close;
      DM.qrySql1.SQL.clear;
      DM.qrySql1.SQL.Add(sql);
      DM.qrySql1.ExecSQL;
      result:=true;
  except
      On E:Exception do
      begin
        ShowMessage(E.message);
        result:=false;
      end;

  end;

#2


delphi 要在这里捕捉主键冲突的错误 应该不象楼上那样写的吧

本来我在dal层的错误处理中就什么也没做,只是忽略错误,然后由bll层返回错误"主键重复"
try
      DM.qrySql1.Close;
      DM.qrySql1.SQL.clear;
      DM.qrySql1.SQL.Add(sql);
      DM.qrySql1.ExecSQL;
      result:=true;  
except
end;
感觉这样处理比楼上方法更好,现在只是想明确捕捉 由oracle返回的"主键冲突"异常.

#3


才学delphi一个礼拜就难倒那么多人了?
还是delphi人气太不行了???

#4


ShowMessage(E.message);
这些东西,使用者肯定看不明白的了

#5


不是有错误代码吗,在OnPostErr里写吧,根据返回的错误代码。

#6


在except内写
ShowMessage('主键冲突');

#7


晕 
怎么看问题的?

这样来解决:
try


except
   on e : EOraError do
    begin
      if e.ErrorCode = 2292 then
        ErrorInfo := '存在此部门的关连记录,禁止删除!'
      else
        ErrorInfo := '数据库操作错误';
      Result := False;
    end;
end;

ErrorCode := 1代表主键重复,针对插入记录的函数使用(同上)
不过我的是对oracle的,还有,不是使用ADO,因为ADO麻烦,要安装oracle客户端