ADO中把一个表的全部记录追加复制到另一个表中,如何做最快?(100)

  • 主题发起人 主题发起人 sherlockye
  • 开始时间 开始时间
S

sherlockye

Unregistered / Unconfirmed
GUEST, unregistred user!
RT,两个表在两个不同的库里面,而且请注意是追加,不能把原有的覆盖了。FieldByName逐条自然是能够实现,但是太慢了,有没有什么速度比较快的办法,我是说运行速度,不是代码长短
 
用insert into select
 
额,忘了说,是在两个不同的库里面,没法select吧
 
只要字段构造一样,就可以,ADODataSet1.Clone(ADODataSet2,ltunspecified);
 
clone不行,我要的是追加,就是目标表里面本来就有内容,源表的内容是追加到目标表的后面。
 
自己写个过程,如果有KeyField或避免重复则列出并用';'或','号隔开,如果没有,vfield=''可以这样:procedure CheckData(SourceDataSet,TagDataSet:TDataSet;vField:string);vari,j,iFieldCount:Integer;sFields:Tstrings;TmpAdoDataSet:TAdoDataSet;Fieldvalue:OleVariant;CurrBook:TBytes;begin if vField='' then begin if SourceDataSet.RecordCount>0 then begin CurrBook:=TagDataSet.GetBookMark;//保留目标表中的记录位置 SourceDataSet.First; for i:=0 to SourceDataSet.RecordCount-1 do begin TagDataSet.edit; TagDataSet.Append; for j:=0 to TagDataSet.FieldCount-1 do begin //如果字段顺序一致 TagDataSet.Fields[j].Value:=SourceDataSet.Fields[j].value; //如果字段顺序不一致 //TagDataSet.Fields[j].Value:=SourceDataSet.FieldbyName(TagDataSet.Fields[j].FieldName).value; end; SourceDataSet.Next; end; TagDataSet.gotoBookMark(CurrBook);//加到原来记录处 TagDataSet.FreeBookMark(CurrBook);//释放书签 end; end; else begin sFields:=TStringList.Create; ExtractStrings([';',','],[':',' '],PwideChar(VField),sFields); iFieldcount:=sFields.Count; Fieldvalue := VarArrayCreate([0,iFieldcount-1],varVariant); //生成动态数组 Currbook:=DataSet.GetBookmark; TmpAdoDataSet:=TAdoDataSet.Create(nil); TmpAdoDataSet.clone(SourceDataSet,ltunspecified); if TmpAdoDataSet.RecordCount>0 then begin TmpAdoDataSet.First; while not (TmpAdoDataSet.Eof) do begin for j := 0 to iFieldcount - 1 do Fieldvalue[j] := SourceDataSet.FieldByName(sFields[j]).Value;//赋值给动态数组以比较是否已存在该记录 if (TagDataSet.Locate(vField, Fieldvalue, [])) then begin TmpAdoDataSet.Delete; end; TmpAdoDataSet.Next; end; end; if TmpAdoDataSet.RecordCount>0 then//还有不同的记录 begin TmpAdoDataSet.first; begin for I := 0 to TmpAdoDataSet.RecordCount - 1 do begin tagDataSet.Edit; tagDataSet.Append; for j := 0 to TagAdoDataSet.FieldCount - 1 do begin if TagDataSet.Fields.FieldKind=fkData then begin if not TagDataSet.Fields.ReadOnly then begin tagDataSet.Fields.Value:=TmpAdoDataSet.Fields.Value; end else begin tagDataSet.Fields.ReadOnly:=False; tagDataSet.Fields.Value:=TmpAdoDataSet.Fields.Value; tagDataSet.Fields.ReadOnly:=True; end; end; end; TmpAdoDataSet.Next; end; tagDataSet.GotoBookmark(CurrBook); tagDataSet.FreeBookmark(CurrBook); tmpAdoDataSet.Free; end; end;
 
如我在一楼中说的,我知道这样逐条逐字段的赋值能行,但是这样太慢了,我是想知道有没有比较高效的方法,我有20万条记录需要处理,用这种方式实在是太费时间了
 
用SQL语句直接完成。搜索碧血剑的贴子可以找到。大体说来就是利用odbc进行异构数据库之间的数据交换。
 
就是下面这个链接http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
 
用DTS,应该效果最快了。
 
Insert Into Select OpenDataSource()
 
已给分,多谢各位
 
一次性的推薦dts,經常性動作寫代碼吧
 
我也是才知道insert into可以跨库,所以还是insert into 最快
 
貌似上次给分没成功....重新给了
 
后退
顶部