近日在帮一个好朋友写一个数据库开发模块时遇到了数据批处理的问题.
思考了一些数据批处理的开发方法,不敢独享特总结与大家分享.
在数据库应用系统中, 常常要对数据进行成批的如追加、 删除、 更改等操作,
这种批量操作在专门的数据库开发工具如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 ='****'; ///数据库密码
Beginnen
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';
versuchen
ADOTable2.Open;
ADOTable1.Open;
DataSource1.DataSet := ADOTable1;
DBGrid1.DataSource := DataSource1;
DBNavigator1.DataSource := DataSource1;
außer
MessageBox(0,'无法打开数据库','错误',MB_OK);
Ende;
/////////////Timer控件控制循环
Beginnen
///////////进行差错控制的异构表的批量数据处理
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('数据以导入成功!');
außer
MessageBox(0,'数据导入失败','错误',MB_OK);
Ende;
Ende;
DataModule2.DataSource1.DataSet.Next;//////////此句最为关键,即为循环语句.
插入一条记录的时间(Timer的响应时间)是可以设置的.
这是利用Timer组件的特性.DataSet.Next属性设计而成的异构表之间的数据批量导入功能,
那么删除,更新等功能都有类似代码可以实现(使用DataSource的属性修改即可).
因为有查询功能所以我在开发中利用的是TADOQuery组件,大致方法一样.
作者:VIIVD
E-MAIL:[email protected]
日期:2004.6.5