比如:beforepost,beforeinsert,最好要全一点,原因是:
procedure TForm1.Button1Click(Sender: TObject);
begin
 with adoquery1 do
 begin
    Close ;
    sql.Clear ;
    SQL.Add('insert into table1(nn)values('''+edit1.Text+''')');
    ExecSQL ;
 end;
end;procedure TForm1.ADOQuery1BeforeInsert(DataSet: TDataSet);
var
  i:Integer ;
begin
 for i:= 1 to Length(Edit1.text) do
  if (Edit1.Text[i]<'0') or (Edit1.Text[i]>'9') then
  ShowMessage('这个是插入');
  Abort;
end;procedure TForm1.ADOQuery1BeforePost(DataSet: TDataSet);
var
  i:Integer ;
begin
 for i:= 1 to Length(Edit1.text) do
  if (Edit1.Text[i]<'0') or (Edit1.Text[i]>'9') then
  ShowMessage('这个是插入');
  Abort;
end;我
用了如上的不过程还是不能拦错

解决方案 »

  1.   


    你調試下你的代碼: ADOQuery1BeforeInsert,ADOQuery1BeforePost 這裏面執行條判有沒有成立的。
      

  2.   


    你的BeforeInsert,BeforePost  是針對數據集的,你的EXESSQL只是傳遞一個SQL語句到服務器,所以procedure TForm1.Button1Click(Sender: TObject); 
    begin 
    with adoquery1 do 
    begin 
        Close ; 
        sql.Clear ; 
        //在這個地方先判斷
        SQL.Add('insert into table1(nn)values('''+edit1.Text+''')'); 
        ExecSQL ; 
    end; 
    end; 
      

  3.   

    BeforeInsert在adoquery1.Insert时触发
    BeforePost 在 adoquery1.Post时触发ExecSQL 是不会触发adoquery1的事件的
      

  4.   

    这两个事件是通过adoquery1.Insert(Append)

    adoquery1.Post
    前触发的.你这个是直接执行SQL语句,肯定不能触发啦
      

  5.   

    要知道顺序,你看demo中的ADO部分,有ado事件的执行顺序。
    断点跟踪一下。