请各位大哥帮一下,写一个函数判断数据库表的主键是否重复,并找出主键的字段名称提示给用户(在dataset的BeforePost事件实现)前台用DELPHI后台用SQL SERVER

解决方案 »

  1.   

    用Locate。例如:
    with CustTable do
    begin
      if Locate('Company;Contact;Phone', VarArrayOf(['Sight Diver', 'P', '408-431-1000']), []) then SHowMessage('重复数据');
    end;
      

  2.   

    没什么方便的办法,在INSERT之前再QUERY一次
    with Aodquery1 do
    bein
      Close;
      SQL.Clear;
      SQL.Add(Select * from where 主键 := '''+Edit1.text+''');
      Open;
     
      if Adoquery1.RecordCount <> 0 then
      begin
        SHowMessage('产品编号已存在,请重新录入!');
        Exit;  
      end;
    end;
      

  3.   

    明白你的意思。其实有两个问题:
    1、判断主键是否重复;
    2、给用户明确、友好的提示。第一个,肯定要数据库系统自己来判断。设想由你自己来判断,则首先你要确定哪几个字段是主键,然后,你要人为判断是否存在一条记录,这条记录的几个主键字段和你要提交的记录是有冲突的。你可以用一个where去进行select count(*),如果为1则冲突,如果为0则不冲突。但是这样,则太过麻烦,而且你并不能保证你作完where判断之后到你提交数据之前的小段时间内,是否有别的人提交了同样的数据。所以,我建议还是在try except里面捕获数据库异常,来作为判断主键冲突的手段。假设你是用ADO控件访问SQL Server,则捕获EOleException,判断ErrorCode 是否为 -2147217873。第二个,关键问题在于找出关键字字段的名称。如果你的表结构已经固定下来不变了,你当然可以硬编码进去,告诉用户是这几个字段出错了。如果你想做的动态些,我现在也还没有找到很好的办法。回去研究一下,还有也许别的同志能有好的办法。
      

  4.   

    Kevin_Lmx(繁华阅尽)的方法虽然可行,但每插入一条记录就要循环提取一次数据,这在数据日益增多的情况下,也未免太浪费资源和间时了.最好什么都不管它,插入出错时才处理.(即try...except...end;)
    注意要对错误类型有一定的筛选.
      

  5.   

    交给数据库判断更好些。
    用try except 捕获异常
      

  6.   

    我喜欢用
    select * from where 
      

  7.   

    我知交给数据库判断更好些,也免太浪费资源和间时了,但这是一个不懂技术的人(主管)提出的需求啊,没有办法啊只能做了,现在我也想到什么方法做了,给用户明确、友好的提示(那几个字段重复)。
     function isprimary(tablestr: string; dataset: trzdataset): boolean;
    两个参数就可以了
    用这个系统存储过程exec  sp_pkeys @table_name
    我还没有写好,正在写
      

  8.   

    try
      //SQL 的插入语句
    except
      //插入不成功,给出提示 
    end;