在MTS或三层中定位记录(80分)

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

hjandy

Unregistered / Unconfirmed
GUEST, unregistred user!
请问谁能帮手定位...
在MTS或三层客户端中将ClientDataSetSupp.FetchOndemand=False,所以ClientDataSetSupp并不能自动
显示下一个25条记录,故在ClientDataSetSupp.AfterScroll中定下如下语句:
Var
CurrNo:Integer;
begin
CurrNo:=ClientDataSetSupp.RecNo;
If (CurrNo mod 25)=0 then
//重新下栽另25条记录
begin
ClientDataSetSupp.GetNextPacket;
end;
end;
但多人使用时,则有可能不能正确取回记录,请完善上述功能以正确取回下一个25条记录
 
先记录ClientDataSetSupp的最后一行的主键值,再在服务端用该值LOCATE定位记录,
然后ClientDataSetSupp.GetNextPacket;下栽另25条记录.
 
这实际上个状态对象和无状态对象的问题
所以不能正确取回记录,是因为你把应用服务器设置成了无状态对象,
但你却把应用服务器当状态对象来使用了。
当你用GetNextPacket取数据包时,由于应用服务器是无状态对象,
它自然没有足够的状态信息取得正确的数据包。
因为多个人使用时,应用服务器的cursor位置可能频繁改变
所以,在多个客户端的情况下,要取得正确的数据包
你必须向应用服务器传递你的数据表记录的位置
具体原理大概就这样子
具体操作代码见李维 Delphi5秘籍-系统篇:)
 
此确实是状态对象和无状态对象的问题,我需要的是高效率执行无状态对象
关于上述
<<先记录ClientDataSetSupp的最后一行的主键值,再在服务端用该值LOCATE定位记录>>
若执行的表有几十万条或更多记录,那效率会是个问题
另外,关于Dingyin提到的可能是类似如下
服务端->Select top 900 Auto_id, Employee_id ... From user Where Auto_id = :id
但在MTS执行ApplyUpdate之类存贮记录时需取回之前记录,否则无法存贮
相对来讲也有一些问题
另外关于<<李维 Delphi5秘籍-系统篇或Ado/MTS>>之类书我也看过,但
除上述方法外能否提供更有效的方法
 
"在MTS执行ApplyUpdate之类存贮记录时需取回之前记录,否则无法存贮"
不好意思,可不可以解释一下
 
我现在所使用的MTS就存在这种情况,详细可在http://forum.vclxx.org/中找到(李维个人专区)
 
在...Delphi5/Demos/Midas/Pooler找例子,仔细研究把.
 
Starbzj: 关于你提及的例子是属于非ADO
问题(1)若在客户端加入 ApplyUpdate(-1) 执行存贮后, GetNextPacket显示结果会是个问题
若存贮后先执行Run Sql再按GetNextPacket,显示结果会...<--烦查结果
问题(2)因考虑将来性能问题,故我希望使用Ado,但若同时使用Pooler技术会否与微远的
MTS或Com+会有冲突 ?
注:我之前参考过一些书介绍若使用MTS或Com+都应尽量使用MTS或Com+(查询及更新记录)功能
另外,据闻BDE/IDAPI再改良机会较小
不过,总的来说还是多谢各会帮忙,希各位还会提供更多意见.
 
难道没有更好的办法
 
唔会吧! 难道没有更好的办法
 
好像MTS是无状态对象,我书上好像看过说不能正确取回数据。
我越来越觉得MTS一点也不好用,至今还不知好在哪里?
 
后退
顶部