首页  编辑  

MIDAS进阶--多表更新

Tags: /超级猛料/Friends.网友专栏/ihihonline(小小)/   Date Created:

MIDAS进阶--多表更新

原创 (小小->爱被下载中……)

前些日子看过李维的书,介绍分布式处理的;

其中有一个是多表处理,对多表进行更新,说实话,我觉的如果你是新手的话,可能会被他的逻辑所困扰,记得它当时一共是用了三个Cache SQL 实现的(TUpdateSQL),每个控件又有不同的更新语句;

当时,虽然感觉懂,但总觉的不是很添晰;返过头来,才发现它还有一些问题没有交待清楚,(当然,我们要自己想的),我们再来一起看一看;在三层中,对于单表的更新很简单,可以有四种方法,对于多表的更新,也有几种方法,用户正真介入的,而且是比较安全的应该是在TClinetDataSet -> TProvider ->BeforeUpdateRecord事件里边,当更新完毕之后,然后再置Applied := True 就可以;事件定义:

procedure TMTF_LX.MTDDataSetProviderBeforeUpdateRecord(Sender: TObject;

 SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;

 UpdateKind: TUpdateKind; var Applied: Boolean);

我们只要明白了数据更新机制的话,就不难理解多表更新;具体更新机制是什么样的?简单而言:

  客户端 TClientDataSet.ApplyUpdates(MasError) 启动 应用服务端的TProvider进行数据更新,过程:Tprovider.BeforeUpdateRecord (参数判断,决定是否继续) -> TProvider.AfterUpdateRecord -> 数据合并回传;

由上边的过程我们不难发现,多表更新的确是应该在BeforeUpdateRecord事件里边写,首先应该明白事件的各个参数是什么意思,来分解一下每个参数:

procedure TMTF_LX.MTDDataSetProviderBeforeUpdateRecord(Sender: TObject;

 SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;

 UpdateKind: TUpdateKind; var Applied: Boolean);

Sender : TObject :显而易见,它就是指自身TProvider ,可用Serder.ClassName检测;

SourceDS:TDataSet:你还可以用Sender.ClassName进行检测,可以知道它就是TProvider.DataSet值,那么,它在多表更新而言意义不是非常大,至少我们现在可以这样认为,而且也并不是错的;

DeltaDS:TCustomClientDataSet:检测方法都可以用上边的方法,明确的说,可以理解它就是客户端的TClientDataSet,其实,应该是DeltaDS.Data := TClientDataSet.Delts,我们可以从它的里边进行数据提取;很重要的一个参数,不然无法进行多表更新;

UpdateKind : TUpdateKind :更新类型,Insert/Update/Delete三种类型;

Applied : Boolean :将决定是否由应用服务自动更新,多表更新中,不应该让自动更新,原因我想大家都应该知道的;所以再最后:Applied := True;

由此而来,更新就变的简单了,再理解李维老师的那个例子也变的更容易了,当然也可以自己写完全不一样的更新;下边将会给出一个例子;

现在,我们的精力就应该放在以下几点上:

取数据 :DeltaDS里边取出数据,我们都知道,多层中的数据传递是OleVariant的形式,现在我们不用管那些了,因为DeltaDS就是一个数据集;

判断更新类型:UpdateKind,根据不同的类型,要执行不同的操作;

更新操作:最后用另外一个数据集组件进行更新;

下边我给出一个例子,供大家参考;不过仅仅是插入,数据算法我没有用到,只是练习时用的

procedure TMTF_LX.MTDDataSetProviderBeforeUpdateRecord(Sender: TObject;

 SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;

 UpdateKind: TUpdateKind; var Applied: Boolean);

var

 Info_FName,Info_Time : String;

 User_Name,User_Pass : String;

 UserInfo_Email,UserInfo_QQ : String;

 SQLText : String;

 Param : TParam;

begin

 if ukInsert in UpdateKind then

 with DeltaDS do

 begin

   Info_FName := FieldByName('Info_FUserName').AsString;

   Info_Time := FieldByName('Info_Time').AsString;//Fields[1].AsString;/////// FieldByName('Info_Time').AsString;

   User_Name := FieldByName('User_Name').AsString;///////////Fields[2].AsString;/////////  FieldByName('User_Name').AsString;

   User_Pass := FieldByName('User_Pass').AsString;/////////Fields[3].AsString;////////////

   UserInfo_Email := FieldByName('UserInfo_Em').AsString;

   UserInfo_QQ := FieldByName('UserInfo_QQ').AsString;

   UserInfo_Email := FieldByName('UserInfo_Em').AsString;/////////////Fields[4].AsString;///////

   UserInfo_QQ := FieldByName('UserInfo_QQ').AsString;///////// Fields[5].AsString;//////////

 end;

 with DataUpdateQuery do

 begin

   Try

     SQLText := 'Insert csdnyh_Info (Info_FUserName,Info_TUserName,Info_Time) Values(' + #39 + Info_FName + #39 + ','+#39 + Info_Fname + #39+',' + #39 + Info_Time + #39 + ')';

     Close;

     SQL.Clear;

     SQL.Add(SQLText);

     ShowMessage(SQL.Text);

     ExecSQL;

   Except

     ShowMessage('对不起,数据更新错误');

     Exit;

   end;

   Try

     SQLText := 'Insert csdnyh_User (User_Name,User_Pass) Values(' + #39 + User_Name + #39 + ',' + #39 + User_Pass + #39 + ')';

     Close;

     SQL.Clear;

     SQL.Add(SQLText);

     ExecSQL;

   Except

     ShowMessage('对不起,数据更新错误,第二张表');

   end;

   Try

     SQLText := 'Insert csdnyh_UserInfo (UserInfo_name,UserInfo_Em,UserInfo_QQ) Values(' + #39 + User_Name + #39 + ','+ #39 + UserInfo_Email + #39 + ',' + #39 + UserInfo_QQ + #39 + ')';

     Close;

     SQL.Clear;

     SQL.Add(SQLText);

     SQL.SaveToFile('Csdnyh_Info.TxT');

     ExecSQL;

   Except

     ShowMessage('对不起,数据更新错误,第三张表');

     Exit;

   end;  {}

 end;

 Applied := True;

end;

希望到此,你可以很清晰的理解多表更新;

小小祝愿你会是最棒的一个;