c/s结构,在DBgrid里直接编辑更改数据后,怎么样更新数据库?是要设置什么属性还是要调用什么函数????虚心请教!!!!!!!!!!!

解决方案 »

  1.   

    to: blueshu() 老大,麻烦你看了就说清楚一点了,那是个什么东东?我看不懂!
      

  2.   

    看看这个就齐了....给分吧//==============================================================================
    //数据安全保存******************************************************************
    //==============================================================================
    function Data_SafeSave(DataSet: TDataSet; WinControl: TWinControl): Boolean;
    begin
      Result := false;
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //TDBDataSet是TQuery,TTable,TStoredProc的直接父类(两层结构)*******************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      if (DataSet is TDBDataSet) then
      begin
        if (DataSet as TDBDataSet).Database.InTransaction then (DataSet as TDBDataSet).Database.Rollback;
        (DataSet as TDBDataSet).Database.StartTransaction;//开始提交一个事务
        try
          (DataSet as TDBDataSet).ApplyUpdates;//把缓存中未决的记录写到数据集中
          (DataSet as TDBDataSet).Database.Commit;//把调用StartTransaction以来所有的数据变化都反映到服务器上,与Query_Main.Database.Rollback相反
          Result := true;
        except
          (DataSet as TDBDataSet).CancelUpdates;
          (DataSet as TDBDataSet).Database.Rollback;//把调用StartTransaction以来所有的数据变化都取消,与Query_Main.Database.Commit相反
          if WinControl<>nil then WinControl.SetFocus;
          Result := false;
          Abort;
        end;
        (DataSet as TDBDataSet).CommitUpdates;
      end
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //TClientDataSet远程更新(三层结构)********************************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      else if (DataSet is TClientDataSet) then
      begin
        if (DataSet as TClientDataSet).ApplyUpdates(0)=0 then
        begin
          Result := true;
        end else
        begin
          if WinControl<>nil then WinControl.SetFocus;
          Result := false;
          Abort;
        end;
      end;
    end;
      

  3.   

    可我用的是Adoquery控件做的cs机构的。用dbgrid显示的是查询后的数据。只有几个col可以编辑,可是编辑完了,
    数据库不更新。为什么??
      

  4.   

    大兄弟我不知你怎设的啊
    如果一切都是缺省的话post就可以了
      

  5.   

    在下告诉你,在dbgrid的onchange里面(或者别的事件,你觉得能发现你更改数据的)写adoquery.refresh即可
    这样数据库里面就可跟着变乐
      

  6.   

    想顺便请问一个问题:在三层结构模式下,客户端有一个Dbgrid用来显示数据集里的数据记录
    如果在Dbgrid中用
    ClientDataSet1.delete 删除客户端数据集中的某条记录
    请问如何更新保存到服务器上的数据库
    我用ClientDataSet1.ApplyUpdates(0);
    结果每次都无法保存(每次重新搜索,结果删除的数据还在)
    请问是什么原因?
      

  7.   

    我的意思是直接在DBgrid控件里面改,不通过按钮或其他事件,就是本身的一个可编辑属性。可是改完之后在dbgrid里面的值是变了,但是在数据库里没有变。各位老大,认真理解一下我的意思再回答了。
      

  8.   

    这有什么说不清楚的:
    我通过一个查询按钮,将查询后的机构显示在dbgrid控件中,后来发现有一个字段错误,就直接在dbgrid控件种更改了,没有通过任何按钮或任何事件。更改完之后,发现数据库中的不更新。各位老大,不知道我这样讲,大家明不明白??
      

  9.   

    一般来讲,如果你没有启动事务,而且数据集可编辑,那么在你修改了DBGrid里面显示的数据,在焦点移出该单元格/或者敲了回车的时候,数据会被更新到数据集,这个时候,数据集状态是编辑状态;如果焦点移出了该行(对应就是到了数据集的另外一个记录)在这个时候,数据集会自动进行Post操作。也就是修改数据库了。当然,如果你启动了事务那么数据库数据的修改在Commit以后才真正实现。
      

  10.   

    但是好像我查询的时候是没有启动事务处理的,而且直接在dbgrid控件修改的时候也不可能启用什么事务处理了?请问有没有什么解决方法??
      

  11.   

    我知道ADOTABLE关联的DBGRID里,改了后焦点移出该行就自动保存到数据库不知道用ADOQUERY查出来的数据所关联的DBGRID里,能不能自动保存的
      

  12.   

    按照 :  hntjc   的说法是此题无解还是大家不够积极?真是郁闷!请斑竹帮帮忙了!!!!!!
      

  13.   

    adoquery1.active:=false;
    adoquery1.active:=true;
      

  14.   

    wwx213,hudawq(强强)
    两位大侠,你们有没有认真看上面的讨论呀?
    我觉得如果看了的话,也许就不会写这样的答案了.请看清楚条件.
      

  15.   

    各位老兄,他DBFGrid中显示的是查询的结果,就好比主从表在的从表信息显示在DBGrid中一样,这样当然是不能修改底层数据库的。解决方法是建一个空表(是数据表不是table)通过Table和DBGrid联系起来,把查询出来的结果添加在空表中,也起到显示的作用,对他进行修改,在提交时把和他相关的原表中的信息替换掉,这样底层的数据库就得到了更新。OK!!!!!!!
      

  16.   

    回:yuhouyangguang(雨后阳光)你这种方法倒是可行,可是我觉得这种方法好像太复杂了,请教大家,还有没有什么更好的方法,比如说不要设置什么空表这类的,而是直接设置我用的那些控件,该表一下属性或是什么样的,能够做到更新数据库?我用到的控件是:adoconnection,adoquery,datesource,dbgrid做的是c/s机构的。
      

  17.   

    if adoquery1.Active then
      begin
        adoquery1.Edit;
        adoquery1.Post;
      end;
      

  18.   

    另外查询一下你的sql语句,直接在服务器端执行一下,看是否语句出错了。
      

  19.   

    回:天下我知道焦点一离开字段,数据库就会自动提交,可是我在dbgrid控件中修改的数据是可以,但是焦点离开了,数据库还是不更新,更不要说是最后一个不提交了。
    还有,我的sql语句是没有问题的。
      

  20.   

    一般来说,DBGrid会将修改的结果保存到数据库中,但我看你描述的问题好象使用的是缓存更新;在DBGrid中修改的话,要确保DBGrid的焦点已经离开了当前编辑行,另外在TADO控件的AfterPost事件中要加上Query.UpdateBatch;
    我的程序全是这样做的,没有任何问题!