近日在幫一個(gè)好朋友寫一個(gè)數(shù)據(jù)庫開發(fā)模塊時(shí)遇到了數(shù)據(jù)批處理的問題.
思考了一些數(shù)據(jù)批處理的開發(fā)方法,不敢獨(dú)享特總結(jié)與大家分享.
在 數(shù) 據(jù) 庫 應(yīng) 用 系 統(tǒng) 中, 常 常 要 對 數(shù) 據(jù) 進(jìn) 行 成 批 的 如 追 加、 刪 除、 更 改 等 操 作,
這 種 批 量 操 作 在 專 門 的 數(shù) 據(jù) 庫 開 發(fā) 工 具 如VFP 中 用APPEND 、COPY 命 令 帶 上 相 應(yīng) 的
命 令 子 句就 能 輕 易 完 成。 但 在 其 它 開 發(fā) 工 具 中 并 沒 有 類 似 的 命 令,
而 是 提 供 能 完 成 類 似 功 能 的 控 件 或 對 象, 如 在PowerBuilder 中 就 是
利 用Pipe Line( 數(shù) 據(jù) 管 道) 來 完 成 兩 個(gè) 或 同 構(gòu) 或 不 同 構(gòu) 的 表 之 間 的 數(shù) 據(jù) 批 處 理。
本 文 要 介 紹 的 是在利用Delphi進(jìn)行數(shù)據(jù)庫開發(fā)時(shí)用Timer組件進(jìn)行批處理的方法.
Delphi開發(fā)中在利用Delphi進(jìn)行數(shù)據(jù)庫開發(fā)時(shí)利用最多的就是ADO和BDE兩種方法,眾所周知BDE曾經(jīng)是Borland大力提倡的,
所以在BDE組件上Borland花費(fèi)了大量的經(jīng)歷所以在數(shù)據(jù)批處理上有TBatchMove控件可以完成數(shù)據(jù)批處理.
具 體 的 操 作 要 通 過 設(shè) 置TBatchMove 的Mode 屬 性 后 再 調(diào) 用Execute 方 法 來 完 成。有 關(guān)BDE 的 幫 助。
本 文 中 各 種 操 作 模 式 的 實(shí) 際 結(jié) 果 均 可 以 從Delphi 的Database Desktop
中 查 看 到。
這不是本文的重點(diǎn)所以不再此贅述.如有興趣Delphi文檔中有清楚的注釋.,查閱便可.
本文討論的重點(diǎn)是:在ADO進(jìn)行數(shù)據(jù)批處理方式.
拿到這個(gè)問題一般采取的方式是數(shù)據(jù)結(jié)構(gòu)的特征對全部數(shù)據(jù)進(jìn)行遍歷,循環(huán)插入.
不過筆者在此要講的是一種快捷,高效,建議的數(shù)據(jù)批處理方式..具體代碼和操作方式如下:數(shù)據(jù)庫基本的連接代碼:
PRocedure TForm1.FormCreate(Sender: TObject);
var
MyPath:string;
const
MyPassW ='****'; ///數(shù)據(jù)庫密碼
begin
MyPath:=ExtractFilePath(ParamStr(0)); ////數(shù)據(jù)庫路徑
AdoConnection1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+
MyPath+'db/db.mdb;Jet OLEDB:Database PassWord='+
MyPassW+';Persist Security Info=False';
///////設(shè)置數(shù)據(jù)引擎并加載密碼
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,'無法打開數(shù)據(jù)庫','錯(cuò)誤',MB_OK);
end;
/////////////Timer控件控制循環(huán)
begin
///////////進(jìn)行差錯(cuò)控制的異構(gòu)表的批量數(shù)據(jù)處理
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('數(shù)據(jù)以導(dǎo)入成功!');
except
MessageBox(0,'數(shù)據(jù)導(dǎo)入失敗','錯(cuò)誤',MB_OK);
end;
end;
DataModule2.DataSource1.DataSet.Next;//////////此句最為關(guān)鍵,即為循環(huán)語句.
插入一條記錄的時(shí)間(Timer的響應(yīng)時(shí)間)是可以設(shè)置的.
這是利用Timer組件的特性.DataSet.Next屬性設(shè)計(jì)而成的異構(gòu)表之間的數(shù)據(jù)批量導(dǎo)入功能,
那么刪除,更新等功能都有類似代碼可以實(shí)現(xiàn)(使用DataSource的屬性修改即可).
因?yàn)橛胁樵児δ芩晕以陂_發(fā)中利用的是TADOQuery組件,大致方法一樣.
作者:VIIVD
E-MAIL:bao-er@163.com
日期:2004.6.5
新聞熱點(diǎn)
疑難解答
圖片精選