一个经典问题:李维《dcom/mts/com+》第九章数据更新,令人头疼!!(200分)

  • 主题发起人 主题发起人 hike
  • 开始时间 开始时间
H

hike

Unregistered / Unconfirmed
GUEST, unregistred user!
我调试了第9章的例子,发现只能查询,不能更新。
通过跟踪调试发现,更新的数据包无法正确上传,下面结合代码介绍一下,
数据包经过三个步骤上传,在第三步出现错误:
//第一步,客户端更新按钮代码发出更新指令,上传更新数据包
procedure TForm7.btnPubApplyClick(Sender: TObject);
var
uCoor : ImtsUpdateCoorObj;
vDatas : OleVariant;
iErrorCount : Longint;
begin
uCoor := ComtsUpdateCoorObj.CreateRemote('192.168.4.200');
uCoor.UpdatePublishers(cdsPublishers.Delta, 0, iErrorCount);//更新指令
end;
//第二步,负责更新的协调对象组件的代码,接受数据包cdsPublishers.Delta:
procedure TmtsUpdateCoorObj.UpdatePublishers(vDatas: OleVariant;
iMaxError: Integer;
var iErrorCount: Integer);
begin
try
FMyDM.dcomcPublishers.AppServer.UpdateDatas(vDatas, iMaxError, iErrorCount);
SetComplete;
except
SetAbort;
end;
end;

//第三步,最靠近数据库的COM+组件的代码,
procedure TmtsPublishers.UpdateDatas(vDatas: OleVariant;
iMaxErrors: Integer;
var iErrorCount: Integer);
begin
try
dspPublishers.ApplyUpdates(vDatas, iMaxErrors, iErrorCount);//执行出错,但是没有任何提示
SetComplete;
except
SetAbort;
end;
end;
通过跟踪发现:无法通过下面的调用:
procedure TUpdateTree.InitDelta(const ADelta: OleVariant);
begin
if FDeltaDS.Active then
Clear;
FDeltaDS.Data := ADelta;//这一步无法通过!说明什么?难道数据包不对吗?
InitDelta(FDeltaDS);
end;

但是第三步如果代码修改成这样,整个问题解决了:
procedure TmtsPublishers.UpdateDatas(vDatas: OleVariant;
iMaxErrors: Integer;
var iErrorCount: Integer);
var
ServerObj:IAppServer;
OwnerData:OleVariant;
MyAppServer : ITDMOpublishers;
begin
try
ServerObj := FMyDM.dcomcPublishers.GetServer;
ServerObj.AS_ApplyUpdates('dspPublishers', vDatas, iMaxError,iErrorCount, OwnerData);
SetComplete;
except
SetAbort;
end;
end;
这种方法也是李维提出来的.但是我觉得有一个问题,这不能充分利用不同组件之间的两阶段提交带来的好处,所以仍然需要采用原来的方法.
通过对这种方法的跟踪发现,下面的调用成功通过:
procedure TUpdateTree.InitDelta(const ADelta: OleVariant);
begin
if FDeltaDS.Active then
Clear;
FDeltaDS.Data := ADelta;//成功法通过!
InitDelta(FDeltaDS);
end;

怎样才能采用原来的方法,顺利完成数据更新呢?
====================
我现在是在一台电脑里面做试验,所以没有导出的问题.
操作系统分别试用过win2000server+SP3和winXP professional+SP1
开发工具分别试用过delphi6+upd2,和delphi7
数据库采用sqlserver7
系统重新作过数次
各种连接都作过组合试验
代码跟踪到系统内部,找到了问题结症所在....:
procedure TUpdateTree.InitDelta(const ADelta: OleVariant);
begin
if FDeltaDS.Active then
Clear;
FDeltaDS.Data := ADelta;//这一步只有后来的方法才能通过!说明什么?
InitDelta(FDeltaDS);
end;
似乎该做的都作了,下一步我该怎么做,才能顺利调试成功原来的更新方法??
 
我的全部代码放在下面的地址里面,请帮我看看好吗?
ftp://bbs.netbuddy.org/uploads/TestForme.exe
 
InitDelta(const ADelta: OleVariant);
这个函数起什么作用?
 
这个函数是我跟踪调试的时候碰到的一个系统函数,从字面上来看,应当是初始化的意思。
通过搜索也不难发现这个函数在哪个文件中。 谢谢您的关注,请帮忙解决好吗?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
469
import
I
后退
顶部