Announcement

Collapse
No announcement yet.

Alias-Problem Delphi 4 -> Delphi 5

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

  • Alias-Problem Delphi 4 -> Delphi 5

    Hallo!

    Ich habe folgendes Problem:
    Ich habe ein Projekt, welches ich unter Delphi 4.0 Servicepack 3 erstellt habe und das auch in dieser Version verwendet wird. Nun habe ich das Projekt unter Delphi 5 kompiliert, was auch ohne Probleme verlief. Wird das Programm nun gestartet und anschließend beendet, so erscheint beim Beenden der Anwendung die Fehlermeldung " Doppelter Datenbankname 'xyz' ".
    Zum Programm:
    Ich erzeuge zur Laufzeit ein Alias unter Zuhilfenahme einer Database-Komponente.
    Database1.DatabaseName := Konfig.Alias;
    Database1.DriverName := 'STANDARD';
    Database1.Params.Clear;
    Database1.Params.Add('Path='+Konfig.PfadDB);
    In einem zweiten Datenmodul wird eine weitere Database-Komponente (Database2) zusammen mit einer Komponente des Typs TSession verwendet (für einen parallelen Thread). Wird die Database-Komponente (Database2) entfernt, so wird angezeigt, daß das Alias 'xyz' nicht vorhanden ist.
    Die beiden Databasekompnenten richtet das gleiche Alias ein.
    Frage:
    Ist dieses Vorgehen grundsätzlich falsch? Warum macht Delphi 4 und Delphi 5 hier
    einen Unterschied.

    Nur wenn für den Thread ein Alias mit einen anderen Namen eingerichtet wird
    tritt kein Fehler auf.
    Vielleicht hat jemand eine Erklärung.

    P.S.: Übrigens habe ich eine weitere Anwendung, welche auf gleicher Weise programmiert ist, nur tritt hier der Fehler nicht auf. Unterschiede? Das zweite Programm ist umfangreicher.
    Ich habe derzeit Urlaub und werde auf Rückfragen verzögert antworten.

    Vielen Dank für alle Tips!

    mfg Thomas

  • #2
    Hallo,

    der Beschreibung nach lässt sich der Fehler jederzeit reproduzieren. Also ist es das Beste, beim Compilieren (mit aktivierten Debug-Anweisungen) auch die VCL-Sourcen in den Suchpfad aufzunehmen und im Debugger nachzuschauen, an exakt welcher Stelle der Fehler innerhalb der VCL ausgelöst wird.

    Generell sollte niemals ein doppelter Datenbankname (TDatabase.DatabaseName) verwendet werden - wobei die Eigenschaft DatabaseName jedoch <b>nichts</b> mit dem Alias-Namen der BDE zu tun hat. Normalerweise wird TDatabase folgendermassen konfiguriert: <br>
    1. TDatabase-Instanz im Datenmodul einfügen <br>
    2. Doppelklick auf das Icon - der Dialog <i>Datenbanken</i> wird angezeigt. <br>
    3. Aus der Liste <b>Aliasname</b> wird der BDE-Aliasname ausgewählt. <br>
    4. Über den Button <b>Vorgaben</b> werden die aktuellen Alias-Einstellungen übernommen, wobei man nun im Einzelfall entscheiden kann, welche Werte überschrieben werden sollen. Soll die Alias-Konfiguration 1:1 übernommen werden, entfällt dieser Schritt. <br>
    5. Im Eingabefeld <b>Name</b> erhält diese Datenbankverbindung einen eindeutigen Namen.<br>
    6. Der Dialog wird über OK geschlossen.

    Alle anderen Datenbankkomponenten verwenden <b>exakt</b> den DatabaseNamen, der im Schritt 5 definiert wurde. Man muss den Datenbanknamen und den Sessionnamen immer im globalen Kontext der BDE betrachten - die BDE hat keine Ahnung davon, das die Instanzen auf verschiedene Formulare/Datenmodule aufgeteilt sind. Man kann zwei TDatabase-Instanzen anlegen, die beide zwar den gleichen BDE-Aliasnamen verwenden, aber trotzdem eigene (eindeutige) DatabaseName-Bezeichnungen verwenden.

    Für Sonderfälle sieht TDatabase die Eigenschaft <b>HandleShared</b> und TSession die Eigenschaft <b>AutoSessionName</b> vor

    Comment


    • #3
      Vielen Dank für die schnell Hilfe!
      Ich lege mit Hilfe der Datenbank ein temporäres Alias (wie in Ihrem Buch Delphi 2 Datenbankentwicklung beschrieben) an.
      Es liegt also nicht an der Einrichtung der Database-Komponente.
      Ich habe nun die Eigenschaft HandleShared bei beiden Database-Komponenten auf true gesetzt. Dann tritt der Fehler nicht mehr
      auf.
      Frage: Darf man die Eigenschaft auf true setzen, wenn man mit mehreren Threads (und mehrere TSession-Komponenten) auf
      die gleiche Datenbank zugreift?

      Noch einmal Danke für die Hilfe.

      mfg
      Thomas Sparenber

      Comment


      • #4
        Hallo,

        in dem konkreten Fall (Treiber STANDARD = Paradox-Datenbank) würde ich sagen: Ja (habe ich aber noch nie ausprobiert). Da Paradox nicht mit Transaktionen umgehen kann, kann hier auch kein "Unfall" bei einem Commit/Rollback passieren. Bei einer SQL-Datenbank würde ich jedoch immer eindeutige DatabaseName-Bezeichner verwenden, da hier die Transaktionen je Session (separate Datenbankverbindung) getrennt gesteuert werden können

        Comment

        Working...
        X