近日在幫一個好朋友寫一個數據庫開發模塊時遇到了數據批處理的問題.
思考了一些數據批處理的開發方法,不敢獨享特總結與大家分享.
在數據庫應用系統中, 常常要對數據進行成批的如追加、 刪除、 更改等操作,
這種批量操作在專門的數據庫開發工具如VFP 中用APPEND 、COPY 命令帶上相應的
命令子句就能輕易完成。 但在其它開發工具中並沒有類似的命令,
而是提供能完成類似功能的控件或對象, 如在PowerBuilder 中就是
利用Pipe Line( 數據管道) 來完成兩個或同構或不同構的表之間的數據批處理。
本文要介紹的是在利用Delphi進行數據庫開發時用Timer組件進行批處理的方法.
Delphi開發中在利用Delphi進行數據庫開發時利用最多的就是ADO和BDE兩種方法,眾所周知BDE曾經是Borland大力提倡的,
所以在BDE組件上Borland花費了大量的經歷所以在數據批處理上有TBatchMove控件可以完成數據批處理.
具體的操作要通過設置TBatchMove 的Mode 屬性後再調用Execute 方法來完成。有關BDE 的幫助。
本文中各種操作模式的實際結果均可以從Delphi 的Database Desktop
中查看到。
這不是本文的重點所以不再此贅述.如有興趣Delphi文檔中有清楚的註釋.,查閱便可.
本文討論的重點是:在ADO進行數據批處理方式.
拿到這個問題一般採取的方式是數據結構的特徵對全部數據進行遍歷,循環插入.
不過筆者在此要講的是一種快捷,高效,建議的數據批處理方式..具體代碼和操作方式如下:數據庫基本的連接代碼:
PRocedure TForm1.FormCreate(Sender: TObject);
var
MyPath:string;
const
MyPassW ='****'; ///數據庫密碼
begin
MyPath:=ExtractFilePath(ParamStr(0)); ////數據庫路徑
AdoConnection1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+
MyPath+'db/db.mdb;Jet OLEDB:Database PassWord='+
MyPassW+';Persist Security Info=False';
///////設置數據引擎並加載密碼
ADOConnection1.LoginPrompt := false;
ADOConnection1.Connected := true;
ADOTable1.Connection := ADOConnection1;
ADOTable1.TableName:='tab1';
ADOTable2.Connection := ADOConnection1;
ADOTable2.TableName:='tab2';
try
ADOTable2.Open;
ADOTable1.Open;
DataSource1.DataSet := ADOTable1;
DBGrid1.DataSource := DataSource1;
DBNavigator1.DataSource := DataSource1;
except
MessageBox(0,'無法打開數據庫','錯誤',MB_OK);
end;
/////////////Timer控件控制循環
begin
///////////進行差錯控制的異構表的批量數據處理
DataSource2.DataSet.Insert;
ADOTable2.Fields[0].AsString:=ADOTable1.Fields[0].AsString;
ADOTable2.Fields[1].AsString:=ADOTable1.Fields[1].AsString;
DataSource1.DataSet.Next;
if DataSource1.DataSet.Eof = True then timer1.Enabled := false ;
if DataSource1.DataSet.Eof = True then ShowMessage('數據以導入成功!');
except
MessageBox(0,'數據導入失敗','錯誤',MB_OK);
end;
end;
DataModule2.DataSource1.DataSet.Next;//////////此句最為關鍵,即為循環語句.
插入一條記錄的時間(Timer的響應時間)是可以設置的.
這是利用Timer組件的特性.DataSet.Next屬性設計而成的異構表之間的數據批量導入功能,
那麼刪除,更新等功能都有類似代碼可以實現(使用DataSource的屬性修改即可).
因為有查詢功能所以我在開發中利用的是TADOQuery組件,大致方法一樣.
作者:VIIVD
E-MAIL:[email protected]
日期:2004.6.5