在sql数据库系统中,采用 Adoset.Edit;然后ADOSet.Post的方法来修改数据方便快捷,但是确不能修改两个以上表组成的视图或组合式查询。然而采用直接执行SQL指令的话,在进行了修改、添加、删除后并不能直接反映在DBGrid或其他数据库感知组件上。必须重新select才行,而重新select的话DBGrid中的游标会返回到第一行(而不是刚才修改的那一行,或新增加的那一行,或删除后的那一行),这样的话,用户操作起来很不方便。大家来探讨一下,如何才能解决这个问题。

解决方案 »

  1.   

    那么用一个导航条的控件不可以吗?或者你就在重新select之前把光标的位置记下来
      

  2.   

    TO:g58521547(我是菜鸟):
       记录下来再重新locate吗,好像这样效率不是很好吧,另外如果是insert新增的咋办呢。我的主键是自增的,插入完成前是得不到ID的。
      

  3.   

    我试过是可以用post来修改query对几个表的联合select的,是可以更改这些表的。不知道你的为什么不可以。关于第二点,用sql修改表后,必须重新刷新才能反映到dbgrid中来的。
    如果你想看见你刚刚添加或者修改的那条记录,就在select 语句中作标识,即在select 中通过where 来赛选出你添加过的或者修改过的纪录显示在dbgrid上,
    这样就一目了然知道你上一次操作添加了那些纪录,修改了那些纪录了。
      

  4.   

    所以我不用ADO,如果是BDE,用UpdateSQL1,可以解决联接查询更新的问题.如果你用ODAC,SDAC专用的控件,根本不用考虑这个问题了,里面有专门的updatesql属性.
      

  5.   

    我都是用批量更新做的,从来都是UpdateBatch()的,这样是可以得到更新的行值的(如果没有触发器的影响),我没用过POST。
      

  6.   

    To:lovendII(戒情人) 你试过的是union吧,我说的是join
    另外To:must0001(飞鸟):UpdateBatch是解决批量更新,那如果更新了某条数据,DBGrid中不还是要刷新才能得到吗,而且不也是游标不是也回到第一条了吗
      

  7.   

    采用ADO可以修改多表查询,但这是有条件的,ADO自动判定能否修改,但不是所有查询结果都可以修改。
    一般要求多表查询的select语句中至少要包含每个表的主键。
      

  8.   

    我的想法跟lovendII(戒情人)的类似,
    先做好标记再定位
      

  9.   

    用书签解决定位问题 :)
    var
    SavePlace: TBook ;
    ...
    保存当前位置
    SavePlace:=DBGrid1.dataset.GetBook;
    修改刷新数据
    .....
    恢复位置
    if DBGrid1.dataset.BookValid(SavePlace) then
               DBGrid1.dataset.GotoBook(SavePlace);
    DBGrid1.Dataset.FreeBook(SavePlace);
      

  10.   

    同意 用书签  :)
    var
    SavePlace: TBook ;
    ...
    保存当前位置
    SavePlace:=DBGrid1.dataset.GetBook;post;DBGrid1.dataset.GotoBook(SavePlace);
      

  11.   

    我也是用ado,遇到楼主说的问题,我也是用书签了