ClientDataSet的Bug?!高手指点(100分)

  • 主题发起人 主题发起人 woshixiaoxin
  • 开始时间 开始时间
W

woshixiaoxin

Unregistered / Unconfirmed
GUEST, unregistred user!
小程序是三层架构,后端DataModule从数据库取10条记录,前端程序在GetNextPacket控制当ClientDataSet数据到10条的时候,就清空前端记录.
A.当ClientDataSet的PacketRecords=2,5等是10的因子的时候,系统正常.
B.当ClientDataSet的PacketRecords=3,7等不是10的因子的时候,系统会循环查询.比如说PacketRecords=34.
在ClientDataSet向后端取数据,前端取三笔,后端会指向第四笔,所以当前端指向第九笔,后端此时指向了第十笔.这是如果再取NextPacket,前端数据取到最后一笔,后端的数据此时已经清空了,此时前端数据还没有清空.两者并没有保持一致.
procedure TForm2.btnGetNextPacket(Sender: TObject);
begin
with cdsTestdo
begin
if not EOF then
Last
else
begin
if RecordCount >= 10 then
begin
EmptyDataSet;
TCDSCracker(cdsTest).ProviderEOF := False;
end;

GetNextPacket;
end;
end;
end;
QQ:16345907技术讨论
 
不知道楼主这样做是什么意思?前端清空和后端清空做什么????
前端EmptyDataSet后有没有MergeChangeLog????
 
可以带参数请求,直接请求指定n-m之间的记录,不久行了
更灵活,更可靠
 
当然在几笔数据对系统没有什么影响,怎么设计都可以了,
要实现的是:可能会从后端取10000笔数据,当后端向前端传递1000就应该删除这1000笔,也就是保证前端数据笔数不能超过1000笔,这个小程序是作测试用
前端取第一个三笔资料,后端指向了第四笔,
前端取第二个三笔资料,后端指向了第七笔,
前端取第三个三笔资料,后端指向了第十笔,
我不明白就是在前端取最后一笔,此时后端数据在后端的窗体上显示为清空了?
前端清空了,
然后再取资料,又从第一个三笔开始了,看起来好晕:)
不知是否明白?
 
越来越不明了
 
帮顶一下..
我是用客户端调用协调COM+,再由协调COM+调用逻辑COM+.
我在
逻辑COM+上放置了TADOConnection,TADOQuery,TDataSetProvider;
协调COM+上放置了TSocketConnection,TClientDataSet;
在协调COM+上用连接TSocketConnection逻辑COM+,取得数据.
我用客户端如何连接协调COM+,并取得数据.
如果解决问题,我另开论题,论功行赏.谢谢!!!
 
你这种取数据方法好象有点问题!因为需要在应用服务器维持客户端的状态!那应用服务器不是无状态服务器了!
可参考
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1099676
txmaster的Getdatas方法.
把这个函数放在aferscroll中,然后:
到尾:if clientdataset1.eof then
begin
clientdataset1.close;
Getdatas
end
 
对胡萝卜,
你的架构设计还是不错,整体思路清晰,应该说这才是真正的多层应用系统.
客户端
协调COM+
逻辑COM+
数据库
后三者的联系就不多说了,客户端和协调COM+的调用
前端要Create协调对象,两者通过定义方法来做就可以了,
以下例子引用李维的书(如果学习多层,他的书不可不看)
在协调对象中定义方法:
procedure TmtsDemoQueryCoor.GetBooks(vDatas:OleVariant);
begin
try
CdsBooks.active := True;//调用逻辑对象,在协调对象获得数据
vDatas:= CdsBooks.Data;//协调对象的ClientDataSet
...
except
...
end
end;

在客户端定义方法
procedure TForm1.BtnBooksClick(sender:TObject);
var
qCoor:ImtsDemoQueryCoor;
begin
qCoor:= ComtsDemoQueryCoor.CreateRemote('Gordon');
qCoor.Getbooks(vDatas);
cdsBook.data:= vDatas;//客户端的ClientDataSet
end;
 
问题原因找到了关键在这一句
TCDSCracker(cdsTest).ProviderEOF := False;
 

Similar threads

后退
顶部