我接手了个别人的程序,是三层结构。客户端是Clientdateset + Socketconnection。
我想问下有没有办法像AdoConnection那样,用数据源创建个事务,接着执行所要的数据命令,再提交事务,或是回滚。
因为我在一个事件里除了ClientDataSet.ApplyUpdates(0) 外还会多加好几个命令式的增删改。
如果是都在一起的话可以直接把所有的命令都整在一起,用begin end 。但最惨的就是在这增删改中间会多出条ClientDataSet.ApplyUpdates(0);而且有的还需要上一步的新增命令执行完,然后取值在下一步进行修改。
所以想问下有没有办法实现类似
  try
  adoconnection1.BeginTrans;
  ...//执行命令
  ADOConnection1.CommitTrans
  except
   ADOConnection1.RollbackTrans;
  end;

解决方案 »

  1.   

    有些是可以写存储过程,不过不些操作比较多需要用ClientDataSet.ApplyUpdates(0)来完成。所以才麻烦点。而且程序是有关数据库的,这种操作很多,总不好一新建个窗体就去那个存储过程吧!
    还有什么其他办法吗?还是说多加个什么控件?
    我网上看到有人提到TAdoConnection或TDataBase控件 但具体怎么关连怎么操作不清楚
      

  2.   

    你的服务器不是用ADO组件做的么?我的服务器是ADO组件做更新可以进行事物操作
      

  3.   

    还是在存储过程中处理吧。
    如果是Ado,就直接支持事务了。
      

  4.   

    我服务器是ADO,但我这是多客户端,如果直接从服务器做事务可能会影响到别的客户端
    用存储过程有办法处理dbgrid上的更新吗?
      

  5.   

    存储过程中做和ADO中做其实也差不多的哦,至于更新三层中,一般是先POST到要本,然后再提交到服务器端,和DBGRID上的数据更新是无关的,因为最先更新的就是DBGRID
      

  6.   

      if not Conn.InTransaction then
        Conn.BeginTrans;
      try
      {更新资料的代码}    if Conn.InTransaction then
          Conn.CommitTrans ;
      except
        on E:Exception do
        begin
          if Conn.InTransaction then
            Conn.RollbackTrans ;
          raise Exception.Create(E.Message);
        end ;
      end ;
      

  7.   

    我想要的是在客户端进行事务处理。
    楼上你那种是在服务器上的数据源进行事务。
    但如果多个客户端同时使用时就会有问题了,要么出错,要么要等别人处理完了才能!
    因为我这边做的客户端是不少,有的操作时间可能会长一点。所以不能一有人处理别人就在等。总不能一个客户端就在服务器上配一个ADOCOnnection去连接吧。
    我想要的就是最好能在客户端上把事务处理好,然后直接发给服务器。可能有点麻烦吧!
      

  8.   

    我们这边是服务器上进行处理,操作的是ORACLE数据库,几百人同时使用没有问题。客户端处理个人认为不太靠谱。不过我们这边是多服务器。
      

  9.   

    我也知道,以前我弄两层的时候也是,不过那是不同的程序,事务就不一样了。现在是服务器只有一个。
    我现在是多个ClientDataSet同时处理,ClientDataSet.ApplyUpdates(0)和 ClientDataSet.Execute交叉使用。
    比如:
     ..
     ClientDataSet.Execute;
     ..
     ClientDataSet.ApplyUpdates(0);
     ..
     ClientDataSet..Execute;
    这些是要在同一个事件里完成。那要是最后一个出错,不都完了!!
    所以想做弄个事务,保险点!
    你说‘操作几笔资料后就自动更新到服务器’这要怎么做啊?
      

  10.   

    在服务器端,做事务程序。客户端上传SQL命令,执行事务。
      

  11.   

    客户端主要是用TClientdateset+TSocketConnection
    服务器是用TADOConnection+TADOQuery,再用一个Tbc_server的窗体(以.tlb结尾)写函数。
    中间是用borland socket server设置端口。
    客户端在执行SQL语句时是用TClientdateset调用服务器上自己写函数,把SQL命令以字符的形式传过去,而服务器就把传过来的字符串用TADOQuery执行。若有返回数据集就用Variant的形式返回客户端。
    Clientdateset.data := Clientdateset.RemoteServer.AppServer.fun_getdatasql('SQL语句')最后一个是服务器上的函数名。
    但也可以用Clientdateset.CommandText;Clientdateset.open;