如何判断往表中写的一条记录是否表中的记录重复!分不够再加!!! (100分)

  • 主题发起人 主题发起人 wangjyy
  • 开始时间 开始时间
W

wangjyy

Unregistered / Unconfirmed
GUEST, unregistred user!
!!!!!!!!!!问题重新描述!!!!!!!!!!!!!!!

表名:_ManagerInfo
id (int,4) //ID为主键,由程序自动生成,每增加一个记录,ID自动加1,
name (char,8)
在我向表中添加记录时如何判断字段名 name 出现重复 ?用什么事件。
请问如何实现?各位高手帮帮我,分不够再加!!!
 
定义主键
 
最好在服务器端判断:
if exists(select * from table where ????)
begin
....
end
else
begin
.....
end
 
!!!!!!!!!!问题重新描述!!!!!!!!!!!!!!!

表名:_ManagerInfo
id (int,4) //ID为主键,由程序自动生成,每增加一个记录,ID自动加1,
name (char,8)
在我向表中添加记录时如何判断字段名 name 出现重复 ?用什么事件。
请问如何实现?各位高手帮帮我,分不够再加!!!
 
在进行插入之前,比如Beforepost,
select count(*) from _ManagerInfo
where name='...'
如果查出该name已经存在,可以不插入,提示重新输入
 
把 name 作主键,
然后用
try
except
end;

或在PostErrot 事件写
 
用函数判断!如下:
function Lookup_Rcd(CDset: TClientDataSet;const KeyValues: array of Variant; const KeyFields: array of string):boolean;
var
i:integer;//数据集的记录量
n:integer;//数据数组的记录量
y:integer;//相等字段值记录量
begin
y:=-1;
if CDset.Active = false then CDset.Active:= true;

CDSet.DisableControls;
result:=false;//初始设置
For i:=1 to CDset.RecordCount do
begin//1
CDset.RecNo:= i;
for n:=0 to high(KeyFields) do
begin//2
if (CDSet.FieldByName(KeyFields[n]).Value <> KeyValues[n])
and (KeyValues[n] <> '' )then
begin
break;//开始下一记录的搜索
end;
Y:=n;
end;//2
if y = high(KeyFields) then
begin
//showmessage('存在相同记录!');
result:=true;//搜索到后设置
CDSet.EnableControls;
Exit;//退出数据集搜索
end;
end;//1
CDSet.Append;
CDSet.EnableControls;
end;
列题:查找 (姓名,职员编号,工资项目) 相同的纪录.......
if Lookup_Rcd(CDS_Lgzsjxgb,[Edt_name.Text,Edt_zybh.Text,Edt_gzxm.Text]
,['xm','zybh','gzxm']) = false then
 
ID为主键,用UNIQUE约束name
 
这是在BDE,IBX,ADO+SQLSERVER 2000下不同的实现方案示例:
1.IBX:
procedure TData.QmanagersPostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if copy(e.Message,1,9)='violation' then
application.MessageBox('工号重复. 请更改后重试!','错误',mb_ok+mb_iconerror)
else
if copy(e.Message,1,8)='deadlock' then
application.MessageBox('系统死锁!可能其他用户正在修改当前记录,或者当前记录已被其他用户删除。'#13'请稍后再试,或重新打开本窗口重试!','错误',mb_ok+mb_iconerror)
else
application.MessageBox(pchar('不能保存!请退出后重试!'),'提示',mb_ok+mb_iconerror);
action:=daabort;
end;
procedure TData.QmanagersUpdateError(DataSet: TDataSet; E: EDatabaseError;
UpdateKind: TUpdateKind; var UpdateAction: TIBUpdateAction);
begin
if copy(e.Message,1,9)='violation' then
application.MessageBox('工号重复. 请更改后重试!','错误',mb_ok+mb_iconerror)
else
if copy(e.Message,1,8)='deadlock' then
application.MessageBox('系统死锁!可能其他用户正在修改当前记录,或者当前记录已被其他用户删除。'#13'请稍后再试,或重新打开本窗口重试!','错误',mb_ok+mb_iconerror)
else
application.MessageBox(pchar('不能保存!请退出后重试!'),'提示',mb_ok+mb_iconerror);
updateaction:=uaabort;
end;

2.BDE
procedure TformDataModule.QfactoryUpdateError(DataSet: TDataSet;
E: EDatabaseError; UpdateKind: TUpdateKind;
var UpdateAction: TUpdateAction);
const
ekeyviol=9729;
var
iDBIError:integer;
begin
if (E is EDBEngineError) then
begin
iDBIError:=(E as EDBEngineerror).errors[0].errorcode;
case iDBIError of
ekeyviol:
begin
if application.MessageBox(pchar('编号出现重复!重复的记录将只存有一份!'+#13+'请更改编号!'),'警告',mb_iconwarning+mb_ok)=idok then
updateaction:=TUpdateAction(uaSkip);
end
end;
end;
end;

3.ADO+SQLSERVER 2000
procedure TData.ADOPostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
case adocnt.Errors.Item[0].NativeError of //ADOCNT: Tadoconnection
2627,2601:application.messagebox('编号重复,请更改后重试!','提示',mb_ok+mb_iconinformation);
515,1010:application.messagebox('请将资料填写完整!','提示',mb_ok+mb_iconinformation);
else
application.MessageBox(pchar(format('保存数据时发生错误!操作终止!'#13#13'错误代码:%d'#13'错误消息:%s',
[adocnt.Errors.Item[0].NativeError,ADOCnt.Errors.Item[0].Get_Description])),
'提示',mb_ok+mb_iconinformation);
end;
action:=daabort;
end;

解决了吗?是不是要再加分呀?


 
forshow 把name:=赋值,然后存盘时检查 name=trim(edit1.text)
select count(*) where name=:name
if fields[0]>0 then 重复
 
前台作判断啊。。。。。。少不了的步骤。。。
 
1、用Unique约束Name
2、在插入数据以前进行判断,如Adoquery的BeforePost事件中判断数据库中是否有Name相同的
记录存在
 
我也是类似的问题:要把数据导入到数据库里
5个字段都相同时才判断这两个记录是相同的,我设置了5个,
照说是‘and’关系,可没用,一见到一个字段相同时就中止了程序。
敢问各位高手有何想法?
 
后退
顶部