program project1 uses forms,windows,classes,dialogs,db,,dbtables,sysutils, unit1 in ’unit1.pas’ {form1};
type tmyclass=class(tobject) public procedure AppException(Sender :TObject; E:Exception); procedure DBEngineError( E :EDBEngineError ); procedure DatabaseError( E :EDatabaseError ); function strkeyviol(str:string):string; function strreqderr(str string):string; function strforeignkey(str string):string; funtion str(detailrecordexist(str:string):string; function strtranengconstriant(str:string):string; end;
//================ // 数据库错误处理 //================
procedure Tmyclass.AppException(Sender :TObject; E:Exception); begin if (E is EDBEngineError) then begin if ( E as EDBEngineError ).ErrorCount>1 then DBEngineError( E as EDBEngineError ) else Application.ShowException(E); end else if (E is EDatabaseError) then begin DatabaseError( E as EDatabaseError ); end else Application.ShowException(E); end;
//对于服务器错误,处理Errors[0,1]
procedure Tmyclass.DBEngineError( E :EDBEngineError ); var errcode_keyviol:tdberror; begin case E.Errors[0].SubCode of ERRCODE_KEYVIOL: // Primary Key, Unique Index //11111111111 ShowError( strKeyViol(E.Errors[1].Message) ); else{case} Application.ShowException(E); end;{case} end;
//处理本地发现的错误 procedure tmyclass.DatabaseError( E :EDatabaseError ); begin if Pos(’must have a value’, E.Message)<>0 then ShowError(’”’ + strGetToken( E.Message, ’’’’ ) + ’”不能为空’ ) else if Pos(’ not a valid float’,E.Message)<>0 then begin ShowErr or(’您输入的数字不合法’) end else Application.ShowException(E); end;
function Twyclass.strKeyViol( str: string ): string; var strE: string; begin {$IFDEF DBMS_SQL65} strE := strGetToken( str, ’’’’ ); Result := ’”’ + strTranEngConstraint(strE) + ’”不能重复’; {$ELSE IFDEF DBMS_INTER5} strE := strGetToken( str, ’”’ ); Result := ’”’ + strTranEngConstraint(strE) + ’”不能重复’; {$ENDIF} end;
function tmyclass.strReqdErr( str: string ): string; var strE: string; begin {$IFDEF DBMS_SQL65} &nb sp; strE := strGetToken( str, ’’’’ ); Result := ’”’ + strTranEngConstraint(strE) + ’”不能为空’; {$ELSE IFDEF DBMS_INTER5} strE := strGetToken( str, ’”’ ); Result := ’”’ + strTranEngConstraint(strE) + ’”不能为空’; {$ENDIF} end;
function Tmyclass.strForeignKeyErr( str: string ): string; var strE: string; begin {$IFDEF DBMS_SQL65} strE := strGetToken( str, ’’’’ ); if Pos(’DELETE’, str) > 0 then Result := ’”’ + strTranEngConstraint(strE) + ’”已经被引用,不能删除’ el se if Pos(’INSERT’, str) > 0 then Result := ’引用”’ + strTranEngConstraint(strE) + ’”不存在,不能增加’ else //UPDATE, for master and detail Result := ’”’ + strTranEngConstraint(strE) + ’”已经使用,不能修改’ {$ELSE IFDEF DBMS_INTER5} strE := strGetToken( str, ’”’ ); Result := ’”’ + strTranEngConstraint(strE) + ’”已经被引用,或者不存在’; {$ENDIF} end;
function Twyclass.strDetailRecordsExist( str: string ): string; begin {$IFDEF DBMS_SQL65} //Not support {$ELSE IFDEF DBMS_INTER5} //Not support {$ ENDIF} end;
function Tmyclass.strTranEngConstraint( str: string ): string; var i: integer; isFound: boolean; begin isFound := False; for i := 0 to maxConstraint do if a2strConstraint[i,conE] = str then begin isFound := True; Break; end;
if isFound then Result := a2strConstraint[i,conC] else Result := ’未知错误(’ + str + ’)’; end;