Announcement

Collapse
No announcement yet.

ASP COM MS-SQL

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

  • ASP COM MS-SQL

    Hallo,
    ich habe ein COM-Objekt erstellt, das recht umfangreiche Analysen auf einer MS-SQL-DB durchführt und eine Recordset zurückliefert. In einem VBS-Script getestet, gibt es keine Probleme auch in einer Schleife aufgerufen, gibt es keine Probleme.

    Allerdings in ASP eingebunden auf dem IIS kann diese COM nicht mehrmals gleichzeitig aufgerufen werden.

    Die Fehlermeldung in ASP lautet :

    "Der Vorgang kann nicht bearbeitet werden, während ein asynchroner Befehl ausgeführt wird."

    Das COM wurde mit Delphi5 und den ADO-Komponenten erstellt.

    Kennt jemand das Problem und kann mir einen Tip geben?

    Danke

  • #2
    Hallo,

    welches Threading-Modell nutzt das COM-Objekt und ist es als ASP-Objekt (TASPMTSObject) ausgelegt? Wo wird in der ASP-Anwendung über welchen Weg eine Instanz dieses COM-Objekts erzeugt

    Comment


    • #3
      Single Threading

      TASPMTSObject wird genutzt

      Die Instanz wird folgendermassen erzeugt:
      set EPTM = Server.CreateObject ("EPTMCOM.EPTM")

      Hift das weiter ?

      Dank

      Comment


      • #4
        Hallo,

        wurde innerhalb des COM-Objekts beim ADO-Zugriff auf die Datenbank ein asynchroner Modus (Bsp: TADODataSet-Eigenschaft ExecuteOptions = eoAsyncFetchNonBlocking) aktiviert?

        Tritt das Problem bei dem folgenden Beispiel ebenfalls auf?
        <pre>
        <font color="#003399"><i>{ ************************************************** **************
        Autor : Andreas Kosch
        Compiler : Delphi 6.0 Enterprise
        Betriebssystem : Windows 2000 SP2
        Erstellt am : 23.07.2001
        Beschreibung : ASP-Objekt liefert &quot;lebendes&quot; RecordSet an
        eine Active Server Page zurück.
        <br>
        Aufrufbeispiel:
        ---------------
        &lt;HTML&gt;
        &lt;BODY&gt;
        &lt;TITLE&gt; Test von Delphi ASP &lt;/TITLE&gt;
        &lt;CENTER&gt;
        &lt;H3&gt; Sie sollten das Ergebnis Ihrer Delphi Active Server-Methode unten sehen&lt;/H3&gt;
        &lt;/CENTER&gt;
        &lt;HR&gt;
        &lt;%
        Dim aRS
        Set DelphiASPObj = Server.CreateObject(&quot;ASPObjRS.ASPObjRSObj&quo t
        Set aRS = DelphiASPObj.GetRS(&quot;select CustID, CustName from Customer&quot
        WHILE NOT aRS.EOF
        Response.Write aRS(1) &amp; &quot;&lt;br&gt;&quot;
        aRS.MoveNext
        WEND
        Set aRS = Nothing
        %&gt;
        &lt;HR&gt;
        &lt;/BODY&gt;
        &lt;/HTML&gt;
        ************************************************** ************** }</i></font>
        <b>unit</b> ASPObjRS_Impl;
        <br>
        <font color="#003399"><i>{$WARN SYMBOL_PLATFORM OFF}</i></font>
        <br>
        <b>interface</b>
        <br>
        <b>uses</b>
        ComObj, ActiveX, AspTlb, ASPObjRS_TLB, StdVcl;
        <br>
        <b>type</b>
        TASPObjRSObj = <b>class</b>(TASPMTSObject, IASPObjRSObj)
        <b>protected</b>
        <b>function</b> GetRS(SELECT: OleVariant): OleVariant; <b>safecall</b>;
        <b>function</b> Version: OleVariant; <b>safecall</b>;
        <b>end</b>;
        <br>
        <b>implementation</b>
        <br>
        <b>uses</b> ComServ, ADODB_TLB;
        <br>
        <b>resourcestring</b>
        cCS = <font color="#9933CC">'Provider=SQLOLEDB.1;Password=;Per sist Security Info=True;'</font> +
        <font color="#9933CC">'User ID=sa;Initial Catalog=DE2001;Data Source=(local)'</font>;
        <br>
        <b>function</b> TASPObjRSObj.GetRS(SELECT: OleVariant): OleVariant;
        <b>var</b>
        aConnection : _Connection;
        aRecordSet : _RecordSet;
        <b>begin</b>
        aConnection := CoConnection.Create <b>as</b> _Connection;
        aConnection.CursorLocation := adUseClient;
        aConnection.Open(cCS, <font color="#9933CC">''</font>, <font color="#9933CC">''</font>, adOpenForwardOnly);
        <b>try</b>
        aRecordSet := CoRecordSet.Create <b>as</b> _RecordSet;
        <b>try</b>
        aRecordSet.CursorLocation := adUseClient;
        aRecordSet.Open(SELECT, aConnection, adOpenStatic,
        adLockBatchOptimistic, 0);
        Result := aRecordSet;
        aRecordSet._Set_ActiveConnection(<b>nil</b>);
        <b>finally</b>
        aRecordSet := <b>nil</b>;
        <b>end</b>;
        <b>finally</b>
        aConnection.Close;
        <b>end</b>;
        <b>end</b>;
        <br>
        <b>function</b> TASPObjRSObj.Version: OleVariant;
        <b>begin</b>
        Result := 1;
        <b>end</b>;
        <br>
        <b>initialization</b>
        TAutoObjectFactory.Create(ComServer, TASPObjRSObj, Class_ASPObjRSObj,
        ciMultiInstance, tmApartment);
        <br>
        <b>end</b>.
        </pre&gt

        Comment


        • #5
          Hallo Herr Kosch,

          Kurze Rückfrage: soll eoAsyncFetchNonBlocking eingeschaltet sein, hier sind alle Executeoptions ausgeschaltet.

          Gru&#223

          Comment


          • #6
            Hallo,

            wenn eoAsyncFetchNonBlocking aktiviert wird, spaltet ADO automatisch einen eigenen Thread ab, um dort den langwierigen Ladevorgang auszuführen. Bei dem ASP-Objekt wäre ein derartiges Verhalten nicht zielführend ;-

            Comment


            • #7
              Hallo,

              TASPMTSObject spielt doch garkeine Rolle. Auf die Session und Applikation-Varablen will doch niemand zugreifen und der Fehler tritt auch noch auf, wenn man das Object normal deklariert.

              Gruss Uw

              Comment


              • #8
                Hallo,

                wie sieht die "Nutzfunktion" (ADO-Anbindung) im Detail aus

                Comment


                • #9
                  Hallo,

                  wir haben das Problem gefunden,

                  Man kann nicht in einer DB-Connection gleichzeitig in zwei Ergebnissmengen manövrieren.
                  d.h. bei einer Einzelanwendung ist es kein Problem, aber in einem COM-Object wird es zum Problem, wenn man es im Internet verwendet unter ASP verwendet.

                  Delphi8 hat übrigens dasselbe Problem wenn man es als Webservice verwendet.
                  Macht man für jede Ergebnissmenge eine eigenen Connection auf, funktioniert alles.

                  Ist das nun ein Bug oder nicht?

                  cia

                  Comment


                  • #10
                    Hallo,

                    &gt;..d.h. bei einer Einzelanwendung ist es kein Problem..

                    weil dort ADO automatisch hinter den Kulissen bei Bedarf eine zusätzliche Datenbankverbindung öffnet, wenn die originale Verbindung noch durch eine andere Aktion belegt ist (siehe <i>Leistungsanzeige</i> von Windows).

                    Generell gelten für zustandslose Anwendungen (ASP) die folgenden Regeln: <br>
                    1. In jeder aufgerufenen Interface-Methode des COM-Objekts wird die Datenbankverbindung über eine neue Connection-Instanz geöffnet. <br>
                    2. Vor dem Verlassen der Interface-Methode des COM-Objekts wird die Datenbankverbindung wieder geschlossen, die Connection-Instanz wird wieder zerstört.<br>
                    3. Da ADO (MDAC) einen automatischen Datenbankverbindungs-Pool nutzt, hat dieses ständigen "Öffnen" und "Schließen" keine Nachteile, da die Datenbank immer nur die ständig offenen Leitungen des Pools sieht.<br&gt

                    Comment


                    • #11
                      Hi,

                      is ja interessant, hätte man vorher wissen müssen ;-)

                      Da komme ich auch gleich zur Frage, woher bekommt man dieses aufschlussreiche Wissen?

                      Gruss Uw

                      Comment


                      • #12
                        Hallo,

                        &gt;...woher bekommt man dieses aufschlussreiche Wissen?

                        a) ADO allgemein: <i>http://www.software-support.biz/sus/sus_buch/psecom,id,21,nodeid,11,_language,de.html</i>

                        b) ADO und IIS: <i>http://www.software-support.biz/sus/sus_buch/psecom,id,4,nodeid,11,_language,de.html</i> (Kapitel 16 + 17)

                        c) oder im Original: MSDN Library DV

                        Comment

                        Working...
                        X