如何检查唯一性(100分)

  • 主题发起人 主题发起人 xmdsj
  • 开始时间 开始时间
X

xmdsj

Unregistered / Unconfirmed
GUEST, unregistred user!
在SQL SERVER中
一个表中有些字段值不能重复 现已建立唯一性索引(UNIQUE)
如:身份证,工号等
请问如何在保存数据前判断其值是否唯一(我不想让程序在保存时弹出系统错误提示)
 
在插入的where语句中加入 (生份证号 not in (select 身份证号 from XXX ))
 
首先用查询来验证要插入的ID是否已经存在。
也可以通过捕捉ADO一致性异常,从而进行自己的处理。
 
yuyusz, insert 语句没有where 条件句吧?

xmdsj,同意楼上看法,可以在插入前判断是否存在相同记录;

或者用try...except截获数据库操作的异常,然后自己处理错误(或者弹出友好的界面,
或者不给提示,随你啦)。
如:
query1.sql.add('insert into your_table(id,workid) values(''123'',''234'')');
try
query1.execute;//执行插入操作,如果失败,则直接跳入except内的执行代码处理。
…… //其它操作
except
//如果出现异常,将进入这里处理。异常的原因有很多,包括关键字重复
showmessage('插入失败!也许有重复的记录。');
end;
//其它操作
 
首先你先說明你是用ADO還是BDE呢,有沒有用到CacheUpdate或者BatchUpdate呢
我相信很多人都不希望由server端來發現索引重複錯誤,大家好好討論一下
 
在SQLSERVER建立唯一性'约束'
 
用存储过程来实现。在存储过程中进行唯一性查验,将结果返回到客户端。
 
假如前台沒有使用ltBatchOptimc模式的話,你們說的辦法都是可行的,但是,如果
使用了這個模式呢?
 
to huntor
请问错误代码如何捕捉,以及代码含义,有相关资料吗?
 
建议不要通过服务器端错误捕获来进行唯一性检测,建议在数据提交前进行检测,这样的效率远比服务器端错误要高得多,而且易于控制,特别对于客户端比较多的情况下,尤其明显。
 
BeforePost时处理
 
用触发器也能实现。
 
//在保存之前,用关键字ID检索一下数据库;
with Query1 do
begin
Close;
SQL.Text:='select id from table1 where id='+QuotedStr(Edit1.Text);
Open;
if not IsEmpty then
begin
Close;
Application.MessageBox('代码重复!','提示',64);
Exit;
end;
Close;
end;
 
触发器是不可行的!它无法将结果返回到客户端。
建议还是用存储过程。对于allenk的说法,不是很赞同!
通过客户端检测的方式去做,首先一点就是增加了网络传递的数据量。相当于每一次需要两
个动作。
当客户端较多的时候,这样会造成性能的严重下降。

而且使用存储过程有一个好处:客户端可以尽量做到与业务无关。
举个例子,由于业务的变化,以前的唯一性索引需要再增加一个字段形成唯一性索引。如果
使用客户端检测的方式,则只有去升级客户端了。而如果使用的是存储过程,则只需要调整
服务器上的存储过程的内容就可以了。
 
在录入之后的离开事件中加入
with Query1 do
begin
Close;
SQL.Text:='select id from table1 where id='''+Edit1.Text+'''';
Open;
if recordercound>=2 then
begin
Close;
Application.MessageBox('代码重复!','提示',64);
Exit;
end;
Close;
end;
 
我一般在保存前beforepost事件中检查完整性。比较好处理的。
 
你应该在前台界面DataSet数据集的BeforePost事件中判断用户输入的数据是否已经存在,如果
已经存在应该调用DataSet的Cancel方法取消对DataSet数据集的操作.
 
多人接受答案了。
 
后退
顶部