服务器端代码如下,客户端调用GetData取得数据,调用GetNextData取得下一笔数据,第一次调用没问题,但过一段时间后,再次调用这两个方法时都会出错,报告“分布式事务已完成。请将此会话登记到新事务或null事务中。”服务器端mts DataModulefunction TrdmPhysic.GetData(const Condition: WideString): OleVariant;
var
SqlStr: string;
begin
if Condition <> '' then
SqlStr := 'SELECT TOP ' + IntToStr(PacketRecords) + ' * FROM Physic WHERE '
+ Condition + ' ORDER BY PhyCode'
else
SqlStr :=
'SELECT * FROM Physic WHERE PhyCode>(SELECT MAX(PhyCode) FROM Physic)';
try
if adsPhysic.Active then
adsPhysic.Active := False;
adsPhysic.CommandText := SqlStr;
adsPhysic.Active := True;
Result := dspPhysic.Data;
except
RaiseDataSetOpenErr(SqlStr);
Result := VarNull;
end;
end;function TrdmPhysic.GetNextData(const Condition: WideString;
KeyValue: OleVariant): OleVariant;
var
SqlStr: string;
begin
if Condition <> '' then
SqlStr := 'SELECT TOP ' + IntToStr(PacketRecords) + ' * FROM Physic WHERE '
+ Condition + ' AND PhyCode>' + KeyValue
else
SqlStr := 'SELECT TOP ' + IntToStr(PacketRecords) + ' * FROM Physic WHERE '
+ 'PhyCode>' + KeyValue;
try
if adsPhysic.Active then
adsPhysic.Active := False;
adsPhysic.CommandText := SqlStr;
adsPhysic.Active := True;
Result := dspPhysic.Data;
except
//RaiseDataSetOpenErr(SqlStr);//引发异常,返回sql语句
raise;//一段时间后报“分布式事务已完成。请将此会话登记到新事务或null事务中。”
Result := VarNull;
end;
end;procedure TrdmPhysic.MtsDataModuleCreate(Sender: TObject);
begin
// acPHYMIS.Connected := True;加不加这句代码都一样
end;procedure TrdmPhysic.MtsDataModuleDestroy(Sender: TObject);
begin
// acPHYMIS.Connected := False;加不加都一样
end;procedure TrdmPhysic.acPHYMISBeforeConnect(Sender: TObject);
begin
acPHYMIS.ConnectionString := GetADOConnectionString;//取得连接字符串的设置
end;initialization
TComponentFactory.Create(ComServer, TrdmPhysic,
Class_rdmPhysic, ciMultiInstance, tmApartment);
end.为什么会这样,神哪,救救我吧!
var
SqlStr: string;
begin
if Condition <> '' then
SqlStr := 'SELECT TOP ' + IntToStr(PacketRecords) + ' * FROM Physic WHERE '
+ Condition + ' ORDER BY PhyCode'
else
SqlStr :=
'SELECT * FROM Physic WHERE PhyCode>(SELECT MAX(PhyCode) FROM Physic)';
try
if adsPhysic.Active then
adsPhysic.Active := False;
adsPhysic.CommandText := SqlStr;
adsPhysic.Active := True;
Result := dspPhysic.Data;
except
RaiseDataSetOpenErr(SqlStr);
Result := VarNull;
end;
end;function TrdmPhysic.GetNextData(const Condition: WideString;
KeyValue: OleVariant): OleVariant;
var
SqlStr: string;
begin
if Condition <> '' then
SqlStr := 'SELECT TOP ' + IntToStr(PacketRecords) + ' * FROM Physic WHERE '
+ Condition + ' AND PhyCode>' + KeyValue
else
SqlStr := 'SELECT TOP ' + IntToStr(PacketRecords) + ' * FROM Physic WHERE '
+ 'PhyCode>' + KeyValue;
try
if adsPhysic.Active then
adsPhysic.Active := False;
adsPhysic.CommandText := SqlStr;
adsPhysic.Active := True;
Result := dspPhysic.Data;
except
//RaiseDataSetOpenErr(SqlStr);//引发异常,返回sql语句
raise;//一段时间后报“分布式事务已完成。请将此会话登记到新事务或null事务中。”
Result := VarNull;
end;
end;procedure TrdmPhysic.MtsDataModuleCreate(Sender: TObject);
begin
// acPHYMIS.Connected := True;加不加这句代码都一样
end;procedure TrdmPhysic.MtsDataModuleDestroy(Sender: TObject);
begin
// acPHYMIS.Connected := False;加不加都一样
end;procedure TrdmPhysic.acPHYMISBeforeConnect(Sender: TObject);
begin
acPHYMIS.ConnectionString := GetADOConnectionString;//取得连接字符串的设置
end;initialization
TComponentFactory.Create(ComServer, TrdmPhysic,
Class_rdmPhysic, ciMultiInstance, tmApartment);
end.为什么会这样,神哪,救救我吧!
setComplute或者Setabort
你可以将查询放在一个组件里,设置为支持事务,可是如果别的需要事务的组件调用了这个组件,会传一个事务Context(好像这么叫)进来,同样需要setComplute或者Setabort,所以还是都写上为好。
李维先生不是给我们建议了吗?笑天
说说你的架构啊
begin
// acPHYMIS.Connected := True;加不加这句代码都一样
end;procedure TrdmPhysic.MtsDataModuleDestroy(Sender: TObject);
begin
// acPHYMIS.Connected := False;加不加都一样
end;
/////////////////////////////////////////////不一样!!!!!!
你应该将acPHYMIS.Connected 属性在onactive中激活,在ondeactive中关闭
个人意见
在类型库编辑器中,新增一个参数,假同名称为sErrorInfo,类型为选择BSTR,然后自己在BSTR后面加上一个“*“号,然后双击和该参数同一行的最后一列,勾上”Out“