关于delphi的clientdataset多表更新问题

huozhang1014 2012-02-08 03:29:28
delphi初学者又来提问了。。希望各位达人不吝赐教啊,,

由于需要,本人Delphi程序中需要大量使用多表查询,且这些查询经常使用"left outer join".“”“right outer join”模式连接,即查询结果包含A表的全部与B表的相关记录,而在工作过程中又需要对这些多表查询结果进行即时更新,

本人使用ado+datasetprovider+clientdataset控件,但时常碰到奇怪问题,如下

问题:在对查询结果进行修改并执行更新clientdataset.applyupdates(0)时,经常发生两种错误
1、无任何效果
即执行未报错,但没有完成更新
2、更新错位
本打算更新A行,结果却传递到了B行,例如本来将A行a1字段内容‘xxx’修改为'xxx123',结果B行a1字段内容'yyy'变成了'yyy123'。

在网上查了很久,看了很多关于clientdataset的文章,不得头绪,急切求助啊。

补充:
1:别提什么使用sql命令更新啥的了,我的表格经常需要好几个表联合查询,要是一个个都用Sql语句,肯定被搞死了,,
...全文
721 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wqbwqb 2013-11-03
  • 打赏
  • 举报
回复
李维的书上有例子!
yc_chongchong 2012-12-12
  • 打赏
  • 举报
回复
引用 楼主 huozhang1014 的回复:
delphi初学者又来提问了。。希望各位达人不吝赐教啊,, 由于需要,本人Delphi程序中需要大量使用多表查询,且这些查询经常使用"left outer join".“”“right outer join”模式连接,即查询结果包含A表的全部与B表的相关记录,而在工作过程中又需要对这些多表查询结果进行即时更新, 本人使用ado+datasetprovider+clientdataset……
请问楼主怎么做的,我是一点也不会,每次要写好多sql语句,求指教
huozhang1014 2012-02-09
  • 打赏
  • 举报
回复
9楼的朋友说的第一句是对的,当查询结果只有一条时,是不会发生上述8楼提到的结果1、2的。

不过,第二句话我不懂,我的联合查询除了连接字段外,没有其他字段会重复的呀,控件怎么会不知道更新哪一个表中的数据呢,clientdataset不是号称做多表查询更新的核心控件吗,,
根据我在8楼中所做的实验,clientdataset倒不是不知道更新哪个表的哪个字段,而是不知道具体更新的哪一行(记录)。

另外,联合查询更新我也不想啊,可是这是我不得不做的。。这个数据库应用项目的核心就是“关联”能力。。。
kaikai_kk 2012-02-08
  • 打赏
  • 举报
回复
多表查询后,虽然可以更新,但都是要求唯一的记录
要是几个表都有符合记录的话,是不成功的,D并不知道你要更新那一个表中的数据啊

联合查询后,就像是一个视图,只做显示用,最好别做更新动作!!!!
huozhang1014 2012-02-08
  • 打赏
  • 举报
回复
再接上,上述三个结果中,第三个操作结论是错误的,当时实验是因为设定了“内容”字段不为空。
huozhang1014 2012-02-08
  • 打赏
  • 举报
回复
补充最新实验的结果,

例:
查询结果为
号码 内容
1 A
2 B
3 B
4 D

以下按意愿结果与实际结果分别对数据进行操作,来研究问题出在哪里
1.操作:
意愿结果
1 A
2 B
3 C
4 D
实际结果
1 A
2 C
3 B
4 D
猜测:clientdataset.applyupdate只知道要B更新为C,无法定位哪一行,因此,会选择查询结果中第一个B更新为C

2、操作
意愿结果
1 A
2 E
3 B
4 D
实际结果
1 A
2 E
3 B
4 D
结论:进一步证实1操作中的结论
3、操作
意愿结果
1 空
2 B
3 B
4 D
实际结果
1 A
2 B
3 B
4 D
结论:clientdataset.applyupdate不能将非空值更新为空值(包括null)

暂时先这么多,看来我必须得好好的研究一下clientdataset的原理了,,同时跪求这方面的专家指导指导,欢迎有意学习这个问题的朋友与我共同探讨。
我看见佛 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lizheng9564 的回复:]
你可以试着使用视图来处理看看
[/Quote]

更新时指定表名就好了,视图好像也不行吧
我看见佛 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 babydog01 的回复:]
几个表的联合查询是不能修改的。
[/Quote]

选择其中一个主要要修改的表做为修改,其它表的都不要在此进行修改
lizheng9564 2012-02-08
  • 打赏
  • 举报
回复
你可以试着使用视图来处理看看
huozhang1014 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 babydog01 的回复:]

几个表的联合查询是不能修改的。
[/Quote]

这个肯定是可以的,,我已经实现过了。我所遇到的情况是有时候不能正常实现,,很是头疼啊。。

另外,二楼的兄弟,触发器我不是很懂,你是说当在数据框更新时触发事件吗,,,,这个有点难,我的表格动辄四五个表联合查询,十几个字段,,写触发器写得手抽筋啊,,
lzg827 2012-02-08
  • 打赏
  • 举报
回复
可否尝试在触发器中作相关的更新。
这样你在ClientDataSet只更新一个表的数据即可。
不过触发器不宜写太多,多了就乱,不好管理。
在一个文件中写好触发器,每次整体更新。
babydog01 2012-02-08
  • 打赏
  • 举报
回复
几个表的联合查询是不能修改的。

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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