一个关于数据库多表查询及更新的问题,为了说清楚,我用 Access 做了个小例子: 数据库中有三个表和一个查询。    三个表是:“教师表”、“课程表”、“教师所带课程表”。 “教师表”有“教师编号”、“教师姓名”两个字段;“课程表”有“课程编号”、“课程名称”两个字段;“教师所带课程表”有一个“自动编号”的主键字段,以及“教师编号”、“课程编号”共三个字段。“教师表”和“课程表”是多对多的关系,通过“教师所带课程表”(这就是个连接表)来实现这个多对多关系的。    还有一个查询:“教师所带课程查询”。这个查询是用来给客户看的,让客户知道哪些老师带了哪些课。查询所对应的sql语句是:
    SELECT 教师表.*, 课程表.*
    FROM 课程表 INNER JOIN (教师表 INNER JOIN 教师所带课程表 ON 教师表.教师编号 = 教师所带课程表.教师编号) ON 课程表.课程编号 = 教师所带课程表.课程编号;    我在数据库中定义了三张表的关系,并且选择了实施参照完整性、级联更新相关字段、级联删除相关字段。    现在的问题是:比如运行了这个查询后,其中有一条记录:“编号为2的老师带了一门编号为5的课程”。如果我在查询结果中删除这个纪录,在 Access 中就只删除了“教师所带课程表”的对应纪录,这个结果是对的! 但是 我在 BCB 中用数据组件(TADOConnection、TADOTable、TDBGrid、TDBNavigator)进行这个操作时,结果竟然把“教师表”中“编号为2的老师”的纪录,以及“课程表”中“编号为5的课程”也同时给删除了!!这个显然是不对的! 这是怎么回事呀??

解决方案 »

  1.   

    ADO是这么处理的,如果要达到自己想要的效果,还是手动更新吧
      

  2.   

    To TOMWLD(笑天) :    我想也是! 能否提供更新的代码参考一下呢?
      

  3.   

    在字段编辑器中加入所有的字段,然后将来自不想更新的表中的字段的ProviderFlags属性的pfInUpdate设为False
      

  4.   

    ado支持多表更新,当你在多表联合查询进行数据修改时,可以自动更新到多表,所以你删除时会删除所有表数据。这正是先进之处,如果不象这样可以自己写sql语句进行删除。
      

  5.   

    上面提的问题已经解决了,谢谢大家的帮助!!这里还有个小问题,把它解决后马上结贴!问题如下:当我在浏览某一个记录集(数据表或者是一个查询)时,另外的程序增加或删除了同一个记录集中的一条或多条记录,在我的程序中如何反映最新的变化? 当然可以用先Close,然后再Open数据集的方法,但是我觉得这样的效率不高,有没有其他的方法呢?
      

  6.   

    好象没有什么更好的办法,如果用refresh的话好象速度更慢
      

  7.   

    我试过refresh()方法,但出现了异常!异常的描述好像是“本地行已删除”之类的话!
      

  8.   

    我也是用DataSet的Delete方法做的。我的实现方法是:for example,当我运行了“教师所带课程查询”后得到了一个记录集,其中有一条记录:“编号为2的老师带了一门编号为5的课程”。我要删除这条记录时,首先    TADOQuery *qryDelete = NULL;
        qryDelete = new TADOQuery(NULL);
        qryDelete->Connection = ADOConnnection;
        qryDelete->SQL->Add("Delete FROM 教师所带课程表 WHERE (教师编  号 = '2' AND 课程编号 = '5')");
        qryDelete->ExecSQL();    这个操作实际上是直接删除数据库中对应的纪录。然后    DataSet->Delete();    这个操作就是删除了DataSet中缓存的对应的纪录(此纪录所对应的数据库中的纪录已经在第一步中删除了),当然和DataSet相关联的Grid中显示的对应纪录也消失了。    我的这种方法,就是需要程序员来保证“数据库中的记录集”和“客户端显示的记录集”保持一致!
      

  9.   

    To TOMWLD(笑天):出现了“本地行已删除”之类的话之后,ADO组件就出现了我一开始提出的问题——它把“教师表”和“课程表”的相关纪录也删除了。这可不是我所希望的!!  :)
      

  10.   

    你可以按我说的方法去做,将不要删除的字段的pfInUpdate属性去掉
      

  11.   

    我试试看! 多谢了TOMWLD(笑天)!!  以后有问题多多帮忙!!结贴!