DataSet 間快速拷貝一條記錄 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 DataSet 間快速拷貝一條記錄 在一個資料庫應用程式中,我們經常要將記錄從一個 dataset 拷貝到另一個 dataset。作?一名 Delphi 程式師,你其實只需要一條命令。
回答: 通常,你完成此項任務時使用 TBatchMove 構件。但 TBatchMove 也有不合適的情況: - 你並不希望拷貝所有的記錄,也不想使用篩檢程式。 - 你希望用到目的 DataSet 的有效事件(如 BeforPost,OnValidate,等)。 - 或者更壞的情況,兩 DataSet 的結構並不相同。 使用下面的簡單過程,上面的問題都可以被解決,所有欄位中的資料將被拷貝到另外一個 Dataset 中的同名欄位中。但這裏面也存在一些限制: - 不能拷貝查找和計算欄位 - 當存在相同欄位名但資料類型不同時,你需要先使用 Assign 判斷。 - 當然,目的欄位不能是唯讀的。 procedure CopyRecord(Source, Destination: TDataSet); var Ind:longint; SField, DField: TField; begin for Ind:=0 to Source.FieldCount - 1 do begin SField := Source.Fields[ Ind ]; DField := Destination.FindField( SField.FieldName ); if (DField < > nil) and (DField.FieldKind = fkData) and not DField.ReadOnly then if (SField.DataType = ftString) or (SField.DataType < > DField.DataType) then DField.AsString := SField.AsString else DField.Assign( SField ) end; end; 舊方法: DEST.Open; ORIGIN.Open; while not ORIGIN.Eof do begin if ORIGINTYPE.AsString = 'T' then with ORIGIN do begin DEST.Append; DEST.FieldByName('TYPE').AsString := ORIGINTYPE.AsString; DEST.FieldByName('FIRSTNAME').AsString := ORIGINFIRSTNAME.AsString; DEST.FieldByName('LASTNAME').AsString := ORIGINLASTNAME.AsString; DEST.FieldByName('CPF').AsString := ORIGINCPF.AsString; DEST.FieldByName('PARTY').AsString := ORIGINPARTY.AsString; DEST.Post; end; ORIGIN.Next; end; 使用該過程的調用示範: DEST.Open; ORIGIN.Open; while not ORIGIN.Eof do begin if ORIGINTYPE.AsString = 'T' then begin DEST.Append; CopyRecord( ORIGIN, DEST ); DEST.Post; end; ORIGIN.Next; end; 此過程在使用 TQueries, TClientDataSet 和其他 TDataset 子類時,工作良好。 希望對大家有所幫助。.
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |