Announcement

Collapse
No announcement yet.

EDBEngineError und wie weiter???

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • EDBEngineError und wie weiter???

    Mit folgendem Try Execpt Teil will ich mögliche Fehler beim öffnen bzw. activieren einer Tabelle abfangen.

    try <br>
    (Components[i] As TTable).Active := True; <br>
    except <br>
    On E : EDBEngineError do <br>
    Begin <br>
    For ExceptCount := 0 to E.ErrorCount - 1 do <br>
    begin <br>
    // (EDBEngineError(E).Errors[ExceptCount].Message); <br>
    Case e.Errors[ExceptCount].ErrorCode of <br>
    // hier Behandlung möglicher Errorcodes <br>

    end; <br>
    end; <br>
    end; <br>
    end; // Ende Try Except <br>
    end; // Ende If Begin <br>
    <br>
    Dies funktioniert soweit auch. Leider habe ich bislang noch nichts gefunden wo die einzelnen Errorcodes aufgelister werden. Der Versuch eine Tabelle zu öffnen die nicht in dem angegebenen Verzeichnis liegt für z. B. zu dem Errorcode 10024. Also könnte ich in der Case Anweisung die 10024 behandeln. Was ist aber mit anderen Erorrcodes??? Muß ich sämtliche Fehler provozieren um den Errorcode zu erhalten und diesen dann zu behandeln?

    In der Hilfe zu EDBEngineError stößt man dann auch irgendwann auf TDBError welcher in seiner Eigenschaft Errorcode (Bsp. 10024) ein hohes Byte (Category) und ein niedriges Byte (SubCode) enthält. Diese Werte sollen laut der Hilfe in der BDE.INT wiedergefunden werden.

    Wenn der Ansatz mit dem hohen und dem niedrigen Byte richtig sein sollte, wäre ich Dankbar wie ich diese denn dann auflöse, um in der BDE.INT zu suchen.

  • #2
    Hallo,

    man hat an dieser Stelle 2 Möglichkeiten.

    1. Allgemeine BDE-Fehlernummern prüfen:
    <pre>
    procedure TFormMain.TableKeyViolPostError(DataSet: TDataSet;
    E: EDatabaseError; var Action: TDataAction);
    begin
    if E is EDBEngineError then
    with E as EDBEngineError do
    begin
    if Errors[0].ErrorCode = DBIERR_KEYVIOL then
    begin
    ShowMessage('Doppelter Wert im Schlüsselfeld');
    Action := daAbort;
    DataSet.Cancel
    end
    end
    end;
    </pre>
    In diesem Fall werden die Konstanten aus BDE.INT verwendet.

    2. Native Fehlernummer der Datenbank prüfen (diese Fehlernummern stehen in der Dokumentation der verwendeten Datenbank):
    <pre>
    function GetSQLCODE(E: Exception): Integer;
    var
    iIdx : Integer;
    begin
    Result := -1;
    if E is EDBEngineError then
    with EDBEngineError(E) do
    for iIdx := 0 to ErrorCount - 1 do
    if Errors[iIdx].NativeError <> 0 then
    begin
    Result := Errors[iIdx].NativeError;
    Exit;
    end;
    end;
    </pre>
    Aufrufbeispiel:
    <pre>
    ...
    try
    xxx
    except
    Database1.Rollback;
    if GetSQLCODE(Exception(ExceptObject)) = -913 then
    MessageDlg('Sorry - leider war ein anderer Benutzer schneller.',
    mtError, [mbOk], 0)
    else
    Raise;
    end;
    </pre&gt

    Comment


    • #3
      Vielen Dank Herr Kosch. Dank Ihrer Ansatzes war es mir möglich mit
      <p>
      <Pre>
      IntToHex(E.Errors[ExceptCount].Category,2);
      IntToHex(E.Errors[ExceptCount].SubCode,2);
      </Pre>

      die Kategorie und den Subcode aud EDBEngineError als Intergerwert heraus zu bekommen. Die in einen Hexwert umgeweandelt und man kann prima in der BDE.INT nachschlagen was den Fehler verursacht

      Comment

      Working...
      X