请问用TQuery控件在进行数据库数据输入时,怎么控制表的主键约束,也就是怎样才能不让记录重复。

解决方案 »

  1.   

    with tquery do 
    begin
      sql.clear;
      sql.add('select * from Tablename where 主键=:参数名');
      parameters.parabyname('参数名').value:=已存在的值;
      try
        open;
        if recordcount<>0 then exit;
        否则进行操作
        
      except
      end
    end;
      

  2.   

    with tquery do 
    begin
      sql.clear;
      sql.add('select * from Tablename where 主键=:参数名');
      parameters.parabyname('参数名').value:=已存在的值;
      try
        open;
        if recordcount<>0 then exit;
        否则进行操作
        
      except
      end
    end;
      

  3.   


     方法1:可在TQuery事件 ONBeforePost()写查询是否有输入主键列字符串是否重复;
     方法2:在保存 Query1.Post 前作判断即可;
     方法3:使用异常处理方法;
            try
               Query1.Post ;
            Except
               shwomessage('主键重复!');
               Query1.cancel ;  // 要放弃则使用该句 ;
            end;
      

  4.   

    在TQuery的beforePost事件里做判断:
     begin
      .....  //业务规则
      if 不允许保存 then
        Abort;
     end;
      

  5.   

    运行SQL语句出现错误,程序员如何扑捉该异常呢?很简单,看看下面的函数:   
    Const
      ExecSQLMode = 0 ;
      OpenSQLMode = 1 ;
      ResultRight = ''SQL query result is right'' ;
      ...
      function RunSql(RunQuery: TQuery; Sqls: TStringList; var ErrorMsg: string; 
      Mode: integer) : integer ; 
      begin
      ErrorMsg := ResultRight ;
      Result := 0 ;
      try
      RunQuery.DatabaseName := ''RecordDB'' ;
      RunQuery.SQL.Clear() ;
      RunQuery.SQL.AddStrings(Sqls) ;
      if Mode = ExecSQLMode then
      RunQuery.ExecSQL()
      else
      RunQuery.Open() ;
      except
      on e:exception do 
      ErrorMsg := e.Message + #13 + #10 +''--- 错误是俺发现的 ---'' ;
      end;
      end;  朋友看明白了吧,我的函数很简单,将SQL语句代码段作为参数传递给TQuery组件,通过设置查询方式(ExecSQLMode、OpenSQLMode)来处理有结果集返回的数据查询语句(select)或是没有结果集返回的数据操作语言(update、delete、insert、create等)。而异常的扑捉呢,我们扑捉所有异常的老祖宗Exception,因为Delphi的所有异常都是从Exception继承下来的,这样一个简单的SQL语句运行和异常处理函数就完成了,一旦返回的ErrorMsg的值不是ResultRight,ErrorMsg就会返回异常的信息,程序员就可以加以判断以处理不同
      

  6.   

    try
    except
    end;
    具体的主键约束可以用数据库来实现啊,存储数据的时候吧提交任务放在try里就可以了
      

  7.   

    你可以不捕捉异常,自己写程序的时候判断:(不过有点多事一举,因为SQL对主键重复都会异常处理的)
      在QUERY1的对应主键的DBEDIT输入框的ONCHANGE事件中输入如下代码:
    procedure dbedit1onchange(..........)
    begin
       if query1.state=dsinsert then
         begin
          with query2 do  //在添加一个QUERY2组件
               begin
                close;
                sql.clear;
                sql.add('select * from 表名 where 主键字段=:number')//下面假设你操作的
                params.parambyname('number').asstring:=query1.fieldbyname('主键字段名').asstring;//假设主键字段是char型的;
                prepare;
                open;
               end;
            if not query2.isempty then //主键重复
                 begin 
                   showmessage('你输入的主键重复!,');
                   abort;
                 end;
        end;
    end;
      

  8.   

    用Locate语句
    或select count(*) into count from table where dh=:sdh
    if count>0 then
    showmessage('冲突!');
    abort;