clientdataset的數據更新

gfong 2002-10-30 03:20:20
為什么clientdataset.delete和Post 之後ApplyUpdates(-1)不能把數據更新回後台.
...全文
289 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
gfong 2003-01-23
  • 打赏
  • 举报
回复
好久沒來,一直沒有結貼.Sorry!
謝謝參與過的朋友.提前祝大家春節快樂!!
malecjf 2002-12-06
  • 打赏
  • 举报
回复
checkbrowse
comanche 2002-12-04
  • 打赏
  • 举报
回复
to smilehh, 你的 file 中可能不存在 Delta 信息, 在 save to file 时不要 MergeChangeLog
smilelhh 2002-11-16
  • 打赏
  • 举报
回复
我也出现类似他的问题,
我是用loadfromfile()取来的数据,
结果更新远程数据不成功。
用下面这条语句却报‘更新成功了’。见鬼了
if ClientDataSet1.Applyupdate(0)=0 then showmessage('更新成功了');
comanche 2002-11-13
  • 打赏
  • 举报
回复
我不用 qq, 留msn 吧 comanche@yeah.net
xyue 2002-11-12
  • 打赏
  • 举报
回复
这个问题我也曾经遇见过
给你一个100%能解决的方法吧

服务器端的DataSetProvider(和客户端的ClientDataSet对应的)的属性
ResolvetoDataSet 改成False

就可以了
试试吧
祝你好运
gfong 2002-11-12
  • 打赏
  • 举报
回复
我的程序是用過locate之後更新不就行.如果真接打開進行操作之後更新就ok,
我想 comanche(太可怕)的建義是對的.
小弟剛學多層,願交這方面的朋友.qq:123248850.
謝謝大家的參與
shiningplus 2002-11-11
  • 打赏
  • 举报
回复
delete以后不用Post
去掉Post,OK?
smaze 2002-11-11
  • 打赏
  • 举报
回复
用adoquery就可以了
sywxy 2002-11-05
  • 打赏
  • 举报
回复
看看有什么错误消息?
afeisky 2002-11-04
  • 打赏
  • 举报
回复
写错了:)
是if ...=0 then
afeisky 2002-11-04
  • 打赏
  • 举报
回复
你不用: if (ClientDataSet1.ChangeCount>0) or (ClientDataSet1.State in [dsinsert,dsedit]) then
begin //要更新数据了
if ClientDataSet1.Applyupdate(0)>0 then showmessage('更新成功了');
end;
3yugui 2002-11-04
  • 打赏
  • 举报
回复
可以加入delphi自带的调试窗体(reconcile error dialog),在onreconcileerror事件重调用
ihihonline 2002-11-04
  • 打赏
  • 举报
回复
数据更新有四种方法,你可以根据自己的要求来写代码;
wanderung 2002-11-03
  • 打赏
  • 举报
回复
调试进去看看~!应该能查出来问题的所在
BoningSword 2002-11-03
  • 打赏
  • 举报
回复
这个原因可能很多,如果你的数据在后台是多表连接出来的,
直接保存大多不能成功。
还有,你在保存代码前面加上
if clientdataset.canmodifilly //好像就这个属性吧。
then showmessage('Can');
来判断一下能不能修改。
chenooo 2002-11-02
  • 打赏
  • 举报
回复
mark
comanche 2002-11-01
  • 打赏
  • 举报
回复
可能你没有正确设定 ProviderFlag 中的 pfInKey

你应该在服务端的 DataSet(table or query or adoXXX) 中 add all fields
然后开 fields editor 中设置每个字段的 ProviderFlag

ProviderFlag 集合有 pfInUpdate, pfInWhere, pfInKey 和 pfHidden 四个元素, 具体说明是

pfInWhere 该字段出现在 Update 和 Delete 语句中用于定位原记录
pfInKey 说明该字段是主键, 跟 pfInWhere 相同,但定为主键的字段在客户机上(ClientDataSet)的值不能重复
pfInUpdate 该字段可能出现在 Update 和 Insert 语句中的 Set 中和 Values段中
pfHidden 说明该字段不出现在 ClientDataSet 的 fields 中, 但它包括在data packet 中

只个例子

设服务器有个 Table 中有 a, b, c 三字段

pfInWhere, pfInKey 例子
a, b, c 都设为 pfInWhere
cds 中改动了 a, b, c 中任一个数值时, ApplyUpdates(-1)
MIDAS 自动生成的更新语句是
update table set a = new_value_a, (可能 b = new_value_b, c = new_value_c 看你是否改动了)
where a = old_value_a, b = old_value_b, c = old_value_c
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
只设 a 为 pfInWhere 时, 上面的 where 语句将是这样
where a = old_value_a
^^^^^^^^^^^
pfInUpdate 例子
上面的例子中如果设 b 没有 pfInUpdate 则不管在 ClientDataSet 中是否改动了 b 的值,都不会有 b = new_value_b 的语句出现,不幸的是 ClientDataSet 不能得知 b 的值没有被更新,我没有什么好的解决方法,刷新 ClientDataSet 或在服务端中 b 的 field editor 中设 readonly = true

另外一个影响语句生成的地方是 DataSetProvider 的 UpdateMode
有三个选择 upWhereAll, upWhereChanged, upWhereKeyOnly

upWhereAll  允许所有 fields editor 中指定为 pfInWhere 的字段出现在 where 语句中

upWhereChanged 只允许在 ClientDataSet 中改动过的字段并且ProviderFlag是 pfInWhere 的字段出现在 where 语句中, 注意:这时字段ProviderFlag 指定是 pfInKey 的一定会出现在 where 语句中,所以 pfInKey 的字段很重要!!

upWhereKeyOnly 只有 ProviderFlag 是 pfInKey 的才出现在 where 语句中

...

会不会话太多了点
ihihonline 2002-10-30
  • 打赏
  • 举报
回复
你可以这样试一试:
AfterUpdate事件中:
if Not VarIsEmpty(ClientDataSet1.Delta) then
ClientDataSet2.Data := ClientDataSet1.Delta
看一看或是你也可以File -> New -> Dialogs -> 出错对话框看一看;
-----------------------------------------------
不提议你用ApplyUpdates(-1)
如果您觉的您对Midas感兴趣或是很想学的更好些或者是对Midas有更深的认识,我们可以一起交流;
呵呵
www.nxrs.net/bbs
谢谢,别抛砖

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧