请问用TQuery控件在进行数据库数据输入时,怎么控制表的主键约束

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

16 个解决方案

#1


先对主键进行判断
有重复就退出呀

#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


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;

#4



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

#5


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

#6


运行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就会返回异常的信息,程序员就可以加以判断以处理不同

#7


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

#8


同意楼上意见~!

#9


????????????

#10


try
except
end;

#11



try
except
end;

#12


完全同意以上几位的意见。

#13


你可以不捕捉异常,自己写程序的时候判断:(不过有点多事一举,因为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;

#14


try
except
end;

#15


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

#16


使用自动增减字段。

#1


先对主键进行判断
有重复就退出呀

#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


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;

#4



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

#5


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

#6


运行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就会返回异常的信息,程序员就可以加以判断以处理不同

#7


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

#8


同意楼上意见~!

#9


????????????

#10


try
except
end;

#11



try
except
end;

#12


完全同意以上几位的意见。

#13


你可以不捕捉异常,自己写程序的时候判断:(不过有点多事一举,因为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;

#14


try
except
end;

#15


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

#16


使用自动增减字段。