mts事务问题(100分)

  • 主题发起人 主题发起人 ls2000
  • 开始时间 开始时间
L

ls2000

Unregistered / Unconfirmed
GUEST, unregistred user!
是否一个组件所有的方法都受事务保护,如mtswork为需要事务
客户端
try
olecheck(objectcontext.createinstance(class_mtswork,IID_imtswork,mtswork));
mtswork.updatedat1(vdat1);//用户自定义更新数据过程
(mtswork as Iappserver).as_applyupdates('dspwork',vdat1,0,iErrorcount,Ownerdata);
//调用midas的datasetprovider的功能,系统自带
setcomplete;
except
setabort;
end;
这样AS_applyupdates是否也受与updatedat1同一事务保护?

在win2000server下怎么查看、监视事务的运行,即我怎么知道他们是一个事务中运行呢?
怎么调试com+?
 
怎么调试,请看这个贴,我答过,如还有什么不清楚,可以再贴上来问.
http://www.delphibbs.com/delphibbs/dispq.asp?lid=606149
怎样看哪一个事务在运行,你只需要控制台->系统管理工具->元件服务中找到你的COM+服务,
看其中的元件那一项,然后在右边的元件视图中的视图检视改为检视状态,就可以看到元件当
前状态了,包括物件,启动,聚集,呼叫中等等...
 
a////程序

1、pmtsdemo.dpr (pmsdemo.dll) 需要事务
数据模块mtsdemos有一个cnado:Tadoconnetion; ador:Tadodataset;
dspstud:Tdatasetprovider;
加入用户函数、过程:
function Tmtsdemos.Get_GetInfo(const st:string):olevariant;
begin //查询数据
try
cnado.connected:=true;
ador.commandtext:=st;
ador.open;
result:=dspstud.data;
ador.close;
setcomplete;
except
setabort;
end;
cnado.close;
end;

procedure tmtsdemos.applyrec(var vdata:olevariant;out succ:integer);
begin //更新数据
try
cnado.open;
dspstud.applypdates(vdata,0,succ);
setcomplete;
except
setabort;
end;
cnado.close;
end;

2、客户端pclient.exe uses pmtsdemo_tlb.pas
加入cds:Tclintdataset;并声明ms:Imtsdemos;
窗体建立时 ms:=coMtsdemos.create;
destroy时 ms:=nil;
procedure Tform1.get_infoclick(sender:tobject);
var vdata:olevariant;
begin //查询
vdata:=ms.get_getInfo(editsql.text);
cds.data:=vdata;
cds.open;
end;

procedure Tform1.pdateR(sender:Tobject);
var
vdata:olevariant;
succ:integer;
begin //更新
vdata:=cds.delta;
ms.updateRec(vdata,succ);
end;

b///安装到mtsdemo package中,打开组件服务发现mtsdemo包中只有一个组件
pmtsdemo.mtsdemos

c///运行客户端pclient.exe,删除、查询、更新正常。

d///观察事物运行状态
组件服务--计算机--我的电脑--com+应用服务--mtsdemo--组件--右击--
查看--属性查看:
有:prog标志:pmtsdemo.mtsdemos 事物:必需,
安全:是 同步:必须
clsid:{22ba335f-5ab3-41c1-84dc-22b02f7c66b9}
运行客户端没有见事务状态?
如果按“状态查看” 有 :prog标志,已激活, 池化, 调用中, 调用时间
运行客户端pclient开始建立mtsdemos时,已激活为1,其他为0
执行客户端“取数据”,调用时间为180,其他为0,等一会儿,全部是0;
执行客户端“更新”,调用时间为60,其他为0,等一会儿全部为0。
在外部到底怎么查看事务状态???
(程序中可用objectcontext.isintransaction)。

e///调试
mtsdemo属性 应用程序id: {334f3d3-4fe4-49ce-bfc1-f788c7912b99}
调试路径:d:/delphi5/bin/borbg50.exe dllhost.exe /processid:{334f3d3....}
delphi5 ide中设置也是/processid:{334f3d3...}没有错误,
然后在umtsdata.pas中的
function Tmtsdemos.Get_GetInfo(const st:string):olevariant;
begin //查询数据
try
cnado.connected:=true; //F5设置断点,
.....
F9运行,启动客户端pclient.exe;
在windows任务管理器中发现两个dllhost.exe进程与borbg50.exe
pclient.exe,但是pclient.exe窗体没有出现,无法调试?在ide中
run--reset停止调试,停止不了,再按一个reset出现警告
Assertion failure:"(!"nrecognized interface passed to releasedbkintf!")"
in ../win32src/dbkcom.cpp at line594点击继续,出现
access violotion at address of 02134cd8,write of address 04269962
警告,按ok,再reset出现access violotion at address of 00000000,read of address 0000000
按ok,再reset一直出现access violotion at address of 00000000,read of address 0000000
也就是退不出调试状态,客户端窗体一直没有出现。只有关闭delphi5,这时
客户端出现rpc调用失败,窗体也出现了,不知为什么???
你们真的可以调试吗???(我在安装delphi5第一次启动时的系统调试我没有选择borbg50.exe)。
 
To zhangkan:
数据库sqlserver2000。 win200server简体中文 ado2.6
安装顺序:win2000server-->ado2.6-->sqlserver2000--->delphi5.0 c/s
-->delphi5 sp1--->ado sp1-->ado sp2
运行正常,也就是能正常使用(查询、修改);
就是想多学习一下调试、查看!!!
我再看了两遍 第六章,对事务了解深些;有时就是想看看别人的理解是不是与自己一样。
先结束另外一个问题,给你加上200分。但我希望你能帮我解决上面的问题。
 
我用的是ORACLE,比SQL SERVER还要麻烦一些.
>>在外部到底怎么查看事务状态???
你所说的事务状态是什么意思?如果你已经激活了该事务,那么你能看到什么已激活,什么调用
中,那就说明已经激活了.如果你要看该事务是必须交易或者支援交易,你可以看点该事务右键,
看第二栏异动,就可知道是什么了,也可以在那儿修改.

你的不能调用的问题,我想是这样,你设置了服务端的断点,但是没有RUN,你得将服务端的程序
也运行起来才行.等服务器端运行起来之后,客户端才能开始调用,客户端应用程序可以不用
在Delphi中调试,不过你要想看得清楚一些,你可以开两个Delphi,一边是服务端,一边是客户
端一起调试.的确,能够调试服务端能为我们写程序带多许多便利,另外,如果你调试DLL也跟
上面的方法差不多.
希望对你有帮助!祝你好运!
 
我建议你参考李维的ADO哪本书,你完全可以在哪里找到你要的东东。。
 
To zhangkan:
我指的事物状态是 “能看到我的组件在starttransaction或者committransaction”,
因为我看到的“已激活, 池化, 调用中, 调用时间”全都是0,我怀疑有问题???

调试的问题好象解决,我在processid/:{。。。。}前加了一个空格,能调试了,开始
我以为参数顶格写,现在在参数前留个空格没问题了,不知是不是这个原因?
但是怎么我的程序调试进入了ado、comobj等地方,能否只调试我自己的代码???

com+安装的问题:
我的机器双系统,我在win2000server(有网卡,工作组breeze)下导出安装程序只有
一个msi文件与一个cab文件,怎么没有exe文件?我导出的msi在自己的机器上(win2000)
能安装,能更新数据。在win98下(有网卡,工作组breeze)只能安装代理服务器,客户端
能运行,但数据不能更新到数据库,中间没有出现错误提示。我的mts服务器在win2000下(没启动),
win98下只是代理,怎么也能提取数据呢???只是不能更新。

我导出的msi在别的win2000server(没有midas.dll,没有网卡,没有加入域)下不能
安装,(代理与服务器两种都不行)?提示不能注册我的组件。不知什么原因?是不是
一定要有网络支持。
 
楼上老兄:
 别说你,我倒现在都不知道怎么调试,前段按照老李的办法,曾调过一些时间,可是后来,全不行了
急得我,从头生成一个ExE文件来调试,完了之后再加到COM+中,真难啊,我查了下所有以前,就是不解
还问了公司一位公认的高手,具说com搞得很好,结果才知道,原来做过ActiveX之类,最后都没讲出来如何调试
 
你的"已激活, 池化, 调用中, 调用时间"如果在元件运行时都为0,那说明你的元件有问
题,根本都没有调用这些.因为它是即时显现,即时更新的,可以清楚的看出当前哪个物件在
做什么动作.

你说的"加了一个空格",是在哪儿?在dllhost.exe后是当然应该的,如果你说processid/后那
就有点奇怪,加不加都没问题,我的例子.不过ProcessID一定要对才行.
C:/Program Files/Borland/Delphi6/Bin/bordbg60.exe dllhost.exe /ProcessID:{68A04C4D-DAFC-437A-BC19-F51C875A06A8}
调试的时候,你只在自己的程序中要查错的部分设定断点不就是只看自己的那部分了,要是你
一步一步的查看,那当然会到其它的单元去.

"只有一个msi文件与一个cab文件",cab就是win2000的打包文件,没问题呀,不需要exe档.
你汇出时不是有汇出服务器应用程序或客户端吗?你是用win98装服务端还是客户端不能更新,
我想应该是权限方面的问题,也有可能是出了错,而你的程序没有出错提示.我没有在win98下
装过应用服务器,具体原因就不清楚了.不出错误消息,应该是你程序中没有写好,更新出错没
有提示,也没有在客户端加上相应的错误解释,所以出了错你也不知道.以前我出了错也是这样,
我通过调试才知道的确出了错,但又没有反馈信息,所以你通过调试你的服务程序,就能找到
哪儿出错了,然后再加上错误解释.

第四个,我想应该要有网络支持.我之前没有试过,刚才我在别一台机器上删掉了midas.dll,就
不能安装了,而之前是可以正常安装的.你可以试一试先找个midas.dll拷贝到你win2000上去
看看,不过很奇怪,win2000就自带了COM+,怎么会没有midas.dll.

我之前也只是自己做个COM+测试来玩玩,还没有真正做过COM+应用程序.所以,也只能提供一
些自己玩过的经验给你,不足或错误之处不要见怪哟.另外,安全设置(即权限部分),你再看看
第八章<设计MTS/COM+物件和MTS/COM+应用系统>,里面讲得有.
 
To zhangkan:
1、 程序一开始建立 mtsdemo(客户的formcreate)时显示已激活为1;
我调用任何一个函数后,即setcomplete后全部归0;对象应该没有释放
掉,因为以后执行其他的函数或过程的时候“调用时间”不为0,而
是过一段时间后才归0。元件能正常工作,能查询、修改,应该没问题?

2、加空格是在ide中的run-》parameter的那个框子里,开始我是/processid:{。。。
顶格写,后来我在框子里加一个空格后再写/processid:{。。。。好象就行了?
不知是不是这个原因???

3、我在win98下装的是proxy(代理),也就是客户端,能查询,不能修改;可是我看
注册表,他定位的是我原来的dll,没有安装在c:/program files里面。我装的是
代理,那服务器应该在win2000server下,我没有启动,也能读??? 你提的建议
很好,我老是忘记给出错误提示,我经常用
try
.....
except
//
end;
可是在except中没有写任何代码,只是想跳过错误。以后要改改。
4、midas为borland的东东,不是ms的。用了midas在asp中不好用,因为返回的值
只有clientdataset能认识,要是返回_recordset,那clientdatset又不认识了。哎?!
 
算了,没人回答,结束吧
 

Similar threads

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