Announcement

Collapse
No announcement yet.

DCOM ADO Problem

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

  • DCOM ADO Problem

    Hallo Herr Kosch,
    habe ein kleines Problem mit meinem DCOM-Server. Eine Access Datentabelle heißt 'Current Status' (mit Leerzeichen!!) Diese kann und will ich nicht ändern da Sie aus einem Fremdprogramm stammt. Leider kann ich keine Select Anweisung mit diesem geteiltem Tabellennamen generieren ohne Fehlermeldung. Es hat funktioniert mit den ADO-Komponenten und der ADOTable Komponenete, wenn ich den Tabellennamen auswähle geht es auch mit diesem geteilten Namen. Da der DCOM-Server aber ohne Komponeneten arbeiten soll hätte ich gerne mal Ihren Rat. Die Sache mit einem _Command Objekt und cmdTable habe ich probiert, stecke aber schon wieder fest. Welche Parameter für Execute oder wie auf der Clientseite ein Command Result zu handlen ist ???
    <PRE>function TGrowSmartThinObj.CurrentStatusCD: _Command;
    var
    aConnection : _Connection;
    aCommand : _Command;
    begin
    try
    aConnection := CoConnection.Create as _Connection;
    aConnection.CursorLocation := adUseServer;//adUseClient;
    aConnection.Open(FConnStr, '', '', adOpenForwardOnly);
    try
    aCommand := CoCommand.Create as _Command;
    try
    aCommand.CommandType:=adCmdTable;
    aCommand.CommandText:='Current Status';
    ///???????????????????????????????????????????????
    aCommand.Execute(Emptyparam,EmptyParam,EmtyParam);

    Result := aCommand;
    aCommand._Set_ActiveConnection(nil);
    finally
    aCommand := nil;
    end;
    finally
    aConnection.Close;
    end;
    SetComplete;
    except
    SetAbort;
    raise
    end;
    end;</PRE>
    <B> Client:</B>
    <PRE>
    var aRSCurrentStatus: ADOInt._Command;
    begin
    if CheckBoxConnect.Checked then
    begin
    FSrv:=CoGrowSmartThinObj.CreateRemote(vIP);
    StatusBar1.Panels[0].Text:='Verbunden mit '+FSrv.ShowConnection;
    DM1.ADO_Pivot.Active:=false;
    aRSPivot := ADOInt._RecordSet(FSrv.PivotRS);
    with DM1.ADO_Pivot do
    begin
    RecordSet := aRSPivot;
    Active := True;
    end;
    //?????????????????????????????
    DM1.ADOCurrentStatus.Active:=false;
    aRSCurrentStatus := ADOInt._Command(FSrv.CurrentStatusCD);
    with DM1.ADOCurrentStatus do
    begin
    TableName := aRSCurrentStatus.CommandText;
    Active := True;
    end;
    //?????????????????????
    </PRE>
    Besten Dank im Voraus

  • #2
    Das ein Command als Table angesprochen werden kann, sieht ungewöhnlich aus. Beim "normalen" TAdoCommand geht das nämlich nicht. Ich kenne mich aber mit den nativen Zugriffen etc. auch nicht besonders gut aus. Um im SQL-Statement auf Felder mit Leerzeichen zuzugreifen, kannst Du sie in [] einfassen:<br>
    Select * From [Current Status];<br>
    Vielleicht kannst Du damit ja schon Dein Problem lösen.<p>
    Schöne Grüße, Mario Noac
    Schöne Grüße, Mario

    Comment


    • #3
      Hallo,

      den Hinweis mit den Klammern hat ja Mario bereits gegeben, daher beschränke ich mich auf das technische Drumherum:

      a) DCOM-Server liefert ein gefülltes Recordset zurück:

      <pre>

      <b>type</b>
      TADOServer = <b>class</b>(TAutoObject, IADOServer)
      <b>protected</b>
      <b>function</b> ReturnRS: OleVariant; <b>safecall</b>;
      <b>procedure</b> SubmitRS(RS: OleVariant; out Msg: WideString); <b>safecall</b>;
      <font color="#003399"><i>{ Protected-Deklarationen }</i></font>
      <b>end</b>;

      <b>implementation</b>

      <b>uses</b> ComServ, ADODB_TLB, SysUtils;

      <b>resourcestring</b>
      cConnStr = <font color="#9933CC">'Provider=Microsoft.Jet.OLEDB.4.0; '</font> +
      <font color="#9933CC">'Data Source=C:\Database\dbdemos.mdb;'</font> +
      <font color="#9933CC">'Persist Security Info=False'</font>;

      <b>function</b> TADOServer.ReturnRS: OleVariant;
      <b>var</b>
      adoCon1: _Connection;
      adoRs1: _Recordset;
      <b>begin</b>
      adoCon1 := CoConnection.Create;
      adoRs1 := CoRecordset.Create;
      adoCon1.CursorLocation := adUseClient;
      adoCon1.Open(cConnStr, <font color="#9933CC">''</font>, <font color="#9933CC">''</font>, 0);
      adoRs1.Open(<font color="#9933CC">'SELECT * FROM [Meine Tabelle]'</font>, adoCon1, adOpenKeyset,
      adLockBatchOptimistic, 0);
      <font color="#003399"><i>// vollständiges (lebendes) ADO-Recordset zurückliefern</i></font>
      Result := adoRs1;
      adoRs1.Set_ActiveConnection(<b>nil</b>);
      adoCon1.Close;
      <b>end</b>;
      </pre>

      b) Client holt sich vom DCOM-Server das Recordset ab:

      <pre>

      <b>uses</b> ADOSrv_TLB;

      <b>procedure</b> TForm1.ButtonGetClick(Sender: TObject);
      <b>var</b>
      aSrv : IADOServer;
      aRS : _Recordset;
      <b>begin</b>
      aSrv := CoADOServer.CreateRemote(vIP);
      aRS := IDispatch(aSrv.ReturnRS) <b>as</b> _Recordset;
      ADOTable1.Recordset := aRS;
      ADOTable1.Active := True;
      <b>end</b>;

      </pre>
      Beim Client kann TADOTable problemlos durch TADODataSet ersetzt werden. Der DCOM-Server kann alternativ anstelle von <i>OleVariant</i> auch gleich das _Recordset-Interface als Rückgabewert nutzen, allerdings muss dann die ADO-Typbibliothek in die DCOM Server-Typbibliothek mit eingebunden werden

      Comment

      Working...
      X