Announcement

Collapse
No announcement yet.

IB 6.0.2 - Shuts down und Problem

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

  • IB 6.0.2 - Shuts down und Problem

    Hallo Freunde,
    wer kann bei folgenden 2 Problemen helfen ?<BR>
    1. Eine Datenbank-Anwendung (Delphi5) läuft auf dem Client. Wenn ich nun auf dem Server mit der IB6.0.2-Datenbank mittels gfix -c all ..... und anschließendem gfix -shut -force 3 .... diese zwangsweise schließe, kann ein Client anschließend diese Datenbank nicht mehr öffnen. Warum nicht ???<BR>
    2. Wird die Datenbank auf dem Server zwangsweise geschlossen, erhält der Client, der gerade einen offenen Zugriff auf die Datenbank hat, logischer-weise eine saftige Fehlermeldung und die Anwendung ist nur mit Gewalt zu beenden. Wie kann ich diese Fehlermeldung im Programm (Delphi5+ IBX5.04)
    abfangen und es dann ordentlich beenden ?<BR>

    Wer kann helfen ? Was meint Herr Kosch ?<BR>
    Danke !<BR>
    Manfred<BR>

  • #2
    Hallo Manfred,<br><br>
    ich bin zwar nicht Andreas ;-), aber ich werd Dir kurz versuchen eine Antwort zu geben.<br><br>
    ad 1): Mit der Verwendung von gfix -shut -force 3 wie in Punkt 1) wird die Datenbank "heruntergefahren", d.h. in einen Zustand gebracht, wo sich nur mehr SYSDBA mit der Datenbank verbinden kann, um z.B. die Datenbank (mit gfix.exe) zu validieren, da für die Validierung ein Exklusivzugriff notwendig ist. Für das Shutdown <b>-shut</b> gibt es drei unterschiedliche Modi, wobei <b>-force</b> die Datenbank unabhängig von aktiven Transaktionen und Prozessen in obigem Bsp. in 3 Sekunden herunterfährt. Die weiteren Modi sind <b>-attach N</b> (das Shutdown erfolgt nur dann, wenn nach N Sekunden keine weiteren Verbindungen offen sind) und <b>-tran N</b> (das Stutdown erfolgt nur dann, wenn nach N Sekunden keine weiteren Transaktionen mehr aktiv sind).<br><br>
    ad 2): Hier kann ich Dir Ad-Hoc keine Lösung anbieten, weil ich den IB-Error Code nicht kenne, der in diesem Fall von der Client-Anwendung abgefangen werden müsste. Sofern man ein zentrales Exception-Handling in der eigen Anwendungen besitzt und den IB-Error Code kennt, könnte man in dieser Exception-Behandlung die notwendigen Aktionen treffen.<br><br>
    Gruss,<br>
    Thoma
    Thomas Steinmaurer

    Firebird Foundation Committee Member
    Upscene Productions - Database Tools for Developers
    Mein Blog

    Comment


    • #3
      Hallo Thomas,

      in unserem Netz werden in der Werkstatt ztw. die Geräte von Netz getrennt (natürlich aus Versehen ),

      Kann ich mit einem globalen Exception-Handling als IBException alle Interbase - Fehler abfangen oder nur mit EDatabaseerror ?

      Wenn keiner im Clientprogramm etwas schreibt, handelt es sich ja um einen Connect - Fehler. Kannst Du mir sagen, wie man den an günstigsten abfängt ?

      Vielleicht hilft das ja auch MAnfred bei seinem Problem.

      Gruß Günte

      Comment


      • #4
        Hallo,<br><br>
        eine Lösung ist hier abhängig von den verwendeten Zugriffskomponenten (BDE, IBX, IBO, ...). Im Prinzip geht es darum die Exception-Klasse im globalen Exception-Handler abzufangen, die alle notwendigen ErrorCodes für die InterBase Exception anbietet, um dann den entsprechenden Code auszuwerten und gegenfalls eine Aktion (z.B. das Beenden des Programms) durchzuführen. Um einen globalen (d.h. es werden nicht nur Datenbankfehler, sondern alle Exception in diesem Handler abgearbeitet) Exception-Handler zu realisieren, ist folgendes notwendig.<br><br>
        Im Mainform der Anwendung:<br><br>
        <i>TfmMainform = class(TForm)<br>
        ...<br>
        private<br>
        ...<br>
        procedure ShowErrorDialog(Sender: TObject; E: Exception);<br>
        ...<br>
        end;</i><br><br>
        Im OnFormCreate wird dann der globale OnException-Handler der Anwendung überschrieben.<br><br>
        <i>procedure TfmMainForm.FormCreate(Sender: TObject);<br>
        ...<br>
        begin<br>
        ...<br>
        Application.OnException := ShowErrorDialog;<br>
        ...<br>
        end;</i><br><br>
        Die Struktur der ShowErrorDialog(...) Methode könnte dann wie folgt aussehen (im Falle von IBObjects unter Verwendung der Exception-Klasse EIB_ISCError; bei IBX und der BDE wird man hier eine andere Exception-Klasse verwenden müssen):<br><br>
        <i>procedure TfmMainForm.ShowErrorDialog(Sender: TObject; E: Exception);<br>
        begin<br>
        if E is EIB_ISCError then begin<br>
        ...eigene Auswertung der IB Fehlercodes<br>
        end<br>
        end;</i><br><br>
        Im Falle von IBObjects geht es allerdings auch einfacher, weil eine TIB_Connection (das Objekt zur Verbindung zu einer Datenbank) ein OnError Ereignis anbietet, das für ein zentrales DB-Fehlermanagement verwendet werden kann. Siehe auch http://www.ibobjects.com/docs/ti_ErrorHandling.pdf<br><br>
        Gruss,<br>
        Thoma
        Thomas Steinmaurer

        Firebird Foundation Committee Member
        Upscene Productions - Database Tools for Developers
        Mein Blog

        Comment

        Working...
        X