如何截获"key violation",代之以汉字提示(30分)

  • 主题发起人 主题发起人 everdove
  • 开始时间 开始时间
try
....
except
on bdeexcept
....
end;
 
??? silly, 应该是EDBEngineError吧
everdove: 去看看delphi下demos/db/dberrors/的例子,什么都有
 
silly的办法不是很好,必须在所有
使用的地方都Try起来,
比较好的方法有两个
1、汉化consts.pas和dbconsts.pas
基本上所有的出错信息都在里面定义,
如果要,写信给我
2、这是标准的方法,
响应Application.OnException事件
这个事件会在产生任何的Exception时
触发(如果你没有Try起来的话)
参数有Sender:TObject和E: Exception
你可以在这里分析E是什么类型的Exception,
出错信息是什么以及其他种种信息
 
to 李颖(looks like a girl's name):
这个 key violation 是DBE发出的信息, 不在 *consts.pas中, 要从根本上解决,
汉化DBE吧.
 
比较简单又易懂的办法是
try
...
except
on e:EDBEngineError do
if e.message='Key violation.' then
raise Exception('错误!!!!')
else
raise;
end;
 
xiaowind,不对吧?

e.message='Key violation.'
e.message会只是一个单纯的Key violation?用errorcode吧

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;


关于其他error的说明:

A complete listing of the database errorcodes is found in the
DBIErrs.Int file in the Delphi/Doc directory or in the IDAPI.h
file in the Borland Database Engine.

Database errors are defined by category and code. Here's a sample:

{ ERRCAT_INTEGRITY }

ERRCODE_KEYVIOL = 1; { Key violation }
ERRCODE_MINVALERR = 2; { Min val check failed }
ERRCODE_MAXVALERR = 3; { Max val check failed }
ERRCODE_REQDERR = 4; { Field value required }
ERRCODE_FORIEGNKEYERR = 5; { Master record missing }
ERRCODE_DETAILRECORDSEXIST = 6; { Cannot MODIFY or DELETE this Master record }
ERRCODE_MASTERTBLLEVEL = 7; { Master Table Level is incorrect }
ERRCODE_LOOKUPTABLEERR = 8; { Field value out of lookup tbl range }
ERRCODE_LOOKUPTBLOPENERR = 9; { Lookup Table Open failed }
ERRCODE_DETAILTBLOPENERR = 10; { 0x0a Detail Table Open failed }
ERRCODE_MASTERTBLOPENERR = 11; { 0x0b Master Table Open failed }
ERRCODE_FIELDISBLANK = 12; { 0x0c Field is blank }


The constant for the base category is added to these constants to represent
a unique DBI errorcode;

DBIERR_KEYVIOL = (ERRBASE_INTEGRITY + ERRCODE_KEYVIOL);
DBIERR_REQDERR = (ERRBASE_INTEGRITY + ERRCODE_REQDERR);
DBIERR_DETAILRECORDSEXIST = (ERRBASE_INTEGRITY + ERRCODE_DETAILRECORDSEXIST);
DBIERR_FORIEGNKEYERR = (ERRBASE_INTEGRITY + ERRCODE_FORIEGNKEYERR);

The ERRBASE_INTEGRITY value is $2600 (Hex 2600) or 9728 decimal.
Thus, for example, the errorcode for keyviol is 9729
for master with details is 9734.

*)
来源于delphi下demos/db/dberrors/的例子,那种解决方法不错啊,为什么还要讨论
来讨论去?
 
huizhang、silly、xiaowind、yifeng、李颖的方法都可以。我是用/delphi4
/demo/db/dberror的例子解决的。但不会比汉化BDE方便、彻底。
谁能把全部的erroe code mail给我,
 
98年11月Delphi4.0中文版就面世了, 为什么到现在D版光盘还没见到? 那位兄弟知道
什么地方能够下载或买到中文D版Delphi4.0?
 
procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if edbengineError(e).errors[0].errorcode=9729 then
e.message:='Duplicate EmployeeCode!';
end;
 
噢,把我的英文提示换成你的中文提示
 
Delphi4.0中文版?繁体的吧?
我怎么在inprise的网站上没有看到相关的消息?
 
多人接受答案了。
 
后退
顶部