通过dbgrid来显示sql数据库中的数据,并通过dbgrid来添加、修改、删除数据库中的记录(只有一个字段),如果选择了新增记录,在dbgrid中输入了新增记录,在post前请问如何将输入在grid中的记录数据与数据库中的数据记录进行比较,以免出现重复??主要是想知道怎样从grid中将输入而尚未保存的数据与数据库中的记录比较,请各位指点

解决方案 »

  1.   

    你可以在table or query的beforepost中处理
      

  2.   

    try
      post
    except
      //在这里捕获主键重复异常
    end
      

  3.   

    我的水平有限只能说自己的笨方法 那就是
    你担心的那些会重复的字段的值先存在自己定义的变量当中 然后
    用sql语句查询在数据库当中查询这些字段的值是否存在 
    select COUNT(*) as total from table where ........
    如果total的值为0 则是不存在的 就post
    否则的话 则利用事务回滚撤销操作
      

  4.   

    我现在最主要的问题是不知道如何获得dbgrid中输入的数据来进行比较,例如如果是输入在edit中,可用edit.text来比较,dbgrid应怎样获得输入的数据??
      

  5.   

    我知道在提交前判断,可是我现在是不知道怎样获得输在dbgrid中的数据来进行比较
      

  6.   

    不科学!
    应该有主键吧,在DataSet的OnPost事件中 
    if pos('主键重复',e.message) then
    begin
      Action:=arAbort;
      showmessage('重复');
    end;
     实在没有主键 在dataset.OnbeforePos 或者 要检查的Field.OnValidate事件
      if DataSet.Locate('fieldname','新插入的值',[]) then
      begin
         showmessage('重复');
         Abort;
      end;  end;
      

  7.   

    我的意思是我怎么获得这个新输入的值,怎么从grid中得知它的值是什么??比较我会的
      

  8.   

    你的意思是在表中只有唯一值就OK了吗?那就给这个字段设成唯一性索引就行了
    这样你在程序中就什么也不用判断了,直接提交就是,只是提交放在try里.楼上也说了这个方法try
      post;
    except
      Application.MessageBox('数据重复','提示',MB_OK+MB_IconStop);
    end;数据的重复不重复就交给数据库来处理了.
      

  9.   

    直接去数据集中的数据就行,当你写在grid中时,数据集中已经存在这个字段的值了,只是没提交,所以直接就可以取出来。
      

  10.   

    adoconnetion.begintrans;
    try
      
    adoquery.post;
    adoconnection.comittrans;
    except
    adoconnetion.rollbacktrans;
    end;
    这样就可以了
    要是插入了重复数据的话 就会自动的不插入这条数据
      

  11.   

    gmc007(江西的佬表)你出现了,在我印象中好像你好时间不来了,我刚来csdn时你帮我好多问题的啊。嘻嘻,有时间加我QQ41334906
      

  12.   

    1、可以在BeforePost事件检查字段有效性,不符合,Abort即可。用 angle097113(深思不解) 的方法就行了
    2、可以在PostError事件,定义一整形变量来接受数据库异常返回的ErrorCode,若变量值为
       9729则说明输入了重复的字段。(需要设置键值字段的Required为False)
      

  13.   

    可以先查以下你要书的数据,如果有的话在重输啊
    用lookup啊
      

  14.   

    在BeforePost中
    按你刚输入的数据进行检索,然后看检索到的记录数,如果不为零则已经存在
    否则,Post