Announcement

Collapse
No announcement yet.

Com-Objekt-Funktion mit Rückgabetyp TDatabase

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

  • Com-Objekt-Funktion mit Rückgabetyp TDatabase

    Hallo<br><br>
    ich habe ein ComObjekt mit Delphi5 erzeugt in dem es eine Funktion gibt,<br> die ein Rückgabewert vom Typ TDatabase haben soll.<br>
    <br>
    Kann man das so machen?<br><br>
    Meine Idee war einen Pointer auf ein TDatabase zurückzugeben<br>
    allerdings bin ich mit Pointern auf Kriegsfuss<br><br>
    Kann mir jmd. helfen?<br><br>
    Danke Thomas Barghusen<br>

  • #2
    Hallo,

    &gt;Kann man das so machen?

    Prinzipiell schon, aber nicht mit Delphi. Borland nutzt den von Microsoft für Visual Basic 3 vorgesehen Weg über den Typbibliothek-Marshaller (Standard Marshaller) und verzichtet somit auf die unter C/C++ üblichen eigenen Proxy-/Stub-DLLs. Somit wird das für uns zwar einfach (da wir keine eigenen DLLs vorsehen müssen), aber das hat zur Folge, dass wird nur die Automation-kompatiblen Datentypen nutzen dürfen. Auch der einzige Ausweg, über <i>User Defined Types</i> (UDF) via <b>IRecordInfo</b> einen eigenen Typ zu deklarieren, hilft im Fall eines Objekts nicht weiter.

    Es gibt daher nur den Weg, die Objektinstanz von TDatabase zu serialisieren und beim Client wiederzubeleben: <b>ObjectBinaryToText</b> wandelt die Objektinstanz in eine Zeichenkette um, die als <b>WideString</b> transportiert wird, um daraus über <b>ObjectTextToBinary</b> eine Objektinstanz zu machen. Allerdings wird das Ergebnis nicht den Erwartungen entsprechen, so dass das Ganze keinen Sinn macht.

    Wenn mit ADO (ADO Express bzw. dbGo) gearbeitet wird, gelten diese Einschränkungen nicht. Denn in diesem Fall hat Microsoft die Fähigkeit, eine lebende Recordset-Objektinstanz über Rechnergrenzen hinweg zu transportieren, fest in das Betriebssystem eingebaut

    Comment


    • #3
      Vielen Dank ersteinmal für die Info Herr Kosch.<br><br>
      Ich habe eine ISAPI-DLL geschrieben die bei jedem Aufruf eine<br>Datenbankverbindung herstellt, damit das nicht zu lange dauert,<br>wollte ich in einer 3. Schicht (COM-Server evtl.?) die <br>Datenbankverbindung stehen lassen.<br><br>
      Gibts da evtl. bessere Gedankenansätze??<br><br>
      Dank

      Comment


      • #4
        Hallo,

        &gt;Gibts da evtl. bessere Gedankenansätze??

        ja - denn es gibt bereits einen automatischen Datenbankverbindungs-Pool des Betriebssystems, wenn die Anwendung im MTS (NT 4) oder COM+ (Windows 2000/XP/.NET) läuft. Voraussetzung ist, dass der genutzte Datenbanktreiber gleichzeit auch die Funktionen eines <i>Resource Dispensers</i> implementiert. Im Fall von ADO (OLE DB Provider) bzw. ADO.NET ist das in jedem Fall gegeben, die BDE ist offziell zwar auch ein Resource Dispenser, aber an dieser Stelle seit Jahren nicht ganz fehlerfrei.

        Die höchste Performance wird erreicht, wenn <br>
        a) die ISAPI durch ein ASP-Objekt ersetzt wird, oder <br>
        b) die ISAPI für den Datenbankzugriff ein COM+ Objekt aufruft<br>
        In beiden Fällen erfolgt der Datenzugriff über MTS/COM+, so dass automatisch der Datenbankverbindungs-Pool ohne eigenes Zutun aktiv ist. Die Objekte können bei jedem Aufrufe die Datenbankverbindung öffnen/trennen, ohne dass dies zu einer messbaren zeitlichen Verzögerung führt

        Comment

        Working...
        X