三层问题,我想更新多个表的数据,待解答
看过李维的基本书,从中有所收益,但对实际问题似乎又无从下手,要做一小型系统,想
使用三层结构:
1.数据的处理在哪层实现,是中间逻辑层,服务端还是客户端?
A.查询
B.添加,修改,删除
备注:在进行多表更新时的用法,我不准备用关联表的方法来更新,对于业务上繁琐的要求用SQL可能比较灵活些.
2.数据在更新过程中的容错问题.如何解决.
如我有个事物,在更新第一表的时候正常,第二张表的时候出现异常,如何处理?
以上两个问题我需要详细的代码.
请各位三层高手或者对该问题感兴趣的朋友能够给予帮助,多谢了
可能提的问题还不是很明确,请多多包含啊!
问题点数:50、回复次数:10Top
1 楼dd_zhouqian()回复于 2006-03-04 17:19:12 得分 0
没人回答啊?那我先详细问个问题
在客户端用CLIENTDATASET时,我想在表table1中增加一条数据,并且table2中也相应增加一条,如何在中间层实现?
结构如下:
table1:
id varchar(10)
name varchar(20)
id1 varchar(10)
table2:
id1 varchar(20)
name1 varchar(20)
1.客户端实现方式
客户端代码部分:
ClientDataSet1.ApplyUpdates(0)
ClientDataSet2.ApplyUpdates(0)
但我不想这样实现因为该窗口只是显示ClientDataSet1的数据
2.中间层实现方式代码部分
a.客户端代码部分:
var qCoor:IMTSDemoQueryCoor;
vDatas:OleVariant;
begin
qCoor:=CoMTSDemoQueryCoor.CreateRemote('127.0.0.1');
//我如何把要添加的数据传给变量vDatas?
qCoor.Inserttable1(vDatas);
end
b.中间层代码部分:
我如何获取传过来要添加的数据啊?
求教各位了!Top
2 楼lovendII(流氓都做了城管)回复于 2006-03-04 17:29:56 得分 0
1.数据的处理在哪层实现,是中间逻辑层,服务端还是客户端?
=======
李维应该说得很清楚,一般在中间层,或者直接用数据库的存储过程(添加,删除,修改等处理)
查询在哪层都可以写代码,看具体情况。
2。2.数据在更新过程中的容错问题.如何解决.
如我有个事物,在更新第一表的时候正常,第二张表的时候出现异常,如何处理?
==========
如果更新好几个表的时候,用事务处理,如果一个表更新失败,那其他的表的操作也同时取消。
Top
3 楼dd_zhouqian()回复于 2006-03-04 18:47:05 得分 0
老大,我都等了一个下午了,才有你老人家回个贴
我想在细问一下,用MTS如何在逻辑层(中间层)与数据层(服务端)进行通讯(我用的是MTS OBJECT+MTS DATA),实现数据的处理啊(是多表)?(添加,删除,修改)我不调用存储过程如何实现啊?
可否给个例子啊?或者在我上面的代码中添加,急啊
多谢了
Top
4 楼jmhlp(网事如风)回复于 2006-03-05 16:05:11 得分 0
李维在《Delphi 5 ADO/MTS/Com+》一书中说得比较清楚,要在中间层实现
Update1(vdatas:Olevariant,imaxError:integer,ierrorsCount:integer)方法,
Update2(vdatas:Olevariant,imaxError:integer,ierrorsCount:integer)方法,
Update3(vdatas:Olevariant,imaxError:integer,ierrorsCount:integer)方法;
再在客户端调用该方法, qCoor.update1(ClientDataSet1.Delta,0);
qCoor.update2(ClientDataSet2.Delta,0);
qCoor.update3(ClientDataSet3.Delta,0);
同时,你要自己控制事务处理的方法,在服务器端还要这样写
procedure TDataModule1.ADODataset1BeforePost(DataSet:TDataSet);
begin
if not ADOConnection1.InTransaction then
ADOConnection1.BeginTrans
else
showmessage('已有别的工作在做,请稍等后再试...')
end;
procedure TDataModule1.ADODataset3AfterPost(DataSet:TDataSet);
begin
ADOConnection1.CommitTrans;
end;
procedure TDataModule1.ADODataSet1PostError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
begin
ADOConnection1.RollbackTrans;
Action:=daAbort;
end;
procedure TDataModule1.ADODataSet2PostError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
begin
ADOConnection1.RollbackTrans;
Action:=daAbort;
end;
procedure TDataModule1.ADODataSet1PostError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
begin
ADOConnection1.RollbackTrans;
Action:=daAbort;
end;
如果你不用主从控制,就只能这样写了,不过这是个非常不好的设计,不仅享受不到MTS
的好处,还要自己写代码来维护事务的完整性,真惨!
Top
5 楼jmhlp(网事如风)回复于 2006-03-05 16:13:35 得分 0
你要在ClientDataSet2中相应增加ClientDataSet1的记录可以这样:
vdatas:=ClientDataSet1.data;
ClientDataSet1.AppendData(Vdatas,true);
然后再用qCoor.update方法;
Top
6 楼5207(踏雪)回复于 2006-03-05 20:57:54 得分 0
多层当然将数据处理放在中间层.Top
7 楼fffddd(假钞换贞操)回复于 2006-03-10 14:08:41 得分 0
一般都是在中间层处理的。
同时更新多个表,你得建立一个视图,更新时数据库会自动加更新锁的,不用你担心。Top
8 楼dd_zhouqian()回复于 2006-03-13 21:27:29 得分 0
to :jmhlp(网事如风)
我想用MTS OBJECT+MTS MOUDULE,如何写啊?
烦劳了,可否给你例子
Top
9 楼dd_zhouqian()回复于 2006-03-13 23:39:21 得分 0
各位请指教,并提出指正:
客户端(插入代码):
procedure TForm1.Button4Click(Sender: TObject);
var qCoor:IMTSDemoQueryCoor;
vDatas: array of string;
begin
qCoor:=CoMTSDemoQueryCoor.CreateRemote('127.0.0.1');
SetLength(vDatas,2);
vDatas[0]:=Edit1.Text;
vDatas[1]:=Edit2.Text;
qCoor.InsertPublishers(vDatas[0],vDatas[1]);
end;
业务层(更新代码):
procedure TMTSDemoQueryCoor.InsertPublishers(const vDatas1,
vDatas2: WideString);
var Publishers : IMTSPublishers;
begin
//InsertPublishers
if not assigned(Publishers) then
Publishers := CoMTSPublishers.Create;
Publishers.InsertPublishers(vDatas1,vDatas2);
end;
数据处理层(更新代码):
procedure TMTSPublishers.InsertPublishers(const vData1,
vData2: WideString);
begin
try
ADOCPublishers.BeginTrans;
ADOQUpdate.Close;
ADOQUpdate.SQL.Clear;
ADOQUpdate.SQL.Add('Insert into Publishers (VID,PublisherName) values (:VID,:PublisherName)');
ADOQUpdate.Parameters.ParamByName('VID').Value:=vData1;
ADOQUpdate.Parameters.ParamByName('PublisherName').Value:=vData2;
ADOQUpdate.ExecSQL;
ADOQUpdate.Close;
ADOQUpdate.SQL.Clear;
ADOQUpdate.SQL.Add('Insert into Books (VID,BookID,BookName) values (:VID,:BookID,:BookName)');
ADOQUpdate.Parameters.ParamByName('VID').Value:='';
ADOQUpdate.Parameters.ParamByName('BookID').Value:='';
ADOQUpdate.Parameters.ParamByName('BookName').Value:='测试';
ADOQUpdate.ExecSQL;
ADOCPublishers.CommitTrans;
//SetComplete;
except
ADOCPublishers.RollbackTrans;
//SetAbort;
end;
end;
谢谢了
Top
10 楼dd_zhouqian()回复于 2006-03-18 12:41:37 得分 0
请各位指教啊,是本人的代码太拙劣了?还是思想不正确,请给予明示Top




