我在Adoquery的PostError中寫如下代碼時提示Invalid class typecast錯誤,要怎麼解決.
if (E as EDBEngineError).Errors[0].Errorcode=eKeyViol then我在前面已經定義:
Const
  eKeyViol=9729;我看了很多例子都是這樣的,我運行總是錯誤.

解决方案 »

  1.   

    不错,EDBEngineError是在DBTables单元定义的:EDBEngineError is the exception class for Borland Database Engine errors.UnitDBTables//单元名DescriptionEDBEngineError is raised whenever a BDE error occurs. Its Errors property contains TDBError objects.When EDBEngineError exceptions are raised at design time, they appear in a special dialog (TDbEngineErrorDlg) that displays the complete stack of BDE errors. At runtime, unhandled EDBEngineError exceptions generate the same message box as other exceptions.
      

  2.   

    不是这个原因,如果没有引用DBTables,那么在程序的编译阶段就会出错,而我的这个错误是在运行期间出现的.
    (E as EDBEngineError).Errors[0].Errorcode 应该是返回word类型.
    怎么会提示类型方面的错误.
      

  3.   

    要取得错误的原生码,那么我们必须从EDBEngineError这个例外对象中取得。但是由ADO产生例外对象并不是从EDBEngineError继承下来的。
    ADOExpress组件在发生错误时产生的例外对象并不像BDE/IDAPI一样是EDBEngineError对象,因此我们无法像BDE/IDAPI的应用程序一样从EDBEngineError取得原生的错误代码。如果你检查封装ADOExpress组件的ADODB程序单元,也会发现ADO的错误是由EADOError类别封装的。
    { Errors }
    EADOError = class(EDatabaseError );请参考下面:
    procedure TForm4.ADODataSet1PostError(DataSet: TDataSet; E:
    EDatabaseError; var Action: TDataAction);
    var
    adoErrors : Errors;
    adoError : Error;
    iCount : Integer;
    begin
    / /开始处理ADO的Errors对象
    adoErrors := ADOConnection1.Errors;
    for iCount := 0 to adoErrors.Count - 1 do // Iterate
    begin
    adoError := adoErrors.Item[iCount];
    lbADOErrors.Items.Add('Error Number : ' + IntToStr(adoError.Number));
    lbADOErrors.Items.Add('Error Source : ' + adoError.Source);
    lbADOErrors.Items.Add('Error Description : ' + adoError.Description);
    lbADOErrors.Items.Add('Error HelpFile : ' + adoError.HelpFile);
    lbADOErrors.Items.Add('Error SQLState : ' + adoError.SQLState);
    lbADOErrors.Items.Add('Error NativeError : ' +
    IntToStr(adoError.NativeError));
    end ; // for
    end ;