我想让用户直接在DBGrid里就能修改数据,于是我就在‘修改’按狃 将ADOuery设为ADOQuery.edit状态,然后在‘保存’按狃 里ADOQuery.post,  可是我测试发现没有点“保存”,即没有post,也照样修改了后台的数据库,这样数据会很不安全。为什么ADOQuery没有post也会把修改的东西覆盖数据库里原来的东西呢?万一用户以为只要不点“保存”,随便修改了也没事,结果恰恰有事,怎么办呀。

解决方案 »

  1.   

    你在保存之前问一下用户,是否要存!在ADOQuery的BeforePost事件中写代码:if Application.MessageBox('要保存数据吗?','请问',MB_YESNOCANCEL+MB_ICONQUESTION+MB_DEFBUTTON3)<>IDYES then
        abort;
      

  2.   

    是否在修改DBGRID数据之后,将鼠标点击DBGRID的其他行了,
    如果是这样就会自动保存了.
    要控制他就要在ADOQuery的BeforePost事件中写代码
      

  3.   

    可是我测试发现没有点“保存”,即没有post,也照样修改了后台的数据库,这样数据会很不安全。
    =================================================我想是因为你的DBGrid和数据库关联起来了
    比如你选中的行移动那么数据库中ADOQuery1所对于的行也移动
    你把DBGrid中的行删除,数据库里也删除了
    比如说你用DBGrid1.selected.delete!!!这样就可以把数据库对应的行删除,而不需要自己写代码了
      

  4.   

    所以你即使没有用语句去修改你的数据库,但是你在修改DBGrid的时候,也是对数据库中相应的行进行操作了
      

  5.   

    第一楼的代码是不是改改变一下询问条件,应该是IDNO的时候abortif Application.MessageBox('要保存数据吗?','请问',MB_YESNOCANCEL+MB_ICONQUESTION+MB_DEFBUTTON3)<>IDNO then
        abort;
      

  6.   

    先說明一點,最高的兩樓顯然沒有誤會你的意思。dbgrid 在你修改某一條記錄後,再點其它記錄,此時已經自動執行了adoquery1.post這個命令了。
    所以用戶不需要點你設置的保存按鈕,就已經修改了數據。
    在before post 裡加語句進行詢問,如
    if Application.MessageBox('要保存数据吗?','请问',MB_YESNOCANCEL+MB_ICONQUESTION+MB_DEFBUTTON3)<>IDYES then
        abort;
    是可行的!
    但,有另外一個辦法我感覺應該更好
    設置adoquery的locktype属性为ltBatchOptimistic
    把adoquery1.UpdateBatch();這條命令,放在你的保存按鈕中adoquery1.post 之後.
    這樣你在dbgrid上的所有操作都沒有保存,
    除非執行了adoquery1.UpdateBatch()
      

  7.   

    谢谢,merkey2002(小样的) 我回去试试,你写的是蘩体吧,有部分字出不来,
    但是我还是看懂一点意思了。 试成功回来给分。