Announcement

Collapse
No announcement yet.

ADO Recordset in COM+ Delphi8

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

  • ADO Recordset in COM+ Delphi8

    Hallo Herr Kosch,
    ich versuche gerade einen ADO-Recordset in D7 aus einem in D8 geschriebenen COM+ Object einzulesen. Folgender Quellcode in D8:
    <PRE>function D8AgroSenseEnterpriseObject.COMGetSchlagdaten(strB _NR,strWJ:string):ADODB.RecordSet;
    var aCon : ADODB.Connection;
    aRS : ADODB.Recordset;
    aError : ASLogError.TASErrorLog;
    iResult:Integer;
    begin
    iResult:=0;
    try
    aCon:= ADODB.ConnectionClass.Create;
    aCon.CursorLocation:= CursorLocationEnum.adUseClient;
    try
    aCon.Open(sCSADODB,'','',0);
    aRS:= ADODB.RecordClass.Create;
    aRS.CursorLocation:=CursorLocationEnum.adUseClient Batch;
    aRS.Open('SELECT * FROM SCHLAG WHERE (B_NR='''+strB_NR+''') AND (WJ='''+strWJ+''') ',aCon,
    CursorTypeEnum.adOpenStatic,LockTypeEnum.adLockOpt imistic,0);
    Result:=aRs;
    aRS.ActiveConnection:=Nil;
    iResult := 1;

    except
    on E: Exception do
    begin
    aError.WriteError(E.Message);
    ContextUtil.SetAbort;
    end;
    end;
    finally
    aCon.Close;
    ContextUtil.SetComplete;
    end;
    </PRE>

    Der D7 Client:
    <PRE>procedure TForm1.Button3Click(Sender: TObject);
    var aSrv 8AgroSenseEnterpriseObject;
    aObj :IAgroSenseEnterpriseObject;
    aRS :_RecordSet;
    iRes :Integer;
    iStart,iStop:Integer;
    begin
    iStart:=GetTickCount;
    aSrv:= CoD8AgroSenseEnterpriseObject.CreateRemote(Edit1.T ext);
    aObj:= aSrv as IAgroSenseEnterpriseObject;
    aRS:=aObj.COMGetSchlagdaten('1000','03');
    ADODataSetSchlag.Recordset:= aRS as ADOInt._Recordset;
    ADODataSetSchlag.Active:=true;
    DBGrid1.DataSource:=DMSchlagquelle;
    iStop:=GetTickCount;
    Statusbar1.SimpleText:='Daten erfolgreich geladen..'+ Format('Zeitbedarf %d',[iStop-iStart]);
    aSrv:=Nil;
    aObj:=Nil;
    end;
    </PRE>

    Beim Aufruf erscheint folgende Fehlermeldung am Client: <I>"Der Vorgang ist für ein geschlossenes Objekt nicht zugelassen"</I>
    Ich haben einen Errorlog für die Ereignisanzeige geschrieben und sehe darin dann die Fehlermeldungen des COM+ Objekts. Je nachdem ob ich als Servertyp "Local" oder Remote einstelle kommen zwei unterschiedliche Meldungen. Zum einen bei "Remote":<I>Error 6420: The 'discovery' process for the Advantage Database Server failed. Unable to connect to the Advantage Database Server. axServerConnect AdsConnect</I>

    und bei "Local":<I>Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    </I> beim Client erscheint daraufhin folgende Meldung:<I>Fehlende Connection oder Connectionstring</I>

    Was mache ich falsch? In C# funktioniert das Beispiel mit ähnlichen Funktionen. (und dem selben ADO Connection String)

    Vielen Dank im Voraus...

  • #2
    Hallo,

    &gt;..Fehlermeldung am Client: "Der Vorgang ist für ein geschlossenes Objekt nicht zugelassen"

    diese Fehlermeldung deutet darauf hin, dass auf der Server-Seite die Abkopplung der Connection-Instanz vom "lebenden" Recordset nicht erfolgreich war und somit das Recordset beim Transport zum Client geschlossen wurde.

    Was passiert, wenn die Reihenfolge modifiziert wird?
    <pre>
    ...
    aRS.ActiveConnection := Nil;
    Marshal.ReleaseComObject(aCon);
    Result := aRs;
    ...
    </pre>

    &gt;In C# funktioniert das Beispiel ..

    Delphi 8 lebt zur Zeit noch zu sehr in der alten Welt ("... ein Sourcecode für 3 Plattformen..."), so dass sich nicht alle C#-Beispiele erfolgreich mit D8 nachbauen lassen. Um zu prüfen, ob diese Anomalien auch für dieses Problem verantwortlich sind, würde ich die Delphi 8-Fassung mit der C#-Fassung über ILDASM auf der MSIL-Ebene vergleichen und dort nach Auffälligkeiten suchen

    Comment


    • #3
      Hallo,

      &gt;Was mache ich falsch?

      unter welchem Benutzerkonto wird die COM+ Anwendung ausgeführt? Eventuell hat der verwendete Provider eine Macke, die beim Aufruf durch den interaktiv angemeldeten Benutzer nicht auftritt

      Comment

      Working...
      X