try
  开始事务
...谢你的程序  结束事务
  写标记成功except
begin
  事务回滚
  写标记为失败
end;

解决方案 »

  1.   

    你可以自己在SQL Server中设计一个DTS包,其中包括事务处理就行了
      

  2.   

    adodataset1.first
    for i:=0 to adodataset1.count-1 do 
    begin 
      try
      adoconnect.begintrans
      ...(传送)
      写标记成功 
      adoconnect.committrans
      except
      begin
      adoconnect.Rollbacktrans
      写标记为失败
      end;
    adodataset.next
    end;
    不好意思,随心写的,很乱 
     
      

  3.   

    谢谢各位的参与!
    我的意思是:要连接到俩个数据库服务器的俩个表中,所以用了俩个TAdoConnection构件,一个连接本地网络的数据库服务器,另一个连接远程的数据库服务器,然后将本地的一个表中的记录传送到远程服务器的某一表中,若传送成功,将本地的该记录打标记,若没有传送成功,当然不给本地的该记录打标记。关键问题是如果传送成功了,但在给本地的记录打标记时发生了错误,那么必须将远程数据库服务器中的表中的刚才传送的那条记录作废,方可保证数据的一致性。我想用事务的方法解决这样的问题,不知是否可行?
    以下是我自己的代码,可行否?
    假定有某表,有俩个字段Name:VarChar(10), Flag:Char(1),在本地和远程的数据库服务器各有一个拷贝,现要求将本地的字段Flag为‘F'的记录倒入远程服务器的对应表中,倒入成功后将本地的记录的Flag标记为'T'。以下代码不考虑对象的创建与释放。var
      acLocal, acRemote: TAdoConnection;
      aqLocal, aqRemote: TAdoQuery;
    begin
      //创建对象建立数据库连接
      
      try  aqLocal.Connection := acLocal;
      aqRemote.Connection := acRemote;
      aqLocal.Sql.Add('select * from LocalTable where Flag = ' + QuotedStr('F');
      aqLocal.Open();
      aqRemote.Sql.Add('select * from RemoteTable');
      aqRemote.Open();
      acLocal.BeginTrans();
      acRemote.BeginTrans();
      while not aqLocal.eof do
      begin
        aqLocal.Edit;
        aqLocal.FieldByName('Flag').AsString ;= 'T';
        aqRemote.Insert();
        aqRemote.FieldByName('Name').AsSTring := aqLocal.FieldByName('Name').AsString;
        aqRemote.FieldByName('Flag').AsString := aqLocal.FieldByName('Flag').AsString;
        aqLocal.Next();
        aqRemote.Post();
      end;
      acRemote.CommitTrans();
      acLocal.CommitTrans();
      
      except
        
        //传送失败    
        acRemote.RollbackTrans();
        acLocal.RollbackTrans();
      end;  //释放各对象
    end;
      

  4.   

    Borland_Delphi(老虎)您好,请具体介绍“DTS包” 或推荐一下该技术的相关资料。谢谢!
      

  5.   

    lkj99(永动机) ,您好!请赐教您最后是如何解决的?
      

  6.   

    因为我一直以来都是处于“闭关自守”状态,
    外面的人用什么科学、先进的技术方法,我真的不知道!
    我说我的想法,希望大家指点
    ---------------------------------------------------
                             
    1、总体:  客户端      <-----Winsock(TCP)----->   服务器2、客户端:(1)获取待传送数据,保存到一个文件(还可加密)
              (2)压缩文件
              (3)拨号(连接远程服务器) 
              (4)利用WINSOCK把文件传送到远程服务器
    3、服务器端:
              (1)监听端口,接受连接申请,分配资源
              (2)接收数据(文件)
              (3)解压,解密
              (4)更新数据库 
      

  7.   

    LKJ99(永动机) ,谢谢!你的方法到是可行,不过需要套接字程序的设计。我在VC下面做过这样的文件传送程序,在Delphi下面还没有。delphi下编制这样的程序若不使用套接字控件直接用Sicket Api是很繁的——需要引入很多的Api函数。而套接字控件据说有一些问题。你是如何做的哪?这些代码可以贴出来吗?
    另外,您的服务器端负责侦听的程序是一直在运行吗?是多线程的吗?如果是一直在运行的,需要考虑的问题很多。譬如运行时获得的资源是否可以彻底的释放等等。你是怎样解决的?
    我目前的一个项目中需要这样的功能,由于时间很紧,恐怕难以使用传文件的发法了。就我上面的使用事务的方法除了你所讲的占用时间多以外,还有其他缺陷吗?最重要的是能否保证本地和远程的数据的一致性。再次谢谢 LKJ99(永动机) !同时谢谢各位的参与!
    分数在我们讨论后一定会奉上!
      

  8.   


     这个问题很有趣,没碰到过,但觉得很常见
     LKJ99(永动机) 的方法该是可行的,
    但如果能直接通过数据库的事物管理能力来解决,该会简单好多……不好意思,帮不了忙
      

  9.   

    try
      开始事务
    ...谢你的程序
      写标记成功
      结束事务
    except
    begin
      事务回滚
      写标记为失败
    end;
    将第一位仁兄的程序改一下即可以上是将写标记成功这段提到结束事务以前即可。
      

  10.   

    可以使用COM+的Distributed Transaction Coordinator (DTC)来完成你需要的功能。首先使用DTCGetTransactionManager来获得一个ITransactionDispenser接口,这样就建立了与DTC的连接。然后调用这个接口的BeginTransaction方法,就获得一个ITransaction接口。这之后你就可以按照自己的需要操作数据,如果成功就调用ITransaction接口的Commit方法,如果失败就调用Abort方法。DTC会自动完成事务管理。