如何对COM+除错及COM+中为何程序改为必需交易便出错的问题。(200分甚至更多)(200分)

  • 主题发起人 主题发起人 zhangkan
  • 开始时间 开始时间
Z

zhangkan

Unregistered / Unconfirmed
GUEST, unregistred user!
1.我想实现COM+除错功能.
我照着李维书中的方法,在Delphi5和Delphi6中都无法成功。出现“服务器执行失败”的
错误。我想应该是Delphi的问题。因为我在元件服务中设好后,若Delphi中不打开该档案,
就能正常执行,但若Delphi中打开要除错的服务端程序,照着书中方法在run->paramters中
设置好,就会出现上述问题。
2.为何我的程序不能改为必需交易模式?
我在支援交易下能够正常运行,但其并不在交易保护模式下,而我将该元件改为必需交易便
出错“stack owerflow”,为何会如此呢?我也照着将李维提示的那两个档案改了。代码如
下,若哪位愿意帮忙,我可以将源程序发给你。哪位有COM+的源代码也可以发给我,若对我
有帮助,一定高分相送!我的email地址:abkk2000@21cn.com。
这是写的一个直接执行SQL的元件,可将其改为必须交易却出问题。
procedure TdmDoIt.DoIt(const sSQL: WideString);
begin
try
with adoqDoIt1do
begin
Active:=False;
SQL.Clear;
SQL.Add(sSQL);
ExecSQL;
SQL.Clear;
end;
// SetComplete;
SetAbort;
except
SetAbort;
end;
end;

以下是另一个元件调用上面这个元件,都在COM+服务程序中。
procedure TmtsSecurity.WritLoginOut(const Sys_ID, User_ID: WideString;
In_Time: TDateTime;
const Card_ID: WideString);
var Use_Time,sIn_Time,sOut_Time,sSQL:string;
Exit_Time:TDateTime;
IDo:IdmDoIt;
begin
Exit_Time:=now;
Use_Time:=FormatDateTime('hh:nn:ss',(Exit_Time-In_Time));
sIn_Time:=FormatDateTime('yyyy/mm/dd hh:mm:ss',In_Time);
sOut_Time:=FormatDateTime('yyyy/mm/dd hh:mm:ss',Exit_Time);
sSQL:='update loginuser set exit_time=';
sSQL:=sSQL+'to_date('+''''+sOut_Time+''','+'''yyyy/mm/dd HH24:MI:SS'''+'),';
sSQL:=sSQL+'use_time='+''''+Use_Time+'''';
sSQL:=sSQL+' where user_name='+''''+User_ID+'''';
sSQL:=sSQL+' and log_Time=to_date('+''''+sIn_Time+''','+'''yyyy/mm/dd HH24:MI:SS'''+')';
sSQL:=sSQL+' and net_Address='+''''+Card_ID+'''';
try
OleCheck(ObjectContext.CreateInstance(CLASS_dmDoIt,IID_IdmDoIt,IDo));
IDo.DoIt(sSQL);
//程序运行到这儿时便出问题,必需交易模式下。
SetAbort;
//而若改成支援交易,这句没有用,数据还是会被执行,这一点我知道,是因为
// SetComplete;
//在支援交易下并不受交易保护。
except
SetAbort;
end;
end;

我的编译环境是Delphi6。
请教哪位对COM+除错成功过的朋友答复一下(原因和解决办法)。另外,我见到书中几乎每
一个物件都是一个DLL,而我则比较喜欢将多个放在一个DLL中(比如说一个模块放在一个DLL中),
请问哪样要好一些呢?谢谢!
不知网上有没有一个专门讨论用Delphi写COM+的地方?
 
如果有高手回答,也请给我一份。
hallowdelphi@263.net
 
第一个问题我已找到解决方法了。现在200分都给第二个问题。还有一个贴子588900,上面
还有100分,一共300分。不够还可以加,麻烦哪位帮忙回答一下!!
 
DELPHI5的补丁有没打过,看SQL语句好象是ORACLE数据库,如果是ORACLE数据库则
http://www.microsoft.com/china/msdn/library/techart/complus_best.asp
你看一下上面的文章,题目是

使用 Oracle 和 COM+ 的最佳练习
可能对你很有帮助
 
我现在用侦错功能查到这么一句错误,请大伙儿帮我看看是什么问题.
Failed to enlist global transaction with DTC,看字面意思也大致懂,可就是不知怎么
解决,现在问题明朗化了,哪位出手呢?
要是谁能给我一个比较成熟的COM+源码学学,比如里面有元件中调用元件,如何定义企业
物件,完整的交易管理等等让小弟借鉴一下,定高分相送!
 
程序在执行到
try
OleCheck(ObjectContext.CreateInstance(CLASS_dmDoIt,IID_IdmDoIt,IDo));时便出错
完整错误信息:"[ORACLE][ODBC]Failed to enlist global transaction with DTC"
继续跟踪,是在ComObj单元中
function TComObjectFactory.CreateInstance(const UnkOuter: IUnknown;
const IID: TGUID;
out Obj): HResult;
begin
Result := CreateInstanceLic(UnkOuter, nil, IID, '', Obj);
end;
然后出现:"Stack overflow“,
procedure OleError(ErrorCode: HResult);
begin
raise EOleSysError.Create('', ErrorCode, 0);
end;
接着是”灾难性失败“
我的数据库是ORACLE。
 
我找到上面那篇文章,里面有讲到:
Oracle Client 8i 对事务组件的限制
在 Oracle8i XA 客户库中存在一个导致所有 DTC 事务失败的错误。当使用 DTC 的 XA 支
持在用 Oracle8i 客户库的 Oracle 数据库上执行事务时,将显示该错误。这是 xa_close
实现中的错误。在修复了错误后,我们建议您对事务组件使用 Oracle 客户 8.0.5 和修
补程序 80524 或更高版本。
可我的ORACLE客户端是8.1.5呀,而且Microsoft ODBC for Oracle的版本是2.573.4403.00。
我真的搞不懂问题出在哪儿??
 
是不是你的系統還裝了其他安全軟件??
 
那篇文章上面不是提供了两个测试软件,你先下载按照上面的说明测试一下,如果都是成功那说明
ORACLE配置是成功的,不是ORACLE的缘故,否则有理由怀疑是ORACLE的配置不正确
 
為何我將數據庫改為ACCESS后﹐若將支援交易換成必需交易﹐便出"不支援此類界面"這種錯
誤﹖是我的MTS有問題嗎﹖我的操作系統是Win2000 Professional﹐這上面已經集成了COM+元
件服務﹐會是哪兒有問題呢﹖
function TComObjectFactory.CreateInstance(const UnkOuter: IUnknown;
const IID: TGUID;
out Obj): HResult;
begin
Result := CreateInstanceLic(UnkOuter, nil, IID, '', Obj);
end;
//在這一句的時候出問題。
 
老兄,好象ACCESS不支持事务吧
 
我也遇到过这个问题,我是这样解决的:
你如果定义了一个必需事务的COM+对象COMEX1,则你在使用COMEX1时必须是使用时才建立,
在你确认事务马结束后马上释放,否则你以后所建立的其他COM+对象都在还在你刚才的事务
保护下,必然会出现溢出的情况。
 
我的不是这个问题,因为我第一次运行的时候便出问题了.
 
检查下你的事务
 
请各位大侠说得清楚点。我总怀疑是ORACLE方面的问题,我认为不是事务方面的问题。
 
我遇到过你的两个问题,现在我都圆满的解决了。其实还是很好解决的。
 
楼上的,说出来呀,不用这么保密吧
 
如果你怀疑是oracle的问题,可以用sql server 试验一下吗?
另外,我建议你再win2000 server 版本上进行开发.
 
我的开发环境是Win2000 Professional+D6,Oracle 8.1.5,我没有SQL Server,没法试。
KAO!我把这个贴子放到深度论坛去怎么没人回答我?![:(]
 
后退
顶部