大家是用什么办法的,我用的方法很麻烦的
以ADO为例,在新建或是修改记录时,如何在记录存入之前或存入的时候来检查这个主键的数据是否已在数据库内存在,避免重复出错,请讲的详细点,谢谢

解决方案 »

  1.   

    查询,如果有的话,就改变主键的值
    没有,就post
    ado1.open;
    ado1.first;
    whit not ado1.eof do 
      if ado1.fieldbynem('').value= i //i是一个变量,表示要加入的记录的主键的值
        then 
            改变要加入的记录的主键的值
        else
         next;
    大体思路是这样的
      

  2.   

    Str:=主键值;
    AdoQuery1.Close;
    AdoQuery1.Sql.Clear;
    AdoQuery1.SQl.Add('Select 主键字段 From 表 Where 主键字段='''+Str+'''');
    AdoQuery1.Open;
    IF AdoQuery1.IsEmpty Then //表示不存在
    Begin
      添加记录到表中;
    End
    Else Begin
      修改主键;
    End;
      

  3.   

    aqury.close;
    aqury.SQL.Clear;
    aqury.SQL.add('select 主键 from table where 主键='+要加入的记录的主键的值);
    aqury.open;
    if aqury.recordcount>0 then 改变要加入的记录的主键的值
      

  4.   

    这是我在用BDE的处理方法,你可以参考一下
      eKeyViol=9729;//主键重复时的错误值
    procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;
      var Action: TDataAction);
    begin
    if (E is EDBEngineError) then
      if(E as EDBEngineError).errors[0].Errorcode=eKeyViol then
      begin
        action:=daAbort;//挂起,中止程序继续执行
        dataset.Cancel;
        showmessage('不能重复');  end;end;
      

  5.   

    忘了一点 eKeyViol是常量
    const eKeyViol=9729;//主键重复时的错误值
      

  6.   

    这我给你二个方案A。 你可以在做数据时把这个新值进行检查,实定它不是重的。
    B。 就是在你的SQL 语句运行时用try 处理如果出错那就认为是重了。我觉的你呀最好是用第一种呀。
      

  7.   

    在数据集提交前的事件中进行判断
    例:
    procedure TForm1.ADOQueryBeforePost(...);
    begin
      if ADOQuery1.locate('id',value,[]) then //id为主键字段名,value为要插入的主键值
      begin
        showmessage('主键重复,请更改');
        abort
      end;
    end;