比如: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.   

    你的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; 
      

  2.   

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

  3.   

    呵呵,这个已经说的很明白了。
    execsql只是一个sql语句的执行。