Announcement

Collapse
No announcement yet.

TAdoDataset Felder und Datensätze dynamsich im Speicher bilden

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

  • TAdoDataset Felder und Datensätze dynamsich im Speicher bilden

    Hallo,

    ich möchte gern eine TAdoDataSet generierem was nicht mit einer Datenbank verbunden ist. Die einzelnen Spalten werden zur Laufzeit generiert, in diesem Dataset werden maximal 5 Datensätzte stehen. Aber die Datensätze sollen eben nicht physikalisch sondern dynamisch im Speicher verwaltet werden. Ich möchte diese eigentlich nur tun, um vorhande Objekte wie DataSource, DbGrid, DBNavigator etc. für die Datenverarbeitung zu nutzen.

    Weis jemand, ob man ein ADODataSet die dazugehörigen Splaten und Datensätzte dynamisch im Speicher generieren kann. Das ganze ohne physikalischen Verbindung mit einer Datenbank ?

  • #2
    Hallo,

    ja - das ist möglich, da OLE DB mit der <i>Client Cursor Engine</i> die dafür notwendige Funktionalität bereitstellt. Man kann sogar zwischen 2 Wegen wählen: <br>
    1. Tabellenstruktur über den Objektinspektor visuell festlegen <br>
    2. Tabellenstruktur erst zur Laufzeit festlegen.

    Das folgende Beispiel demonstriert den 2. Weg:<br>
    a) RecordSet-Objektinstanz erzeugen <br>
    b) Tabelle im Arbeitsspeicher aufbauen und mit Daten füllen <br>
    c) RecordSet-Objekt bei Bedarf an TADOTable (oder TADODataSet) anhängen (optionaler Schritt, geht auch ohne, wenn kein TDBGrid benötigt wird)<br>
    d) Daten im TDBGrid anzeigen und editieren (entweder direkt über das RecordSet-Objekt oder die ADO Express-Komponente)
    <pre>
    { ************************************************** *******************
    Autor : Andreas Kosch
    Compiler : Delphi 5 UpdatePack#1
    Betriebssystem : Windows 2000
    Datum : 09.12.2000
    Beschreibung : ADO-Recordset als In-Memory-Table verwenden
    ************************************************** ******************** }

    unit MemoryTableFrm;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, Db, ADOInt, ComCtrls, ADODB;

    type
    TForm1 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    CheckBoxCreate: TCheckBox;
    StatusBar1: TStatusBar;
    ADOTable1: TADOTable;
    ButtonDaten1: TButton;
    ButtonDaten2: TButton;
    ButtonShow: TButton;
    procedure CheckBoxCreateClick(Sender: TObject);
    procedure ADOTable1AfterPost(DataSet: TDataSet);
    procedure ButtonDaten1Click(Sender: TObject);
    procedure ButtonDaten2Click(Sender: TObject);
    procedure ButtonShowClick(Sender: TObject);
    private
    { Private-Deklarationen }
    FNewID : Integer;
    FRecordset : _Recordset;
    procedure InitializeRecordset;
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    uses ActiveX, ComObj;

    procedure TForm1.CheckBoxCreateClick(Sender: TObject);
    begin
    if CheckBoxCreate.Checked then
    begin
    InitializeRecordset;
    ADOTable1.Recordset := FRecordset;
    ADOTable1.Open;
    StatusBar1.Panels[0].Text := Format('%d Datensätze',
    [ADOTable1.RecordCount]);
    StatusBar1.Panels[1].Text := 'Recordset ist aktiv';
    end
    else
    begin
    ADOTable1.Close;
    FRecordset := nil;
    StatusBar1.Panels[0].Text := '';
    StatusBar1.Panels[1].Text := '';
    end;
    end;

    procedure TForm1.InitializeRecordset;
    begin
    FRecordset := CreateComObject(CLASS_Recordset) as _Recordset;
    FRecordset.CursorLocation := adUseClient;
    // Recordset mit eigener Datenstruktur erstellen
    FRecordset.Fields.Append('Name', adVarChar, 25, adFldUnspecified);
    FRecordset.Fields.Append('Vorname', adVarChar, 25, adFldUnspecified);
    FRecordset.Fields.Append('eMail', adVarChar, 25, adFldUnspecified);
    // Recordset öffnen
    FRecordset.Open(EmptyParam, EmptyParam, adOpenUnspecified,
    adLockUnspecified, 0);
    end;

    procedure TForm1.ADOTable1AfterPost(DataSet: TDataSet);
    begin
    StatusBar1.Panels[0].Text := Format('%d Datensätze',
    [ADOTable1.RecordCount]);
    end;

    procedure TForm1.ButtonDaten1Click(Sender: TObject);
    begin
    FRecordset.AddNew(VarArrayOf([Widestring('Name'),
    Widestring('Vorname'),
    Widestring('eMail')]),
    VarArrayOf([Widestring('Kosch'),
    Widestring('Andreas'),
    Widestring('[email protected]')]));
    FRecordset.Update(EmptyParam, EmptyParam);
    ADOTable1.Recordset := FRecordset;
    end;

    procedure TForm1.ButtonDaten2Click(Sender: TObject);
    var
    sName : String;
    sVorname : String;
    sMail : String;
    begin
    Dec(FNewID);
    sName := Format('Name%d', [FNewID]);
    sVorname := Format('Vorname%d', [FNewID]);
    sMail := Format('eMail%d@mail', [FNewID]);
    ADOTable1.AppendRecord([sName, sVorname, sMail]);
    end;

    procedure TForm1.ButtonShowClick(Sender: TObject);
    begin
    with ADOTable1 do
    begin
    First;
    while not Eof do
    begin
    ShowMessage(Format('Name: %s%sVorname: %s%seMail: %s',
    [Fields[0].Value, #10#13,
    Fields[1].Value, #10#13,
    Fields[2].Value]));
    Next;
    end;
    end;
    end;

    end.
    </pre&gt

    Comment


    • #3
      Hallo Andreas,

      Danke schön..

      Comment

      Working...
      X