近日在幫一個好朋友寫一個數據庫開發模塊時遇到了數據批處理的問題.
思考了一些數據批處理的開發方法,不敢獨享特總結與大家分享.
在 數 據 庫 應 用 系 統 中, 常 常 要 對 數 據 進 行 成 批 的 如 追 加、 刪 除、 更 改 等 操 作,
這 種 批 量 操 作 在 專 門 的 數 據 庫 開 發 工 具 如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+'dbdb.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組件,大致方法一樣.