导航
  • 主页
  • 招聘
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API
  • 问答

COM+的事务问题,分数不够再加哦!!!!!高手去哪了????

morphia 2001-08-29 09:55:52
我做了一个COM+的组件,主要用于产生一个标识的下一个ID的,组件中使用事务的代码如下:

function TIdenGen.GetNextID(const str_IdenName: WideString): Integer;
var
TransactionContextEx: ITransactionContextEx;
IdenGetObj: IIdenGet;
IdenSetObj: IIdenSet;
IdenAddObj: IIdenAdd;
CurrentID: Integer;
begin
TransactionContextEx := CreateTransactionContextEx;
try
OleCheck(TransactionContextEx.CreateInstance(CLASS_IdenGet, IID_IIdenGet, IdenGetObj));
CurrentID := IdenGetObj.GetIDByName(str_IdenName);
if CurrentID = -1 then
begin
OleCheck(TransactionContextEx.CreateInstance(CLASS_IdenAdd, IID_IIdenAdd, IdenAddObj));
IdenAddObj.AddIDByName(str_IdenName);
Result := 0;
end else
begin
Inc(CurrentID);
OleCheck(TransactionContextEx.CreateInstance(CLASS_IdenSet, IID_IIdenSet, IdenSetObj));
IdenSetObj.SetIDByName(str_IdenName, CurrentID);
Result := CurrentID;
end;
TransactionContextEx.Commit;
except
TransactionContextEx.Abort;
raise;
end;
end;

但是,我使用下面程序调用:

procedure TForm1.Button2Click(Sender: TObject);
var
obj: Variant;
begin
obj := CreateOleObject('iden.idengen');
Log.Lines.Add(IntToStr(obj.GetNextID('test')));
obj := Unassigned;
end;

第一次可以通过,但是第二次再点击BUTTON2时,出现错误:
“分布式事务已经完成,请将此会话登记到新事务或NULL事务中”

我不知道这是怎么回事,请帮我看看哦,高手们。


我头都大了!!!!!!!!!
...全文
228 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tense 2001-08-31
关注
回复
morphia 2001-08-31
up
回复
morphia 2001-08-31
楼上的,你怎么知道?
回复
Hyphoon 2001-08-31
To morphia:你是广州人吗?
回复
morphia 2001-08-31
问题已经解决,结
回复
morphia 2001-08-30
up
回复
morphia 2001-08-30
to szgs(szgs):
我那一段创建事务的代码是协调对象中的,在其它的对象中都是使用SetComplete及SetAbort来说明本组件的运行状态。

控制事务好象只有用程序来控制吧,你有什么方法呢?
谢谢
回复
猛禽 2001-08-29
帮你UP一下。
回复
sxgs 2001-08-29
建议不要自己创建事务环境,而是通过组件管理器的属性设置,自否则就会出现各种莫名奇妙的问题。
回复
morphia 2001-08-29
高手高手高手高手高手高手高手!!!!!!!!!!!!!!!1
出来出来出来出来出来出来出来出来出来出来!!!!!!!!!!!!!!!!1
回复
发动态
发帖子
Delphi
创建于2007-08-02

4802

社区成员

Delphi 开发及应用
申请成为版主
社区公告
暂无公告