请各位高手给我指点一下POST方法的执行过程.我是指在执行了.ADOQUERY1.POST方法后.系统都调用了那些事件,执行了哪些操作.我在BEFOREPOST事件中写了一句代码.ABORT.目的是想拦截系统的任何POST异常.然后在TRY EXCEPT 语句中进行判断.可是程序现在连正常的保存都不成功.可是如果去掉ABORT的话,一切正常.不知道这是为什么,请各位指点.代码大致如下.
 procedure buttonPOSTclick(sender:tobject)
 begin   
     try 
        adoquery1.post;
        showmessage('保存成功');
     except
        showmessage('保存失败');
     end;
end;
 procedure beforpost(sender:tobject)
  begin
   abort;//为了拦截系统的异常消息.
  end;

解决方案 »

  1.   

    你在post之前放弃了post的操作当然保存不进去了。
    beforepost中的事件可以对诸如主键重复的不给post
      

  2.   

    还有你的try...except已经对可以对异常进行处理了
      

  3.   

    abort
    在保存前被你停止了,当然无法保存
    你上面那个就可以了
      

  4.   

    还有能给我讲一下ABORT的功能吗.我试了一下,他好象是可以屏蔽系统的异常.可是放在BEFORPOST里边后,系统就不能POST了吗?
      

  5.   

    abort就是放弃当前的操作,具体看看帮助,主键值为空的情况下是数据库不认的,你要在程序中控制的,比如在befortpost事件中你可以判断主键值是否为空或数据库中是否已有相同主键值存在。
      

  6.   

    ABORT只是放弃当前的操作?不会退出事件吗?还有我问一下POST方法的具体执行过程。我的理解是当我们自己写一条POST语句时。程序执行时。会先调用BEFORPOST事件,然后操作系统进行内部隐式调用。最后是AFTERPOST事件。如果在BEFORPOST事件中写了ABORT的话。那系统就不会进行内部隐式调用。也就没有AFTERPOST事件的执行。不知道对不对? 
    事件顺序:BEFORPOST----》系统内部调用----》AFTERPOST。
     还有就是。我们在程序中写的POST按扭虽然可以对POST事件进行异常处理。但是当光标移动到其他记录时,引起系统调用的话。这样的异常我们是无法控制的。要实现控制该怎么办呢?
      

  7.   

    我现在已经试了ABORT的功能。他确实是取消当前操作。而且是直接返回。他取消的是当前的整个操作。例如取消整个POST操作。而不管他写在BEFORPOST事件中或是AFTERPOST事件中。 我现在调试了一下程序,发现POST方法在执行时有三个阶段:1--BEFORPOST事件。2--操作系统内部调用。3--AFTERPOST事件。这三个阶段是一个整体。不管哪个阶段出错他都会使POST方法失败。例如我在BEFORPOST事件中写了ABORT后。他就不会在执行操作系统内部调用和AFTERPOST事件。而且会使得整个POST方法失败。所以我在我的异常处理部分的TRY EXCEPT结构中总是有异常。但是最后我又发现在AFTERPOST事件中如果写上ABORT后。也会取消整个POST操作。而且使POST方法失败。所以我的TRY EXCEPT 结构中还是只执行异常部分。所以我感觉 1--BEFORPOST事件。2--操作系统内部调用。3--AFTERPOST事件。这三个部分是一个整体。任何一部分出错或取消都将导致POST方法失败,从而出现异常。不知道我的理解对不对。用ABORT方法后是不是就使得POST操作产生异常???然后就执行EXCEPT部分的代码呢?? 希望各位高手给我解释一下。我这几天对POST方法的执行过程实在是搞不明白。
      

  8.   

    abort就是放弃当前的操作,不管before after 都取消
      

  9.   

    procedure buttonPOSTclick(sender:tobject)
     begin   
         try 
            adoquery1.post;
            showmessage('保存成功');
         except
            showmessage('保存失败');
            //这里写出错的代码。
         end;
    end;
     procedure beforpost(sender:tobject) //这个函数不要,去掉。
      begin
       abort;//老大,这里出错!
      end;
      

  10.   

    我现在按照我上面的理解去写程序的话是完全能够执行的。也就是说我的理解可能是正确的。我现在就想让各位高手确认一下。
    我的代码如下。
    procedure TForm1.ADOQuery1BeforePost(DataSet: TDataSet);
    begin
    ////////对不能为空的外键值进行检查BEGIN//acceptance_type_id
        if adoquery1.FieldByName('acceptance_type_id').asstring='' then
           begin
           showmessage('acceptance_type_id不允许为空!');
           adoquery1.FieldByName('acceptance_type_id').focuscontrol;
           abort;
           end;
    end;
    procedure TForm1.POSTBUTTONClick(Sender: TObject);
    begin
     if adoquery1.active=false then
        begin
        showmessage('数据库未打开,不能保存修改!');
        end
     else
          begin
               if  not (adoquery1.State in [dsedit,dsinsert]) then
                   begin
                     showmessage('数据库处于浏览状态,不能保存修改!');
                   end
               else
                    begin             
                        try
                           adoquery1.Post;
                           showmessage('您的修改已保存!');
                        except
                            //输入数据的完整性在BEFORPOST事件中进行检查.
                            //在这里主要检查输入的外键值是否符合参照完整性规则.
                           showmessage('保存数据失败!,请检查输入数据的完整性和合法性');
                           adoquery1.Fields[1].focuscontrol;
                        end;
                    end;
          end;
      

  11.   

    abort
    在保存前被你停止了,当然无法保存
      

  12.   

    beforpost----------> abort
        保存之前中止,当然不行!
      

  13.   

    abort 是一个哑异常,也是一种错误处理方法,只是他什么都不做而已
      

  14.   

    我自己UP一下。希望高手能看看,帮我解释解释。最好把POST方法的执行过程说一下。还有就是ABORT的功能。
      

  15.   

    Abort,引发一个哑异常(silent exception)
      

  16.   

    abort 就是主动抛出一个异常啊楼主想复杂了。。
      

  17.   

    ADOQUERY的POST时序大致就是下面这样。。
    1     TAdoQuery.Post.          //TDataSet.Post       实现            
    1.1        TDataSet.DoBeforePost     //用来触发OnBeforePost,
    1.2        TCustomADODataSet.InternalPost
    1.2.1                TCustomADODataSet.InternalPost.UpdateData
    1.2.1.1                         Recordset.Update  //这儿调用到ADO接口的方法。
    1.3        TDataSet.DoAfterPost          //用来触发OnAfterPost
    楼主你在1.1那处使用ABORT抛出异常,就跳出了下面的流程,当然不会再调用到POST实现上去.
      

  18.   

    halfdream(哈欠) 谢谢你。我等的就是你这样的回答。看来我的理解是对的。就象你列举的那几步。大体上确实是分为三步的。我也感觉ABORT有点产生异常的嫌疑,但是就是不敢肯定。经你指点现在懂了。ABORT就是主动抛出一个哑异常(就是不会出现异常对话框那种),导致执行过程中断,然后退出该执行过程。但是在TRY EXCEPTION结构中能够捕捉到由ABORT抛出的异常,然后加以处理。不知道我这样理解对不对?还有就是你能不能再讲一下关于DBGRID自动调用POST方法的执行过程。就是当我们把光标移到其他记录时,他自己调用的POST方法。如果他自己调用了POST方法,当用户输入数据不合法时。这样的异常我们没办法捕捉到,同样也没办法加以防止,这该怎么办呢?因为我在程序中设置了一个POST按扭,只要用户POST时点击该按扭我就可以对各种情况加以判断,但当用户修改记录后不是点击POST按扭而是直接把光标移动到其他记录,引发DBGRID自己调用POST方法时,这时我们就没办法控制了。这时该怎么处理呢?我现在的处理方法是:在BEFORPOST事件中把所有不合法的条件全部进行检查这样当BEFORPOST事件执行完毕后,就不会出现任何异常,从而安全的把数据存入数据库中。不知道是不是只能这样做呢?请halfdream(哈欠) 给予解释。谢谢!
      

  19.   


    TCustomDBGrid.MouseDown
          TDataLink.MoveBy
                TDataSet.MoveBy
                        TDataSet.CheckBrowseMode
                              TDataSet.Post.          //
                                     TDataSet.DoBeforePost     //用来触发OnBeforePost
                                     TCustomADODataSet.InternalPost
                                           TCustomADODataSet.InternalPost.UpdateData
                                                 Recordset.Update  //这儿调用到ADO接口的方法。
                                    TDataSet.DoAfterPost          //用来触发OnAfterPost
    无论你是调用POST方法,还是使用DBGRID,都是差不多的。
    都是从TDATASET。POST开始执行
      

  20.   

    halfdream(哈欠) 谢谢!我现在差不多懂了。我现在就把所有的完整性检查放在BEFORPOST事件中。然后在按扭中再使用TRY EXCEPTION结构。这样当DBGRID自己调用时,我会让它提示具体的出错类型。然后当按扭中的TRY EXCEPTION结构捕捉到POST错误时,我让它显示一个笼统的‘保存失败!请检查数据。’这样就OK了。 谢谢参与回帖的所有人。我是一个新手,所以分数不是很多。但是人人有分。再次感谢各位同行!