MIDAS中的多表更新讨论

virtualmfc 2002-11-15 05:04:01
在李维的书中讲到了Join方式的多表更新,为什么不使用巢状Master/Detail关系方式来更新呢?
是否是因为巢状Master/Detail方式要取出所有的数据记录,所以对数据库的负荷要求大。
另外,在DELPHI的MIDAS中使用巢状Master/Detail关系时,如果删除主表记录(而不是删除从表记录)会导致错误,那么应该如何来解决这个问题?
最后,李维说的Join更新是使用BDE,对于ADO应该如何处理呢?
...全文
122 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiume 2003-02-27
  • 打赏
  • 举报
回复
I am learning
yjcinfo 2003-02-27
  • 打赏
  • 举报
回复
ihihonline,你好,如果第二张表出错时,第一张表是否会保存呢?
spell 2003-02-24
  • 打赏
  • 举报
回复
good
malecjf 2002-12-03
  • 打赏
  • 举报
回复
做成同一事务。
xh_hero 2002-12-02
  • 打赏
  • 举报
回复
学习
lizongqi 2002-12-02
  • 打赏
  • 举报
回复
这位老兄真是好人!!
one_two 2002-11-18
  • 打赏
  • 举报
回复
学习中!
ihihonline 2002-11-17
  • 打赏
  • 举报
回复
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;

希望到此,你可以很清晰的理解多表更新;
小小祝愿你会是最棒的一个;
nj_wangzhen 2002-11-17
  • 打赏
  • 举报
回复
用ADO不需要你自己处理!!
看看事件探查器就明白了

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧