请问在数据库中插入一条记录时,如果关键字重复,产生一个异常提示'Key Violation',这是一个什么异常?怎么样把这个异常的提示改成中文提示?(100分)

  • 主题发起人 主题发起人 t365
  • 开始时间 开始时间
T

t365

Unregistered / Unconfirmed
GUEST, unregistred user!
注意我问的是这是个什么异常
我知道在插入前先检查该关键字是否存在,然后进行插入操作。

try
DataSet.Post;
except
on E: Exception do
E.message := '关键字重复';
raise
end;
我想知道关键字重复是一个什么具体的异常?
 
所谓的关键字,就是这个字段只能有一个相同的,不能存在两个。
就是“唯一性”
'Key Violation'就是关键字冲突。
 
主鍵(primary key)是不允許數據重复
 
我知道'Key Violation'的意思
sysconst单元定义了许多异常提示的信息
但是却没有'Key Violation'
不知delphi把这个提示信息定义在什么地方?
 
看看这个,也许有用。
function GetErrCode(DataSet: TDataSet; E: EDatabaseError; var msg: string): Longint;
var
i, nCode, eCode: integer;
begin
if DataSet is TQuery then
msg := E.Message + #13#10 + TQuery(DataSet).Sql.Text
else
msg := E.Message;

if E is EDBEngineError then
with EDBEngineError(E) do
begin
eCode := 13059;
nCode := 0;
for i := 0 to ErrorCount - 1 do
if Errors.NativeError <> 0 then
nCode := Errors.NativeError
else if Errors.ErrorCode <> 13059 then
eCode := Errors.ErrorCode;

if nCode <> 911 then {eCode in [9733, 9734, 9729, 10024, 10038]}
result := eCode
else
result := nCode;
end
else
result := -1;
end;
 
你提示出错不就行了?用户又不知道主键是啥东东.
 
我是在DM1中的代码
const eKeyViol = 9729;
procedure TDM.CustomerPostError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
begin
if (E is EDBEngineError) then
if (E as EDBEngineError).Errors[0].Errorcode = eKeyViol then
begin
MessageDlg('Unable to post: Duplicate Customer ID.', mtWarning, [mbOK], 0);
Abort;
end;
end;
我想是不是'Key Violation'是调用api来的?
 
可参考Borland自己的Expmle,
在demo/db/
怎么样拦截BDE的错误?
 

打开相关的 delphi unit 源码文件,用单步跟踪执行应用程序,
如果有错误的话,试一试改一下源码文件.....
将 'Key Violation' 修改为 ‘键值错误’....等信息。

或者:

procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if (E is EDBEngineError) then
if (E as EDBEngineError).Errors[0].Errorcode = eKeyViol then
begin
application.MessageBox('输入的记录编号重名.','问题',mb_ok+MB_ICONERROR);
Abort;
end;

end;

 
关键字冲突!
 
关键字当然是只能一个,不能重复的,修改的话看看t365的,我也好好学学
 
关键字重复异常错误代码是一个常量,但这个常量在不同的数据库系统下是不一样的,
所以你需要提供有关的信息才能让大家提供有用的信息。
 
我也遇到过同样的问题,呵呵,我的解决办法有点儿笨
try
query1.Open;
except
on e:edbengineerror do
if e.message='Key violation.'#$D#$A'ORA-00001: 违反唯一约束条件 (SCOTT.CJXX_IND)' then
begin
/////错误处理
end;
end;
 

Similar threads

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