Announcement

Collapse
No announcement yet.

Mit RDS updaten ohne RDSServer.DataFactory

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

  • Mit RDS updaten ohne RDSServer.DataFactory

    Hallo,<br>
    ich habe folgendes vor: Über ein eigenes COM-Objekt wird ein ADO-Recordset abgerufen und einem <i>frischen</i> TADODataset zugewiesen. Beispiele sind in diesem Forum vorhanden (Diskussion <i>RDS und HTTP</i>). Da dieses ADODataSet keine Verbindungsinformationen enthält, lässt es sich jedoch nicht direkt bearbeiten (z.B. Editieren und Speichern über einen DBNavigator und DataSource). <br>
    Meine Idee war daher (kann sein, dass das völlig umständlich ist), ein ClientDataSet über eine Providerkomponente an das ADODataSet zu koppeln. Dieses ClientDataset kann man jetzt offline bearbeiten. Clientdataset bringt nebenbei noch eine ganze Menge Vorteile, da es an sich eine sehr universelle Bearbeitung der Daten erlaubt (z.B. UpdateStatus verwenden etc.).<br>
    1.<br>
    Das eigentliche Problem ist: Wie bekomme ich die Daten aus dem Clientdataset zurück in das (ein) Recordset, dass ich meiner COM+ Komponente zum speichern übergeben möchte ? Gibt es da vielleicht eine Idee<br>
    2.<br>
    Oder ist der Weg über Clientdataset nicht notwendig und zu umständlich. Ursache für dieses Vorgehen ist, dass <i>RDSServer.DataFactory</i> möglichst nicht verwendet werden soll, da bei einer Internetverbindung ohne SSL der Connectionstring und der Commandtext unverschlüsselt über's Internet übertragen werden müssen.<br>
    3.<br>
    Gibt es vielleicht einen Weg, mit RDSServer.Datafactory zu arbeiten, ohne den Connectionstring und Commandtext mit übertragen zu müssen, indem man diese Informationen auf dem Server deponiert ? (MSDFMap.ini ??)<br>
    Vielen Dank für Hinweise<br>
    Hermann

  • #2
    Hallo,

    dieser Umweg ist gar nicht notwendig, da die Kombination von ADO + RDS alles notwendige bereits unterstützt. In der nächsten Ausgabe von DER ENTWICKLER gehe ich in einem Beitrag auf die Optionen ein, die für eine Three-tier-Anwendung zur Verfügung stehen. Die folgenden Beispiele stammen aus diesem Artikel:

    <b>ADO</b>:

    Ein eigenes COM+ Objekt fordert ein RecordSet (<b>ltBatchOptimistic</b>) an, trennt die Verbindung zur ADO-Connection und liefert das "lebende" RecordSet an den Aufrufer zurück.
    <pre>
    function TDE2001SrvObj.CustomerRS: _Recordset;
    begin
    try
    try
    ADOConnectionDE2001.Connected := True;
    with ADODataSetCustomer do
    begin
    Active := True;
    Result := ADODB_TLB._Recordset(Recordset);
    Connection := nil;
    Active := False;
    end;
    SetComplete;
    finally
    ADOConnectionDE2001.Connected := False;
    end;
    except
    SetAbort;
    raise;
    end;
    end;
    </pre>

    <b>RDS</b>

    Die Remote Data Service-Technologie von Microsoft stellt für mehrschichtige Anwendungen die folgenden Kernfunktionen zur Verfügung:

    - Bidirektionaler Transport von RecordSets über das HTTP-Protokoll <br>
    - Aufruf von COM-Komponenten über HTTP<br>

    Beide Kernfunktionen werden über unterschiedliche Techniken realisiert, so dass RDS zwischen dem <i>Implicit Remoting</i> und dem <i>Explicit Remoting</i> unterscheidet.

    Das Implicite Remoting wird immer dann den Anforderungen nicht gerecht, wenn die mittlere Ebene spezielle Arbeiten zu erledigen hat und wenn besondere Sicherheitsanforderungen gestellt werden. Daher kann man auf ein eigenes COM+ Objekt zurückgreifen, dass die Aufgaben der DataFactory übernimmt. In diesem Fall gibt es mehrere Möglichkeiten:

    - Eine Interface-Methode des COM+ Objekts liefert ein RecordSet zurück und wird direkt in einer TADODataSet-Instanz als CommandText verwendet <br>
    - Eine Interface-Methode des COM+ Objekts liefert ein RecordSet zurück, wobei ein Methoden-Parameter die zurückgelieferte Datenmenge einschränkt<br>
    - Über RDS werden Interface-Methoden des COM+ Objekts aufgerufen, die nichts mit Datenbanken und ADO-RecordSets zu tun haben. In diesem Fall ist RDS eine Aufrufalternative zu DCOM, die immer dann eingesetzt werden kann, wenn nur der Port 80 und der Transportweg HTTP zur Verfügung steht. RDS ist in diesem Kontext ein <i>COM-Marshaler</i>, der das RecordSet-Objekt zu den Automation-fähigen Datentypen hinzufügt.

    <b>Client greift über RDS auf das COM+ Objekt zu</b>

    Der Client demonstriert beide Wege: <br>
    a) lebendes, editierbares RecordSet vom Server abfordern und im TDBGrid anzeigen<br>
    b) beliebige Interface-Methode des COM+ Objekts aufrufen

    <pre>
    unit CltDE2001SrvRDSFrmMain;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, DB, ADODB, StdCtrls, ExtCtrls, ComCtrls, Grids, DBGrids;

    type
    TFormRDS = class(TForm)
    StatusBar1: TStatusBar;
    RadioGroupConnect: TRadioGroup;
    EditIP: TEdit;
    RDSConnectionDE2001: TRDSConnection;
    DBGridCustomer: TDBGrid;
    ADODataSetCustomer: TADODataSet;
    DataSourceCustomer: TDataSource;
    MemoCustomer: TMemo;
    procedure RadioGroupConnectClick(Sender: TObject);
    procedure DataSourceCustomerDataChange(Sender: TObject; Field: TField);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    FormRDS: TFormRDS;

    implementation

    {$R *.dfm}

    uses ADOInt;

    procedure TFormRDS.RadioGroupConnectClick(Sender: TObject);
    var
    vRS : OleVariant;
    aRS : ADOInt._RecordSet;
    begin
    ADODataSetCustomer.Active := False;
    DBGridCustomer.Visible := False;
    case RadioGroupConnect.ItemIndex of
    0 : RDSConnectionDE2001.Connected := False;
    1 : begin
    RDSConnectionDE2001.Connected := True;
    vRS := RDSConnectionDE2001.AppServer.CustomerRS;
    aRS := IUnknown(vRS) as _RecordSet;
    with ADODataSetCustomer do
    begin
    RecordSet := aRS;
    Active := True;
    end;
    DBGridCustomer.Visible := True;
    end;
    end;
    end;

    procedure TFormRDS.DataSourceCustomerDataChange(Sender: TObject;
    Field: TField);
    var
    iCustID : Integer;
    iResult : Integer;
    swAddrRow1,
    swAddrRow2,
    swAddrStr,
    swAddrHnr,
    swAddrPLZ,
    swAddrOrt : WideString;
    begin
    iCustID := ADODataSetCustomer.FieldByName('CustID').AsInteger ;
    iResult := RDSConnectionDE2001.AppServer.CustAddr(
    iCustID,1,swAddrRow1,swAddrRow2,swAddrStr,
    swAddrHnr,swAddrPLZ,swAddrOrt);
    with MemoCustomer.Lines do
    begin
    Clear;
    if iResult = 1 then
    begin
    Add(swAddrRow1);
    Add(swAddrRow2);
    Add(swAddrStr + ' ' + swAddrHnr);
    Add(swAddrPLZ + ' ' + swAddrOrt);
    end
    else
    Add('Es wurden keine Daten gefunden.');
    end;
    end;

    end.
    </pre>

    P.S: Das ADO-RecordSet-Objekt kann alles was TClientDataSet kann und noch vieles mehr.
    &#10

    Comment


    • #3
      Hallo Herr Kosch,<br>
      vielen Dank für die Informationen. Manchmal frage ich mich, wo Sie die viele Zeit hernehmen ... Habe ein fast identisches Beispiel - nur das ADODataset ist nicht editierbar.<br>
      Viele Grüss

      Comment

      Working...
      X