我在进行数据库编程时,因其中的一个字段一关键字,当该字段输入的值重复时系统发生错误,如何决解。(50分)

  • 主题发起人 主题发起人 gao988
  • 开始时间 开始时间
G

gao988

Unregistered / Unconfirmed
GUEST, unregistred user!
我在进行数据库编程时,因其中的一个字段一关键字,当该字段输入的值重复时系统发生错误
请问如何定一段代码提示“该字段值重复请重新输入”。多谢。
 
try
......
except
showmessage('');
end;
 
在写入之前检查关键字字段的值是否已存在!
 
try
..............
except on EdatabaseError do
showmessage('');
end;
我试过了,肯定可以,快给分
 
你得说清楚用的是什么数据库,本地的还是网络的,本地的话,若你用的是数据绑定,可以在
Tdataset的POSTERROR事件重发出提示,并可以通过哑异常退出当前例程。如:
procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
showmessage('XX重复,请重新输入');
action:=dbabort;//或者用 abort;
end;

如果你用的是网络数据库的话,估计会有问题,因为出错原因太多了,最好是在保存前自己检查一下
发现问题先提示,等没问题的时候再提交。其实这步工作是很应该做的啊
 
抄人家的,记不起版权人了 ,sorry

Database1.StartTransaction;
try
ApplyUpdates;
Database1.Commit;
except
// Database1.Rollback;
// raise;
On E: EDBEngineError do
begin
Database1.Rollback;
for i := 0 to E.ErrorCount - 1 do
begin
case E.Errors.ErrorCode of
$2601:
ShowMessage('呵呵!不允许鍵值重复!');
$0021:
Showmessage('太糟糕了,系统发生故障!TMD');
$270b:
Showmessage('对不起,你的受到主外键约束!怎么样,很失望吧!');
$2b05:
Showmessage('太糟糕了,网络连接超时判负!TMD');
$0028:
Showmessage('锁定违例!');
$1200:
Showmessage('不能识别的SQL错误!呵呵,有事干了!');
$2501:
Showmessage('太糟糕了,你的内存不足!请使用N(N>=10000)兆内存');
$2605:
Showmessage('对不起,你所添加的数据违反外键约束!');
$2728:
Showmessage('你所操作的表不存在!');
$2801:
Showmessage('记录已经被其它用户琐定!');
$2a06:
Showmessage('数据引擎初始化错误!');
$2c01:
Showmessage('网络初始化失败!');
$2c07:
Showmessage('呜呜..呜呜!一个我不知道的网络错误,这不可能!');
$2c0d:
Showmessage('是谁干的!!服务器竟然没打开!');
$3e07:
Showmessage('初始化失败!');
$3303:
// ShowMessage('服务器端错误:一般的SQL错误!');
else
// //raise EDatabaseError.Create(E.Message);
end;//case
end;//for
end;//on EDBError
end;
CommitUpdates;
end;
 
在adoquery.beforepost中进行判断:
if (adoquery.locate(主键键名,主键键值,[]))then
begin
showmessage('对不起,主键重复!');
end;
 
if 键值存在 then
begin
ShowMessage('键值存在');
end;

 
try
......
except
showmessage('该字段值重复请重新输入');
end;
脱离集成环境运行!
 
不同的bde错误都对应着相应的代码:
procedure TDM_XSXFHD.Q_sdgoodsmPostError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
var
temp :String;
begin
//主表错误处理
if (E is EDBEngineError) and
((E as EDBEngineError).Errors[0].Errorcode = 9729) then
MessageDlg('关键字重复,取消操作', mtWarning, [mbOK], 0);
if (E is EDBEngineError) and
((E as EDBEngineError).Errors[0].Errorcode = 13059) then
MessageDlg('关键字为空', mtWarning, [mbOK], 0);
end;

但是因为delphi对各种数据库的支持力度不同(oracle最好),所以,对于某些数据库
不能采用判断错误码的方法。例如sql server,用户要删
除主表中的纪录,而对应的子表中存在纪录。这是产生错误代码9733,但是用户不知道
这应为修改(update)还是删除(delete)操作引起的该错误,这时就要对错误消息
进行判断:
if (E is EDBEngineError) and
((E as EDBEngineError).Errors[0].Errorcode = 9733) then
begin
temp := copy((E as EDBEngineError).MESSAGE,25,1);
if temp = 'D' then
showmessage('存在相关子记录,需先删除子表记录!');
if temp = 'U' then
showmessage('存在相关子记录,不允许修改!');
end;
 
多谢各位指教。
 
if findkey([字段名]) then showmessage('记录已存在')
else begin
.........

end;
 
在Table加入一个Beforepost事件
procedure TForm1.TableBeforePost(DataSet: TDataSet);
begin
with table do
begin
indexfieldnames:='关键字段';
setkey; {设置数据库为搜索状态}
fieldbyname('关键字段').asstring:=dbedit1.text; {设置输入的字段值为搜索的标准}
gotokey; {移动到搜寻的记录上,完成搜索}
if gotokey then {如果找到搜索的记录,则gotokey返回true}
begin
showmessage('输入的关键字段已存在!请重新输入');
dbabort; {终止该操作}
end;
end;
end;
 
在table或query控件的Onediterror事件里加下面过程:
procedure dberror(dataset:tdataset;e:edatabaseerror;var action:tdataaction);
//防止表插入时主键重复错误
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
messagedlg('主键重复!',mtwarning,[mbok],0);
abort;
end;
end;
end;
end;
 
query.sql.text :='select count(*) from tablename where Name1='+name1+' and '+
' Name2='+name2+' ';//--- Primary key
query.OPen;
if not Query.Eof then
begin
showmessage('对不起,主键重复!');
exit
end;
 
上面几乎所有的方法多能解决你的问题:)
 
方法一:
try
..............
except on EdatabaseError do
showmessage('');
end;
或者
方法二:
在录入之前先查询一下,有没有关键字已经存在的。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部