问题描述:
FORM上,左边用了个listbox显示一些信息(表中几个域的组合,有些逻辑的),这些信息是用其他的ADOQuery查过来的.然后有很多的DBEdit和DBCheckBox及DBCombobox来显示表中一行的信息,用ADOTable做数据源.现在我的界面像做成这样,双击listbox中的一行,ADOTable locate的那个数据的一行.这些没有问题,问题是:
当我修改DBEdit的一些信息时,然后我在点ListBox其他一行,刚才的修改就已经到数据库里去了.我需要的是想要保存的话,只能通过按一个'保存'按钮才行.查了不少资料,
1.说在AdoqueryBeforePost事件里用abort,我试验了下, <可以,但程序流程不是我想要的>
当我修改了某个DBEdit,再去点ListBox中的其他行时,因为运行了abort,界面就没反应了.
abort具体是做什么的?2.听说还可以在AdoqueryBeforePost cancleUpdate. <不行,出错>
用了下,报错,说OLEError: 不能插入空值, cancleUpdate 具体做了什么. 我怎么找不到这些函数的资料. :S.3.最后我准备用事务. <可行,但不完美>
设置了个全局Boolean变量,开始为false, 在AdoqueryBeforePost中ADOConnection1.BeginTrans;在AdoqueryBeforePost中判断那个Boolean变量,只有true(当按了'保存'按钮后把全局变量设成true)时 CommitTrans, false 时RollbackTrans . 这样就做到了只有按'保存'才提交更改, 
但是马上我发现,我改了DBEdit的数据,再去ListBox点其他的,虽然刚才的修改没到数据库,但是我再去点开始改过的在DBEdit中显示的还是我改过的. 好像ADOTabel有个缓存机制.
最后只好用
  ADOTable1.active:=false;
  ADOTable1.active:=true;
更新缓存.
打了这么多,问题应该比较清楚了, 我想要在AdoqueryBeforePost 取消修改并且我还可以继续在ListBox中点.

解决方案 »

  1.   

    支持楼主使用事务。但是,我觉得你这样做不妥,我认为应该这样:首先,设置ADOTable的LockType属性为:ltBatchOptimistic
    然后,在FormCreate中 Conn.BeginTrans
    这样,你在DBEdit中作的修改,不会立即写入数据库中,根本不需要在什么BeforePost中写代码,不用任何代码去干预。
    其实只要你的数据集的LockType为ltBatchOptimisticr的话,即使没有用事务,你在列表中双击另一行也不会把数据写入数据库中的。最后,你在要保存时,使用try...Except...End;语句结构:try
      adoTable1.UpdateBatch(arAll);
      conn.CommitTrans;
    except
      conn.RollbackTrans;
    end;
      

  2.   

    LockType设置成ltBatchOptimistic 我也查到过, 具体不清楚怎么用才没试验.
    谢谢,等会回去试试.
      

  3.   

    to :阿生你的方法我试验了下. 
    LockType设置成ltBatchOptimistic ,应该是使ADOTable不会直接提交更改,在保存按钮处再通过commit将修改提交到数据库.但是这样带来的问题和我上面方法 "3.最后我准备用事务.   <可行,但不完美> "中不清除ADOTable缓存的表现是一样的."但是马上我发现,我改了DBEdit的数据,再去ListBox点其他的,虽然刚才的修改没到数据库,但是我再去点开始改过的在DBEdit中显示的还是我改过的.   好像ADOTabel有个缓存机制." 而且这样的方法会导致很多修改同时提交,用户应该只认为按"保存"时的修改才是保存的.会引起误解.thanks any way.
      

  4.   

    干 嘛要用DBEdit..想不通。Edit不是蛮好用嘛。想什么功能都能实现!
      

  5.   

    LockType设置成ltBatchOptimistic 就是所谓的缓存更新模式有这样的需求最好就不要用数据感知组件 再去ListBox点其他的,虽然刚才的修改没到数据库,
    ------
    建议窗口在编辑模式的时候 把ListBox禁用 保存或者取消后回到流览模式
      

  6.   

    楼上说的都有理,主要自己刚用delphi,觉得数据感知组件挺方便的.想最好能既方便又符合我的需求.现在看来就用Edit一了百了.新人分少.结了...
      

  7.   

    不要用数据敏感控件
    用TEdit
      

  8.   

    在双击listbox事件中,在ADOTable.locate前,执行ADOTable.cancel
      

  9.   

    楼主和我遇到的问题是一样的!哈哈~~~我也是不想让DBEDIT自动更新!可是找了好久,发现最终的答案是用EDIT更合适!所以我就把DBEDIT全改成了EDIT,不过,因为我很菜,所以用EDIT添加数据时,总有BUG,我是用EDIT获取DBGRID里的数据,用BUTTON提交!请熟悉的朋友看看我的贴子,另外哪位朋友有用EDIT添加,修改记录的完善的例子,请发给我一份!谢谢!
      

  10.   

    dbedit也不是说肯定不行,只是大家用的少,只要努力研究肯定会有满意的结果的,我先在也在研究这个问题,呵呵