在李维的《Delphi5.X ADO/MTS/COM+高级程序设计篇 》p444提到了这个问题,他的解决办法是修改provider程序单元中的TDataSetProvider.InternalApplyUpdates方法,以下是他修改的代码:
function TDataSetProvider.InternalApplyUpdates(const Delta: OleVariant; MaxErrors: Integer;
  out ErrorCount: Integer): OleVariant;
var
  TransactionStarted: Boolean;
begin
  CheckDataSet;
  TransactionStarted := not IProviderSupport(DataSet).PSInTransaction;
  //!!! Modify By Gordion Li
  if ( (TransactionStarted) and (GetObjectContext = nil) ) then
    IProviderSupport(DataSet).PSStartTransaction;
  try
    CheckResolver;
    Resolver.FUpdateTree.InitData(DataSet);
    try
      Result := inherited InternalApplyUpdates(Delta, MaxErrors, ErrorCount);
    finally
      Resolver.FUpdateTree.InitData(nil);
    end;
  finally
  //!!! Modify By Gordion Li
    if ( (TransactionStarted) and (GetObjectContext = nil) ) then
      IProviderSupport(DataSet).PSEndTransaction((ErrorCount <= MaxErrors) or (MaxErrors = -1));
  end;
end;
你可以看一下问题是否依然存在。

解决方案 »

  1.   

    很遗憾,上面的代码其实无需改,因为当Provider的属性ResolveToDataSet设置为True时,我跟踪Provider,发现ADO并不额外启动事务。昨晚上为了解决Delphi在ADO 2.6下的BUG,安装了UP1,ADOUP1,ADOUP2以后,同时发现我的问题也解决了。我想可能是Delphi5的UP1改正的吧。还是要谢谢你的热心帮助。前面有一位朋友好象也有类似的问题,如看到的话请先安装UpdatePack试试。
      

  2.   

    问题还没解决!!!
    装完UpdatePak后,可以提交而没有错误信息。
    但是,如果我的服务器为"支持事务或不支持事务"类型就一切正常。
    当服务器设为"需要事务或需要新事务"提交完后,SQL-Server7的数据库并没有被更改。
    也就是说,虽然客户程序执行了提交,而没有错误信息,似乎提交成功的时候,一刷新,数据又回去了。
    然道一定要用"支持事务或不支持事务"的事务类 型吗?
      

  3.   

    我也关注这个问题,现在我没法用MTS提供的事务机制,只能用MIDAS的事务机制(原来我按照李维书上的例子把provider.pas修改了,现在又改回来,然后组件设成支持事务)。我觉得这个问题还是ADOExpress的问题,看来问题的彻底解决需要等Borland公司推出新的升级包的了。希望还有更好的解决办法。
      

  4.   

    大家是否也用MTS作N-Tier应用?也遇过此类问题吗?又都是怎么解决的呢?
      

  5.   

    我也有这个间题,关注
    支持事务的com+三层中客户端有"不能在此会话中打开一个新的事务"怎么解决
      

  6.   

    拉。
    有人做过MTS应用吗?帮帮忙吧。