主要是在TDataSet的BeforePost事件中进行判断,每一列的值是否符合规则,如果不符,则Abort,相符则Post!
例如:要求Field1字段不能为空,则写
if DataSet.FieldByName('Field1').asstring='' then
  begin
    ShowMessage('Field1不能为空!');
    Abort;
  end;
其他的根据你的具体要求来进行相应的验证,就可以了!

解决方案 »

  1.   

    在dbgrid关联的table中posterror方法中加上代码:
    参照:
    unit U_data
    ... ...
    ... ...type
      TDtMdl = class(TDataModule)
    ... ...
    const
      eKeyViol = 9729;
      eRequiredFieldMissing = 9732;
      eRequiredFieldzero =13059;  //不能为空的错误代码
      eForeignKey = 9733;
      eDetailsExist = 9734;implementation
    ... ...
    ... ...
    procedure TDtMdl.Tbl_wrkPostError(DataSet: TDataSet; E: EDatabaseError;
      var Action: TDataAction);
    VAR iDBlERROR:INTEGER;
    begin
         IF (E IS EDBENGINEERROR) THEN
        BEGIN
           IDBLERROR:=(E as eDBENGineError).Errors[0].Errorcode;
          // messagedlg('错误码:'+inttostr(idblerror),mtwarning,[mbok],0);
          // abort;
             //z这两行代码可以捕捉错误代码:)
             
           case iDBlError of
                eRequiredFieldzero:
                begin
                    messagedlg('不能为空)!',mtwarning,[mbok],0);
                    abort;
                end;
                eKeyViol:
                begin
                    messagedlg('该人员信息已经被输入!也可能是工号重复了,请重新输入!',
                               mtwarning,[mbok],0);
                    abort;
                end;
           end;
       end;
    end;
      

  2.   

    还是做判断的好,其实就是一个try...except的处理
      

  3.   

    我是要纪录回到原来那一行,错误我是能截获的,但是如何让纪录重新回到着一行试问题的关键,
    比如一行纪录有code,name,sex,其中name ,sex在数据库中是可以为空的,但是我现在要求不为空,所以,在他向下移动,或者向上移动时,来接获“错误”,之后让他回到出错的一行。(其实从头到尾根本就没有数据库错误,都是程序中控制的东西)
      

  4.   

    不过就是BookMark在干事嘛。
    我等休息了。
      

  5.   

    呵呵,你可以在dbgrid相关联的query/table里的要约束的字段的OnValidate事件里判断,假如不和要求,则abort掉。