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语句,肯定被搞死了,,

解决方案 »

  1.   

    可否尝试在触发器中作相关的更新。
    这样你在ClientDataSet只更新一个表的数据即可。
    不过触发器不宜写太多,多了就乱,不好管理。
    在一个文件中写好触发器,每次整体更新。
      

  2.   

    补充最新实验的结果,例:
    查询结果为
    号码 内容
    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更新为C2、操作
    意愿结果
    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的原理了,,同时跪求这方面的专家指导指导,欢迎有意学习这个问题的朋友与我共同探讨。
      

  3.   

    9楼的朋友说的第一句是对的,当查询结果只有一条时,是不会发生上述8楼提到的结果1、2的。不过,第二句话我不懂,我的联合查询除了连接字段外,没有其他字段会重复的呀,控件怎么会不知道更新哪一个表中的数据呢,clientdataset不是号称做多表查询更新的核心控件吗,,
    根据我在8楼中所做的实验,clientdataset倒不是不知道更新哪个表的哪个字段,而是不知道具体更新的哪一行(记录)。另外,联合查询更新我也不想啊,可是这是我不得不做的。。这个数据库应用项目的核心就是“关联”能力
      

  4.   


    请问楼主怎么做的,我是一点也不会,每次要写好多sql语句,求指教