我最近写的一个项目中,使用的是COM+,按照COM+规范的要求,我写了一个协同事务的方法,但在执行时却发现SQL Server 2000会报灾难性故障。下面是摘取出来的代码://TGoodsFacade是Require Transaction的COM+对象
procedure TGoodsFacade.DelGoods(GoodsID: Integer; Value: OleVariant);
var
  LOnHand: IOnHand;
  LGoods: IGoods;
begin
    ObjectContext.CreateInstance(CLASS_Goods, IID_IGoods, LGoods);
    ObjectContext.CreateInstance(CLASS_OnHand, IID_IOnHand, LOnHand);
    LOnHand.DelOnHand(GoodsID); //库存表的DelOnHand方法
    LGoods.Save(Value); //调用货品表的Save
end;
//库存表的DelOnHand方法
procedure TOnHand.DelOnHand(GoodsID: Integer);
var
  LCommandText: String;
  RecordsAffected: Integer;
begin
  try
    LCommandText := Format('DELETE FROM OnHand WHERE GoodsID=%d',[GoodsID]);
    Conn.Execute(LCommandText, RecordsAffected);
    SetComplete;
  except
    SetAbort;
    raise;
  end;
end;
//货品表的Save方法
procedure TGoods.Save(Value: OleVariant);
begin
  try
    with DataSet do
    begin
      Close;
      CommandText := 'SELECT * FROM Goods WHERE 1=0';
      Open;
    end;
    ClientDataSet.Data := Value;
    if ClientDataSet.ApplyUpdates(0) > 0 then
      raise Exception.Create('更新货品表错误,请与管理员联系!');
    SetComplete;
  except
    SetAbort;
    raise;
  end;
end;

解决方案 »

  1.   

    希望各位踊跃发言,分数不是问题。Raptor(猛禽)兄,赶快帮忙!!!急。。
      

  2.   

    我昨天按你的代码写了一个DEMO,完全没有问题啊。:(我也不知道你为什么出错了,不然你写一个能出错的DEMO代码给我看看
      

  3.   

    是吗?我使用的SQL Server2000 Personal、Windows 2000 Professional。而且所有的组件在
    开发时为了省事全部使用缺省的Apartment模型。不知道与这个有没有关系?
    Raptor(猛禽)兄,你的环境是如何的?
      

  4.   

    我是Windows 2k svr/SQL 2k EntSvr
    所有COM+都是STA 都是Require Transaction
    GoodsFacade是一个Transactional Object
    Goods和OnHand是两个Transactional Data Module
    客户端通过CoGoodsFacade.CreateRemoteInstance(...)来创建COM+ Object的。
      

  5.   

    Raptor(猛禽) 兄,我除了数据库与你的不一样之外,COM+都和你的一样,怎么还是在客户端
     调用了CoGoodsFacade.Create.DelGoods(xx,Delta);方法时会出现“灾难性故障”,而且在 事件查看器中没有错误日志,仅在使用SQL SERVER跟踪时会发现错误。到底是怎么回事呢?我都急死了。帮忙问一下各位大侠有没有碰到过这个问题的。解决立即给分!!!
      

  6.   

    给我发个MAIL:[email protected]
    我把我那个DEMO给你看看。
      

  7.   

    我的邮件地址:
    [email protected]谢谢!!!
      

  8.   

    昨天发了,被退回,我再发一次试试放到我主页上了:http://mental.mentsu.com/down/dev/complus1.zip
      

  9.   

    对不起,我犯了个低级错误!我的ClientDataset是个动态创建的,与后台数据表不一致,所以发生了这个问题。 Raptor(猛禽) 兄,辛苦你了,不好意思!这分全部给你了。
    另外,能否交个朋友?行的话,请给我的邮箱发封信。OK?