Announcement

Collapse
No announcement yet.

MyBase XML-DB

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

  • MyBase XML-DB

    Hallo,

    in der Feature-Matrix habe ich gelesen, dass in Delphi 6 PRO (!) die Datenbankengine "MyBase" enthalten sei, die auf XML basiert. Habe ich bisher aber noch nicht gefunden... Gibt es da eine Arte Table, wo man als Source einfach eine XML-Datei angibt, oder wie funktioniert das??

    michael

  • #2
    Hallo,

    hinter dem Namen <i>MyBase</i> verbirgt sich nur die seit Delphi 3 bekannte <b>TClientDataSet</B>-Komponente. Mit Delphi 6 steht TClientDataSet erstmalig in der Professional-Version zur Verfügung (und nicht nur in der Client/Server-Suite bzw. der Enterprise-Version). Beispiele für den Einsatz von TClientDataSet als "Standalone"-Datenbank sind in meinem Buch <i>Client/Server-Datenbankentwicklung mit Delphi</i> (Seiten 76 - 89) zu finden. Das sieht zum Beispiel so aus:
    <pre>
    { ************************************************** **************
    Source File Name : LocalCDSFrm.pas
    Typ : Hauptformular
    Autor : Andreas Kosch
    Compiler : Delphi 4.02 CSS UpdatePack #3
    Betriebssystem : Windows 98
    Beschreibung : TClientDataSet als BDE-Ersatz für einfache lokale
    Datenbanktabellen.
    Vorgehensweise:
    1. TClientDataSet-Komponente im Formular plazieren
    2. Mit Doppelklick den Feldeditor öffnen und neue
    Datenfelder anlegen
    3. Rechter Menüklick auf TClientDataSet-Instanz:
    Dataset erstellen..
    Das CDS wird daraufhin automatisch aktiv, die
    Struktur wird im DBGrid angezeigt.
    ************************************************** ************** }

    unit LocalCDSFrm;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    Grids, DBGrids, ExtCtrls, DBCtrls, Db, DBClient, ComCtrls, StdCtrls,
    ActnList, Menus;

    type
    TFormMain = class(TForm)
    StatBar: TStatusBar;
    ClientDataSet1: TClientDataSet;
    DataSource1: TDataSource;
    DBNavigator1: TDBNavigator;
    DBGrid1: TDBGrid;
    ClientDataSet1Name: TStringField;
    ClientDataSet1Telefon: TStringField;
    ClientDataSet1Datum: TDateField;
    RadioGroupIndex: TRadioGroup;
    ButtonMerge: TButton;
    ActionList1: TActionList;
    ActionMergeChange: TAction;
    MainMenu1: TMainMenu;
    MFile: TMenuItem;
    MFExit: TMenuItem;
    MWork: TMenuItem;
    MWChangeLog: TMenuItem;
    ActionExit: TAction;
    procedure RadioGroupIndexClick(Sender: TObject);
    procedure ClientDataSet1BeforePost(DataSet: TDataSet);
    procedure DataSource1DataChange(Sender: TObject; Field: TField);
    procedure ActionMergeChangeExecute(Sender: TObject);
    procedure ActionList1Update(Action: TBasicAction;
    var Handled: Boolean);
    procedure ActionExitExecute(Sender: TObject);
    private
    { Private-Deklarationen }
    FMergeEnabled : Boolean;
    public
    { Public-Deklarationen }
    end;

    var
    FormMain: TFormMain;

    implementation

    {$R *.DFM}

    {
    Über TClientDataSet.IndexFieldNames kann zur Laufzeit die Anzeige-
    sortierung bequem umgeschaltet werden.
    Wird TClientDataSet.IndexName auf 'CHANGEINDEX' gesetzt, so zeigt
    die Datenmenge alle nach dem letzen MergeChangeLog vorgenommenen
    Änderungen am Datenbestand an. Dazu wird jeweils der alte sowie der
    neue Zustand als getrennte Datensätze angezeigt.
    }

    procedure TFormMain.RadioGroupIndexClick(Sender: TObject);
    begin
    case RadioGroupIndex.ItemIndex of
    0 : ClientDataSet1.IndexFieldNames := 'Name';
    1 : ClientDataSet1.IndexFieldNames := 'Telefon';
    2 : ClientDataSet1.IndexFieldNames := 'Datum';
    3 : ClientDataSet1.IndexName := 'CHANGEINDEX';
    end;
    end;

    procedure TFormMain.ClientDataSet1BeforePost(DataSet: TDataSet);
    begin
    ClientDataSet1Datum.Value := Date;
    end;

    procedure TFormMain.DataSource1DataChange(Sender: TObject; Field: TField);
    begin
    with ClientDataSet1 do
    begin
    StatBar.Panels[0].Text := Format('%d Datensätze', [RecordCount]);
    StatBar.Panels[1].Text := Format('%d Änderungen', [ChangeCount]);
    if ChangeCount > 0 then
    FMergeEnabled := True
    else
    FMergeEnabled := False;
    end;
    end;

    {
    Über eine TActionList-Instanz
    }

    procedure TFormMain.ActionList1Update(Action: TBasicAction;
    var Handled: Boolean);
    begin
    ActionMergeChange.Enabled := FMergeEnabled;
    ActionExit.Enabled := True;
    Handled := True;
    end;

    {
    Wird TClientDataSet.IndexName auf 'CHANGEINDEX' gesetzt, so zeigt
    die Datenmenge alle nach dem letzen MergeChangeLog vorgenommenen
    Änderungen am Datenbestand an. Dazu wird jeweils der alte sowie der
    neue Zustand als getrennte Datensätze angezeigt.
    Mit dem Aufruf von ClientDataSet.MergeChangeLog werden alle
    Änderungen in den aktuellen Datenbestand eingearbeitet.
    }

    procedure TFormMain.ActionMergeChangeExecute(Sender: TObject);
    begin
    ClientDataSet1.MergeChangeLog;
    ClientDataSet1.First;
    end;

    procedure TFormMain.ActionExitExecute(Sender: TObject);
    begin
    Close
    end;

    end.
    </pre>

    &#10

    Comment


    • #3
      Aber warum steht dann in der D6 Featurematrix "MyBase Personal XML Database Engine"??? Ausserdem ist dem Ding sogar noch ein ganzer Block mit einzelnen Features gewidmet (siehe www.borland.de)... Irgendwas muss das doch mit XML zu tun haben.... Kann ich eine XML Datei nicht als Datenprovider definieren

      Comment


      • #4
        Hallo,

        jaja - was die Werbung so alles möglich macht - oder frei abgewandelt nach Gebrüder Grimm: <br>"<i>Ach wie gut das niemand weis, neuer Name alter Sch..."</i> :-)

        TClientDataSet kann nun genauso wie der Rivale ADO-RecordSet (von Microsoft) die Daten entweder im "alten" binären CDS-Format oder auch auf Wunsch als XML-Struktur speichern. Wenn man jedoch bedenkt, dass XML einem "unnötigen Ballast" von ca 75% entspricht, macht XML im Normalfall keinen Sinn (es sei denn, die Daten sollen platform- und anwendungsübergreifend mit "unbekannten" Partnern ausgetauscht werden).

        Comment


        • #5
          Hallo,

          Wenn ich das jetzt richtig verstehe, benötige ich KEINE DB-Enginge mehr hinter der ganzen Sache, sondern kann die xml-Datei als Datenquelle verwenden, ohne irgendein anderes DBMS oder die BDE ect. zu nutzen??? Und wie krieg ich das hin? Hab zwar schon experimentiert, aber dennoch kein Ergebnis erzielt..

          Comment


          • #6
            zu Frage 1: <br>
            Ja, es wird weder die BDE noch ein DBMS benötigt. Allerdings wird MIDAS.DLL benötigt, und wenn die Daten nicht im binären, sondern von Delphi 6 im XML-Format gespeichert werden, erwartet Borland, dass auf diesem Rechner auch <i>MSXML.DLL</i> (von Microsoft) installiert ist.

            zu Frage 2: <br>
            Siehe mein Beispiel oben (vom 11.7.

            Comment


            • #7
              Obwohl nur Delphi 5 Professional vorhanden ist? Na gut, werde ich testen... dann muss ich die BEIDEN DLLs wahrscheinlich auch bei meiner Installation der Software auf anderen Rechner mitinstallieren

              Comment


              • #8
                Hallo,

                ein Blick in die Hilfe von Delphi 5 schafft Klarheit:
                <pre>
                procedure SaveToFile(const FileName: string = ''; Format TDataPacketFormat=dfBinary);
                type TDataPacketFormat = (dfBinary, dfXML);
                </pre>
                Somit kann Delphi 5 bereits XML schreiben.

                P.S: Die andere Frage ist, ob ein Besitzer von Delphi 5 <b>Professional</b> berechtigt ist, <i>MIDAS.DLL</i> weiterzugeben. Ein Blick in die Datei <i>deploy.txt</i> sollte Klarheit schaffen

                Comment

                Working...
                X