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;
with tquery do begin sql.clear; sql.add('select * from Tablename where 主键=:参数名'); parameters.parabyname('参数名').value:=已存在的值; try open; if recordcount<>0 then exit; 否则进行操作
你可以不捕捉异常,自己写程序的时候判断:(不过有点多事一举,因为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;
用Locate语句 或select count(*) into count from table where dh=:sdh if count>0 then showmessage('冲突!'); abort;
begin
sql.clear;
sql.add('select * from Tablename where 主键=:参数名');
parameters.parabyname('参数名').value:=已存在的值;
try
open;
if recordcount<>0 then exit;
否则进行操作
except
end
end;
begin
sql.clear;
sql.add('select * from Tablename where 主键=:参数名');
parameters.parabyname('参数名').value:=已存在的值;
try
open;
if recordcount<>0 then exit;
否则进行操作
except
end
end;
方法1:可在TQuery事件 ONBeforePost()写查询是否有输入主键列字符串是否重复;
方法2:在保存 Query1.Post 前作判断即可;
方法3:使用异常处理方法;
try
Query1.Post ;
Except
shwomessage('主键重复!');
Query1.cancel ; // 要放弃则使用该句 ;
end;
begin
..... //业务规则
if 不允许保存 then
Abort;
end;
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就会返回异常的信息,程序员就可以加以判断以处理不同
except
end;
具体的主键约束可以用数据库来实现啊,存储数据的时候吧提交任务放在try里就可以了
在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;
或select count(*) into count from table where dh=:sdh
if count>0 then
showmessage('冲突!');
abort;