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