Announcement

Collapse
No announcement yet.

Objekte aus ActiveX-ASP-Objekt zurückgeben

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

  • Objekte aus ActiveX-ASP-Objekt zurückgeben

    Hallo there!

    Besteht die Möglichkeit ein ganzes Objekt aus einer ActiveX-DLL die von einem ASP-Skrip verwendet wird, so zurück zu geben, dass ich in der ASP-Site dann dieses Objekt weiter verwenden kann.
    Konkretes Beispiel:
    Ich möchte durch eine Methode in der ActiveX-DLL eine ADOConnection öffnen, mir die zurückgeben lassen und dann in eine andere Methode in der z.B. ein ADORecordset geöffnet werden soll diese Connection als Übergabeparameter mit hinein geben.

    Oder, anderes Beispiel, ich möchte mir ein komplettes, gefülltes Recordset aus meiner ActiveX-DLL zurück geben lassen.

    Besteht die Möglichkeit das ich diese beiden Beispiele so zu realisieren?
    Wenn ja, wie? Wie müssen die Schnittstellen definiert sein? Wie sind die Objekte zu erzeugen?

    Vielen Dank für Eure Hilfe,

    Markus

  • #2
    Hallo,

    ja - das ist möglich. Allerdings ist es nicht sinnvoll, eine Instanz des Connection-Objekts auf diese Art und Weise zu verwenden. Zum einen ist ADO für den automatischen Datenbankverbindungs-Pool zuständig und zum anderen handelt man sich immer dann Ärger ein, wenn dieser Interface-Zeiger auf das Connection-Objekt in einem anderen Thread (Apartment) verwendet werden soll. Und da der IIS einen Thread-Pool von 10 Arbeitsthreads je CPU nutzt, würde ich auf das Wiederverwenden einer Connection-Instanz verzichten.

    Das Zurückliefern eines aktiven "lebenden" RecordSets aus dem ASP-Objekt an die ASP könnte so aussehen (ich habe das gerade mit Delphi 6 geschrieben, die explizite Typumwandlung der Interfacezeiger ist notwendig, weil die TLB-Importfunktion in Delphi 6 noch fehlerbehaftet ist und somit eine "falsche" _TLB.pas entsteht).

    Damit das ASP-Objekt eine "lebende" Datenmenge zum Aufrufer zurückliefern kann, sind 2 Bedingungen notwendig: <br>
    1. <b>adLockBatchOptimistic</b> <br>
    2. Connection muss explizit vom RecordSet getrennt werden

    <b>ASP-Objekt implementiert Interface-Methode</b>
    <pre>
    resourcestring
    cCS = 'Provider=SQLOLEDB.1;Password=;Persist Security Info=True;' +
    'User ID=sa;Initial Catalog=DE2001;Data Source=(local)';

    function TASPObjRSObj.GetRS(SELECT: OleVariant): OleVariant;
    var
    aConnection : _Connection;
    aRecordSet : _RecordSet;
    begin
    aConnection := CoConnection.Create as _Connection;
    aConnection.CursorLocation := adUseClient;
    aConnection.Open(cCS, '', '', adOpenForwardOnly);
    try
    aRecordSet := CoRecordSet.Create as _RecordSet;
    try
    aRecordSet.CursorLocation := adUseClient;
    aRecordSet.Open(SELECT, aConnection, adOpenStatic,
    adLockBatchOptimistic, 0);
    Result := aRecordSet;
    aRecordSet._Set_ActiveConnection(nil);
    finally
    aRecordSet := nil;
    end;
    finally
    aConnection.Close;
    end;
    end;
    </pre>
    <b>Active Server Page holt sich das RecordSet vom Objekt ab</b>
    <pre>
    ...
    <%
    Dim aRS

    Set DelphiASPObj = Server.CreateObject("ASPObjRS.ASPObjRSObj")
    Set aRS = DelphiASPObj.GetRS("select CustID, CustName from Customer")
    WHILE NOT aRS.EOF
    Response.Write aRS(1) & "< br >"
    ' nächster Datensatz in der Ergebnismenge
    aRS.MoveNext
    WEND
    Set aRS = Nothing
    %>
    ...
    </pre>
    Wird die ASP aufgerufen, so zeigt sie alle Kundennamen in einer eigenen Zeile an

    Comment

    Working...
    X