三层问题,我想更新多个表的数据,待解答(100分)

  • 主题发起人 主题发起人 ddzhouqian
  • 开始时间 开始时间
D

ddzhouqian

Unregistered / Unconfirmed
GUEST, unregistred user!
看过李维的基本书,从中有所收益,但对实际问题似乎又无从下手,要做一小型系统,想
使用三层结构:
1.数据的处理在哪层实现,是中间逻辑层,服务端还是客户端?
A.查询
B.添加,修改,删除
备注:在进行多表更新时的用法,我不准备用关联表的方法来更新,对于业务上繁琐的要求用SQL可能比较灵活些.
2.数据在更新过程中的容错问题.如何解决.
如我有个事物,在更新第一表的时候正常,第二张表的时候出现异常,如何处理?
以上两个问题我需要详细的代码.
请各位三层高手或者对该问题感兴趣的朋友能够给予帮助,多谢了
可能提的问题还不是很明确,请多多包含啊!
 
没人回答啊?那我先详细问个问题
在客户端用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.中间层代码部分:
我如何获取传过来要添加的数据啊?
求教各位了!
 
难道大家都在忙着学windows吗?
 
各位我等了一个下午了,都没有个人回个贴
我在细说一下,用MTS如何在逻辑层(中间层)与数据层(服务端)进行通讯(我用的是MTS OBJECT+MTS DATA),实现数据的处理啊(是多表)?(添加,删除,修改)我不调用存储过程如何实现啊?
可否给个例子啊?或者在我上面的代码中添加,急啊
多谢了
 
你的问题太大了,恐怕用几页纸都写不完,谁能答得上呀!不过我这里有个东西给你借鉴
看我们是怎样解决的
www.szmax.net/webpush-8.htm
关于webpush是花了不少心血和技巧的产品,一直是用来做公司的项目的,在这不是做广告,只希望大家捧个场,提个意见!
谢谢
 
问题在大,也可一一剖析出来解决啊?
知道多少说多少啊!
全当时讨论的了啊,一贴不回不免有些寒心啊!
 
1。我觉得涉及到数据库操作都应该放在服务端
2。在服务端些接口进行数据处理,出错就事务回滚并给客户端返回错误信息
 
各位请指教,并提出指正:
客户端(插入代码):
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.begin
Trans;
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;
谢谢了
 
以上代码拙劣,请各位指教,希望人人参与
 
做个MTS/COM+对像并一定要启动事务,三个更新都放在一个事务中就可以了
 
你上面结构很好,我们一直都是3层结构,client-业务-数据处理,
这样可以将数据处理采用both可以共享,非常好用。
提示:千万不要采用ClientDataSet,这个会让你死得难看,直接采用olevariant作为数据参数。
 
to djrj:
"做个MTS/COM+对像并一定要启动事务,三个更新都放在一个事务中就可以了"
以上是否可以理解成:如果要进行三个更新处理,MTS对象中并不需要启动事务,只要支持就可以了,而MTSDATA中一定要有个事务!
是否?
to dcsdcs:
1.多谢夸奖,我其实也是按部就班的照着书做的,只不过书中说的是更新,我用的是插入罢了.
2."client-业务-数据处理"中的业务我这里似乎没有什么功能只是个中转(调用)的作用,并没有实现真正功能.我想问是不是业务就是这样啊?你可否给我提供个例子啊,代码和文字都可以的,麻烦了.
3."千万不要采用ClientDataSet,这个会让你死得难看,直接采用olevariant作为数据参数。"首先谢谢你的提醒,但我还是有点不明白,书中说是查询的时候可以通过CLIENTDATASET来传输,这样可以提高代码效率.书中说的CLIENTDATASET是在CLIENT与业务层中加,而CLIENT中的并不进行通讯,是独立的,数据是通过借口涵数来获取的,而业务层是通过通讯设置来获取数据处理端的某个DATASETPROVID中的数据的.
我现在是通过这种方式做的,是否可以啊?
你所顾及的是什么情况下用会导致什么问题啊?可以给予一些明确的提示啊?
多谢各位了,继续........
 
路过学习 帮你顶
 
2."client-业务-数据处理"中的业务我这里似乎没有什么功能只是个中转(调用)的作用,并没有实现真正功能.我想问是不是业务就是这样啊?你可否给我提供个例子啊,代码和文字都可以的,麻烦了.
我的理解是,所有与业务逻辑有关,有可能会经常变动的东西,都要想办法写在中间层。举个简单的例子,有这样一个需求:
系统在列表时应把所有开支大于50元的记录显示为红色。
这个50元就属于业务逻辑,以后可能会调整成60,70。也有可能变整个需求变为“开支大于收入80%时记录显示为红色”
那么就不要在客户端判断开支是否大于50。而应该在中间层处理DATASET时加一个叫Emergent的计算字段。判断开支大于50时,字段值为True.否则为false. 在客户端根据emergent的值来显示。也就是把上面的一条需求理解为:
业务层需求:开支大于50的记录应视为紧急记录
表达层需求:在列表时把紧急记录显示为红色
 
后退
顶部