I
import
Unregistered / Unconfirmed
GUEST, unregistred user!
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;
希望到此,你可以很清晰的理解多表更新;
小小祝愿你会是最棒的一个;
前些日子看过李维的书,介绍分布式处理的;
其中有一个是多表处理,对多表进行更新,说实话,我觉的如果你是新手的话,可能会被他的逻辑所困扰,记得它当时一共是用了三个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;
希望到此,你可以很清晰的理解多表更新;
小小祝愿你会是最棒的一个;