TClientDataSet的刷新问题!!!(200分)

  • 主题发起人 主题发起人 zlshj
  • 开始时间 开始时间
这种长连后台的做法暗也不赞成
系统开销太大了
应用服务器很容易挂掉的
applyupdate自己还会创建事务
如果你还有其他的操作想一起提交就不能挂在一个事务里面了
问题多多呀
偶已经彻底抛弃了这个用法了
 
这个问题我碰过了,就是以前我公司要我做一个内部测试程序,也有取ID号的问题,而且也是多用户的情况下,我的处理办法是再加一个clientdataset用来取得目前数据库中的最大ID号(也可以写到服务器上返回最大ID号),但取这个ID号是在保存数据clientdataset的beforepost事件中取得,然后在该clientdataset的afterpost事件中写入applyupdate(0)的代码。在befordpost和afterpost的极短时间内是不会有ID冲突了。
 
刷新用clientdataset.refresh就可以。
如果新增的记录在当前的查询条件内,则不会丢失,而且定位不变。
否则。。。。。。当然会不见了。
 
将服务器的TDataSetProvider的autorefresh:=true;就可以了!
 
自增字段ID是属于数据库的机制,而clientdataset的open以后就可以与数据库无关了,
所以在clientdataset增加时是不会自动加上ID的,ApplyUpdate(0)更新语句有并不在客户端报错,所以表面上更新成功,实际没有。,刷新当然看不到新增记录。
 
如果你一定要用自动增量的话,至少在增加一条记录前需要手动从服务器取得ID给clientdataset赋值
 
楼主:试一试,也许真的能帮到你.
首先试测你的应用服务程序是否有问题.=>可能是没有保存进数据库.(在保存时,给APPLYUPDATE(-1)).试一试.这个很简单,到后端去查看就知结果.=>如保存进去了,前端查不出来的,可用SQL语句直接查询.包你能行.
 
兄弟,我建议你再建立一个对应的ID表
专门用来存储对应表中的最大的ID号,这样你增加数据之前调用ID表加一就可以了,同时更新ID表啊!
 
建议用SQLSERVER的自动增长 作为ID
这样就不用担心 ID冲突了
 
同意墨剑的看法:
因为:ClientDataSet增加了,只是在Provider中后台增加,并没有在具体的数据库表中增加ID。用Applyupdate提交时,数据表不认你在Provider中添加的ID,当然就不能保存进去了。你要想能够这种直接增加的话就用两层结构。
用三层结构ID还是不要自动增加,手动或编写一个函数在NewRecord中赋值即可!
 
后退
顶部