在一个方法中,我准备多次修改DM.cds.CommandText属性来取参数值,DM.cds.Close;
DM.cds.CommandText := '...';
DM.cds.Open;
sName := DM.cds.Fields[0].AsString;...
...但当我第二次调用时,
DM.cds.Close;
DM.cds.CommandText := '...';
DM.cds.Open;//调试时系统执行到这一步就愣住了,半天才报个错“分步式事务已完
//成,请将此会话登记到新事务或NULL事务中”如果屏蔽掉第二次调用的三句代码,程序运行正常,痛苦啊!
(注:几次的SQL均在SQL Server中测试通过)
DM.cds.CommandText := '...';
DM.cds.Open;
sName := DM.cds.Fields[0].AsString;...
...但当我第二次调用时,
DM.cds.Close;
DM.cds.CommandText := '...';
DM.cds.Open;//调试时系统执行到这一步就愣住了,半天才报个错“分步式事务已完
//成,请将此会话登记到新事务或NULL事务中”如果屏蔽掉第二次调用的三句代码,程序运行正常,痛苦啊!
(注:几次的SQL均在SQL Server中测试通过)
解决方案 »
- 请高手指点Invalid pointer operation 错误
- 当u盘插上后会触发什么事件
- tchart绘制曲线问题
- TExcelApplication,TExcelWorkBook,TExcelBooksheet套件中如何删除一个sheet?
- 我要作个消费型磁卡程序,不知如何下手
- 生死在此,高手们救命,在线等》》》》》》》》
- run这个function的uses 里怎么声明?
- DELPHI开发中能否将JPEG图片保存到ORACLE数据库内,如何保存?
- TMEMO控件中的任一行得到焦点有没有什么事件发生?
- 如何在windows下删除目录?
- 请问:怎么在另一个机器上发布在本机上编译后的COM+组件,客户端又怎么调用?
- qiockReport中,detail中如何补空行。使其打印完一页
2.中间层设置does not support transactions或设置成别的事务方式再试一下!根据你的需要,再决定,这应该是因为事务处理的原因造成的!
'SELECT TOP 1 FID FROM tGroup WHERE FClass=2 AND SUBSTRING(FCode,1,4)='0006'目的是要判段在tGroup表中存不存在满足WHERE条件的记录,这句执行的太慢了,导致事务超时,可能也有DM.cds一开一闭更改CommandText的原因,但我到SQL Server中运行第一次也比较慢,
要达到这种目的SQL的SELECT部分还应该怎么优化?但我总觉得不是SQL本身的事
怎样设定COM+事务超时?
是不是公用cds连接组件有什么限制啊,比如说要进行什么初始化之类,欢迎各高手参与讨论
多谢楼上几位的关注,但问题还没有解决,我也按照Miracle所说的优化了一下,但仍然出错,
我设置
ConnectionTimeout=1000;
CacheSize = 1000;
CommandTimeout = 1000;
又在组件管理器覆盖了全局事超时,将其设为300,可还是不行
类型 来源 分类 事件
信息 MSDTC CM 4156
事件详细描述:
字串信息: Session idle timeout over, tearing down the session。 那位高手能根据这个事件信息解决一下,提示中的Session时间指的是程序中的什么时间
try
try
DM.cds.Close;
DM.cds.CommandText := ...;
DM.cds.Open;
...
OleCheck(ObjectContext.CreateInstance(Class_oneObj, IoneObj, iIoneObj));
iIoneObj.ExecSQL('...');
...
iIoneObj.ExecSQL('...');
...
DM.cds.Close;
DM.cds.CommandText := ...;
DM.cds.Open;//这次调用的时候时间特别长,导致超时
...
DM.cds.Close;
DM.cds.CommandText := ...;
DM.cds.Open;
iIoneObj.ExecSQL('...');
...
SetComplete;
except
SetAbort;
raise;
end;
finally
iIoneObj := nil;
iItwoObj := nil;
end;那位帮帮忙,很急啊
我认为还是组件问题。
这里假设组件执行的是写操作(读操作一般不会碰到该问题),且是本机执行(如果组件执行在其他机器则一定要确保midas.dll在system32目录下),组件在Delphi中的属性不要设为调试状态,卸载并删除原组件dll,重新编译,安装,问题就会没有了。
有问题再贴出来。
还有如果是组件之间调用的话也可能会出现这种问题,可以在第一个组件,即根事务创建者设置调试,同时打开其它组件相关单元,即可自动调试到其他组件中去。
我按你说的,取消了调试状态,把组件连同组件包一起删除了,并把服务器\客户端的所有编译生成文件删除,然后重新编译、安装,此时系统不报原来的错了,改为报:“超时已过期”,请指教
对了,我把我的环境说一下,两台机器,一台临时数据库服务器(同事的)(SQL Server/XP),我的(Win2000)作中间层服务器,客户端也在我机器上运行
执行SQL最好用adoquery,然后将数据集赋给cds,让cds彻底与数据库断开连接
看了你的代码,如果iIoneObj不能一次调用就释放的话,试试我改的:
try
try
DM.cds.Close;
DM.cds.CommandText := ...;
DM.cds.Open;
...
OleCheck(ObjectContext.CreateInstance(Class_oneObj, IoneObj, iIoneObj));
iIoneObj.ExecSQL('...');
...
iIoneObj.ExecSQL('...'); if iIoneObj <> nil then iIoneObj := nil;//我加的
...
DM.cds.Close;
DM.cds.CommandText := ...;
DM.cds.Open;//这次调用的时候时间特别长,导致超时
...
DM.cds.Close;
DM.cds.CommandText := ...;
DM.cds.Open; OleCheck(ObjectContext.CreateInstance(Class_oneObj, IoneObj, iIoneObj));//我加的 iIoneObj.ExecSQL('...');
if iIoneObj <> nil then iIoneObj := nil;//我加的 ...
SetComplete;
except
SetAbort;
raise;
end;
finally
iIoneObj := nil;
iItwoObj := nil;
end;
=======
从描述上看很可能就是连接数据库失败的原因,ConnectionTimeout改小,就无法及时连接数据库,导致“超时已过期”;而改的足够大,数据库是能连上了,但分布式事务却已经被结束,此时出现另一个错误,就是“分步式事务已完成,请将此会话登记到新事务或NULL事务中”
敢问楼上几位都是在搞d/com+编程吗?现在这种搭配行情如何?我准备走人喽,不过得等到明年,答应老板的