我最近写的一个项目中,使用的是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;
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;
解决方案 »
- 请高手指教:DLL中“结构指针”赋值怪现象
- 关于一个小的提示的设计
- 关于DBGRID的行号和列号?
- 为什么我在使用LeftStr()函数的时候报错“undecleared identifier 'LeftStr'”
- 在TreeView中拖放节点的问题.
- 如何读取硬盘ID CPU系列号,我试过很的例子,但总是只能在windows 2k可以,但换了98和me时就不能用了
- 谁知道多层系统生成的应用服务器怎么从系统中完全删除?
- 从那里可以找到编译器或者转换器的原码?
- 怎样把图片存入数据库字段的表里面
- Delphi 报表高手请进!!紧急求援
- 怎么使 非汉字 不能输入到memo里???
- 我已经编过几个程序了,但感觉技术还不够,请问要进一步提高应该怎么做?
开发时为了省事全部使用缺省的Apartment模型。不知道与这个有没有关系?
Raptor(猛禽)兄,你的环境是如何的?
所有COM+都是STA 都是Require Transaction
GoodsFacade是一个Transactional Object
Goods和OnHand是两个Transactional Data Module
客户端通过CoGoodsFacade.CreateRemoteInstance(...)来创建COM+ Object的。
调用了CoGoodsFacade.Create.DelGoods(xx,Delta);方法时会出现“灾难性故障”,而且在 事件查看器中没有错误日志,仅在使用SQL SERVER跟踪时会发现错误。到底是怎么回事呢?我都急死了。帮忙问一下各位大侠有没有碰到过这个问题的。解决立即给分!!!
我把我那个DEMO给你看看。
[email protected]谢谢!!!
另外,能否交个朋友?行的话,请给我的邮箱发封信。OK?