问题:在批量复制记录的时候,Post的时候出现:“Multiple _step operation generated errors,check each Status”的错误为了在不同的系统之间导数据,我做了一个导数据工具,用ADO连接。在连接SQL、ACCESS的时候并没有出现什么问题。连ORACLE就会有问题,但也并不是什么时候都有问题。例如我导单位表的时候正常,但是我导车辆表的时候就出这个错误了。复制数据的代码都是一样的,没有理由这个表可以,那个表不可以啊!我想可能是表有什么问题?但是还不确定。有那位大侠知道的请指教!

解决方案 »

  1.   

    代码如下://复制数据:源数据=>目标数据
    procedure TFrmCvtMain.btnCopyTblClick(Sender: TObject);
    var
      I,J,Idx: Integer;
      iCount : Integer;
      doID   : Boolean;
      doUUID : Boolean;
      doRecID: Boolean;
      doDate : Boolean;
      sFld,dFld: TField;
      s,sFldName,dFldName: String;
      tDate: TDateTime;
    begin
      //检验条件
      If DmCvt.dstSrc.Active=False then
      begin
        MessageDlg('源数据表未打开!',mtWarning,[mbOK],0);
        Exit;
      end;
      If DmCvt.dstDes.Active=False then
      begin
        MessageDlg('目的数据表未打开!',mtWarning,[mbOK],0);
        Exit;
      end;
      If DmCvt.dstSrc.RecordCount=0 then
      begin
        MessageDlg('源数据表无数据!',mtWarning,[mbOK],0);
        Exit;
      end;
      If (cbFldMap_Src.Items.Count=0)or(cbFldMap_Des.Items.Count=0)or
         (cbFldMap_Src.Items.Count<>cbFldMap_Des.Items.Count) then
      begin
        MessageDlg('源数据表与目的数据表的字段影射关系未设定正确!',mtWarning,[mbOK],0);
        Exit;
      end;
      
      doID    := ckbID.Checked;
      If (doID=True)and(Trim(fFldNameID)='') then
      begin
        MessageDlg('请设置ID字段的字段名称!',mtWarning,[mbOK],0);
        Exit;
      end;
      doUUID  := ckbUUID.Checked;
      If (doUUID=True)and(Trim(fFldNameUUID)='') then
      begin
        MessageDlg('请设置UUID字段的字段名称!',mtWarning,[mbOK],0);
        Exit;
      end;
      doRecID := ckbRecID.Checked;
      If (doRecID=True)and(Trim(fFldNameRecID)='') then
      begin
        MessageDlg('请设置RecID字段的字段名称!',mtWarning,[mbOK],0);
        Exit;
      end;
      doDate  := ckbDate.Checked;  iCount := DmCvt.dstSrc.RecordCount;
      //一条一条记录复制
      DmCvt.dstSrc.First;
      for I:=1 to iCount do
      begin
        DmCvt.dstDes.Append;    //根据字段影射关系复制字段
        for J:=0 to cbFldMap_Des.Items.Count-1 do
        begin
          sFld := nil;
          dFld := nil;
          sFldName := cbFldMap_Src.Items.Strings[J];
          dFldName := cbFldMap_Des.Items.Strings[J];
          If (sFldName='')or(dFldName='') then Continue;
          Idx := DmCvt.dstSrc.FieldDefs.IndexOf(sFldName);
          If Idx>=0 then sFld := DmCvt.dstSrc.Fields.Fields[Idx];
          Idx := DmCvt.dstDes.FieldDefs.IndexOf(dFldName);
          If Idx>=0 then dFld := DmCvt.dstDes.Fields.Fields[Idx];      If (sFld=nil)or(dFld=nil) then
          begin
            Continue;
          end;
          
          If dFld.DataType in [ftDate,ftDateTime] then
          begin
            s := DmCvt.dstSrc.FieldByName(sFldName).AsString;
            If TryStrToDateTime(s,tDate) then
            begin
              DmCvt.dstDes.FieldByName(dFldName).AsString :=
                FormatDateTime('YYYY-MM-DD',StrToDate(s));
            end;
          end
          else begin
            If (sFld<>nil)and(dFld<>nil) then
            begin
              Try
                //DmCvt.dstDes.FieldValues[dFldName] := DmCvt.dstSrc.FieldValues[sFldName];
                DmCvt.dstDes.FieldByName(dFldName).AsString :=
                      Trim(DmCvt.dstSrc.FieldByName(sFldName).AsString);
              Except
                Continue;
              End;
            end;
          end;
        end;    //处理自动付值字段
        //UUID
        dFldName := fFldNameUUID;
        Try
          If Trim(dFldName)='' then
            dFld := nil
          else
            dFld := DmCvt.dstDes.FieldByName(dFldName);
        Except
          //
        End;
        If (dFld<>nil)and(doUUID) then
        begin
          DmCvt.dstDes.FieldByName(dFldName).AsString := ComObj.CreateClassID;
        end;
        //RecID
        dFldName := fFldNameRecID;
        Try
          If Trim(dFldName)='' then
            dFld := nil
          else
            dFld := DmCvt.dstDes.FieldByName(dFldName);
        Except
          //
        End;
        If (dFld<>nil)and(doRecID) then
        begin
          DmCvt.dstDes.FieldByName(dFldName).AsString := DmCvt.GenerateNewRecID;
        end;
        //ID
        dFldName := fFldNameID;
        Try
          If Trim(dFldName)='' then
            dFld := nil
          else
            dFld := DmCvt.dstDes.FieldByName(dFldName);
        Except
          //
        End;
        If (dFld<>nil)and(doID) then
        begin
          DmCvt.dstDes.FieldByName(dFldName).AsInteger :=
                DmCvt.GetNextID(edtDesTbl.Text,dFldName);
        end;
        //Post then Next
        DmCvt.dstDes.Post;     //-->这个地方会有错误发生,但是不是所有的都是
        DmCvt.dstSrc.Next;
      end;
      DmCvt.dstDes.Refresh;
    end;
      

  2.   

    不是直接用的SQL语句,是用DataSet的Append,Post方法的。没有人能够解决吗?大家随便发表发表意见也可以啊。这个问题已经问了好几天了。
      

  3.   

    :0,帮你一把,给我分一点吧,thanks.
     :)