請幫我解釋這段代碼(關于錯誤處理)(50分)

  • 主题发起人 主题发起人 小阿文
  • 开始时间 开始时间

小阿文

Unregistered / Unconfirmed
GUEST, unregistred user!
const
eKeyViol = 9729;

implementation

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;
問題如下:
1.錯誤代碼應是系統內定的呀,為何可以以 const eKeyViol 定義呢?
2.CustomerPostError過程參數 E 是何用?
而 if (E is EDBEngineError) then
if (E as EDBEngineError).Errors[0].Errorcode = eKeyViol then
以是如何理解呢?
3.以上代碼出自 delphi目錄/demos/db/dberror
 
1.const ekeyviol只是指定了一个常量,并且和错误代码相同,(E as EDBEngineError).Errors[0].Errorcode = eKeyViol
只是在判断错误代码是否为ekeyviol.
2.e的类型是EDatabaseError,是数据库错误异常类。error[0]指定数据库错误索引中的一个错误。
 
定义eKeyViol应该是为了容易识别和理解,直接使用9729当然可以;

CustomerPostError過程參數 E ,是引用返回数据库错误类型的变量,
此过程应该是在出现错误CustomerPostError的时候执行,E返回错误信息;

if (E is EDBEngineError) then //如果E的错误类型是EDBEngineError类型,
//(BDE错误),则处理以下:
if (E as EDBEngineError).Errors[0].Errorcode = eKeyViol then
//如果E作为EDBEngineError错误类型(这里使用类型强制,
//目的是把E当作EDBEngineError类型,可以使用EDBEngineError的属性),
//E的错误集的第一个错误(Error[0])的错误代码(ErrorCode)是9729 (eKeyViol),
//那么...
我是凭经验理解,所有的例子我都没有安装,说错了请不要见笑!
 
关于2. 这有什么不好理解的?
 
数字9729确实是系统内定的,此例的作用并非是为了改变其错误代码,而仅仅是为
了用自己的错误信息屏蔽BDE的系统错误信息,你可在MessageDlg中加入任何你自己
喜欢的信息显示给用户,当然在中国最好用汉字啦。
错误代码在.../delphi5/doc/bde.int中有定义,节选如下:
ERRCODE_NONE = 0;
DBIERR_NONE = (ERRBASE_NONE + ERRCODE_NONE);
//表示实际的错误代码为BASE与CODE相加的号码
...
{ 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 }
...
DBIERR_KEYVIOL = (ERRBASE_INTEGRITY + ERRCODE_KEYVIOL);
DBIERR_MINVALERR = (ERRBASE_INTEGRITY + ERRCODE_MINVALERR);
DBIERR_MAXVALERR = (ERRBASE_INTEGRITY + ERRCODE_MAXVALERR);
DBIERR_REQDERR = (ERRBASE_INTEGRITY + ERRCODE_REQDERR);
DBIERR_FORIEGNKEYERR = (ERRBASE_INTEGRITY + ERRCODE_FORIEGNKEYERR);
DBIERR_DETAILRECORDSEXIST = (ERRBASE_INTEGRITY + ERRCODE_DETAILRECORDSEXIST);
DBIERR_MASTERTBLLEVEL = (ERRBASE_INTEGRITY + ERRCODE_MASTERTBLLEVEL);
DBIERR_LOOKUPTABLEERR = (ERRBASE_INTEGRITY + ERRCODE_LOOKUPTABLEERR);
DBIERR_LOOKUPTBLOPENERR = (ERRBASE_INTEGRITY + ERRCODE_LOOKUPTBLOPENERR);
DBIERR_DETAILTBLOPENERR = (ERRBASE_INTEGRITY + ERRCODE_DETAILTBLOPENERR);
DBIERR_MASTERTBLOPENERR = (ERRBASE_INTEGRITY + ERRCODE_MASTERTBLOPENERR);
DBIERR_FIELDISBLANK = (ERRBASE_INTEGRITY + ERRCODE_FIELDISBLANK);

例中的eKeyViol,delphi原定义为ERRBASE_INTEGRITY + ERRCODE_KEYVIOL
ERRBASE_INTEGRITY = $2600; { Integrity Violation }
16进制2600等于10进制的9728,加1,即为9729
 
謝謝各位朋友
to jqw:
請問 Error[0]這個數組的下標是如何指定的?
 
后退
顶部