CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  网络通信/分布式开发

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

楼主dd_zhouqian()2006-03-04 15:21:42 在 Delphi / 网络通信/分布式开发 提问

看过李维的基本书,从中有所收益,但对实际问题似乎又无从下手,要做一小型系统,想  
  使用三层结构:  
  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

相关问题

  • 更新表数据
  • 谁能解答:如何更新中文表名字段名的Access数据库记录
  • 多表数据的更新
  • 数据库更新错误!!!!???请高手解答!
  • 数据集更新后MSHFlexGrid1表格内数据无法更新
  • datareport报表的数据更新
  • 数据表更新问题(急)
  • 数据库的多表更新问题?
  • 多表数据更新问题
  • 多表数据更新问题

关键词

  • 代码
  • 数据
  • 客户
  • 李维
  • 逻辑
  • vdata
  • qcoor
  • 中间层
  • 表
  • 更新

得分解答快速导航

  • 帖主:dd_zhouqian

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo