我是在delphi中通过ODAC组件更新数据的,更新的语句如下:UPDATE rz_fp_hy_input t SET t.rzjg_dm=:rzjgdm_,t.rzjg_sm=:rzjgsm_,t.RZSJ=sysdate where t.fprzsqid=:fprzsqid_其中:rzjgdm_,:rzjgsm_,:fprzsqid_都是通过组件的参数传递方法设置的值,已通过打印确保其值不为空。
当程序在运行一段时间后就会出现异常报错为:”ora-01403 not data found“.
我在plsql中测试过,即使没有满足条件(即fprzsqid不存在)的更新也是没有报错的。以下是代码语句:{检查是否重复认证}
  recount := 0;
  Form1.mmo_info.Lines.Add('检查是否重复认证');
  OraQuery2_:= initQuery(data2Conn);
  OraQuery2_.Close;
  OraQuery2_.SQL.Clear;  OraQuery2_.SQL.Add('select count(a.fprzsqid) co from skskj.SM_SKSKJDK_JG_ZB a  where');
  OraQuery2_.SQL.Add(' a.fphm=:fphm_');
  OraQuery2_.SQL.Add(' and a.fp_dm=:fpDm_');
  OraQuery2_.SQL.Add(' and a.rzjg_dm=:rzjgDm_');
  OraQuery2_.Params.ParamByName('fphm_').Value:=tmphyfp.GetFp_hm;
  OraQuery2_.Params.ParamByName('fpDm_').Value:=tmphyfp.GetFp_dm;
  OraQuery2_.Params.ParamByName('rzjgDm_').Value:=tmprzjgdm;
  OraQuery2_.Open;  if not OraQuery2_.Eof then
  begin
recount := OraQuery2_.FieldValues['co'];            
  end;  if recount > 0 then
  begin
//tmprzjgdm := '2';
Form1.mmo_info.Lines.Add('重复认证:'+ IntToStr(recount));
  end;
  Form1.mmo_info.Lines.Add('检查是否重复认证结束');end;OraQuery_ := initQuery(dataConn);
dataConn.StartTransaction;{跟新数据库发票认证信息}
OraQuery_.Close;
OraQuery_.SQL.Clear;    //fprz_hwys_fpmx
OraQuery_.SQL.Text:='UPDATE rz_fp_hy_input t SET t.rzjg_dm=:rzjgdm_,t.rzjg_sm=:rzjgsm_,t.RZSJ=sysdate where t.fprzsqid=:fprzsqid_';
OraQuery_.Params.ParamByName('rzjgdm_').Value:=tmprzjgdm;
OraQuery_.Params.ParamByName('rzjgsm_').Value:=tmprzjgsm;
OraQuery_.Params.ParamByName('fprzsqid_').Value:=tmphyfp.GetFprzssqid;
OraQuery_.Execute;dataConn.Commit;
except
on E:Exception do
begin
  form1.mmo_info.Lines.Add('数据库异常,更新数据失败');
  form1.mmo_info.Lines.Add(e.Message);
  data2Conn.Rollback;
  dataConn.Rollback;
end;
end;
对于dataconn和data2conn解释下,按正常流程时间数据保存在data2conn中的表,但是由于有上述错误故在查询时间是访问data2conn,在插入式是使用的dataconn中的表

解决方案 »

  1.   

    没那用过这个ODAC组建,是不是0条数据被更新的时候,提交事务就会报错,你判断一下试试
      

  2.   

    我这里的数据可以确保是存在的。这里的数据都是冲dataconn中的表查询出来的。
      

  3.   

    即使是0条数据odac也不会报错
      

  4.   

    不是用delphi做开发的。不过,俺用c的时候。更新0条,也是会抛出异常的。通常,我会这样写EXEC SQL UPDATE rz_fp_hy_input t SET t.rzjg_dm=:rzjgdm_,t.rzjg_sm=:rzjgsm_,t.RZSJ=sysdate where t.fprzsqid=:fprzsqid;
    if (SQLCODE != 0 && SQLCODE != 1403) {
    printf("更新 rz_fp_hy_input 错误 [%d]\n",SQLCODE);
    printf("SQLERRMSG = [%s]\n",SQLERRMSG);
    }