Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Konvertierung Access --> XML (https://www.delphipraxis.net/143508-konvertierung-access-xml.html)

R2009 17. Nov 2009 12:50

Datenbank: Access • Version: 2003 • Zugriff über: ADO, Tclientdataset

Konvertierung Access --> XML
 
Hi DP'ler,

hier das vorläufige Ergebnis (ist noch nicht fertig) meiner Bemühungen eine Access Datenbank in ein XML Dokument zu überführen.
Ich habe das Ganze weitgehend universell geschrieben, sodass man, im Prinzip, jede Access Datenbank damit umwnandeln kann.
b:=true dient nur als Platzhalter für die fehlenden Typdefinitionen.
Realisiert wurde das Ganze unter Verwendung von Tclientdataset.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var j:integer;b:boolean;ClientDataSet:TClientDataSet;
begin
    ClientDataSet:=TClientDataSet.Create(self);
    If fileexists('d:\Transfer.xml') then DeleteFile('d:\Transfer.xml');
    ClientDataSet.FileName:='';
    begin
      For j:=0 to ADOTable1.FieldList.Count-1 do
       case ADOTable1.FieldList.Fields[j].DataType of
       ftUnknown:   b:=true;
       ftString:    ClientDataSet.FieldDefs.Add(ADOTable1.FieldList.Fields[j].FieldName, ftString, ADOTable1.FieldList.Fields[j].Size, FALSE);
       ftWideString: ClientDataSet.FieldDefs.Add(ADOTable1.FieldList.Fields[j].FieldName, ftString, ADOTable1.FieldList.Fields[j].Size, FALSE);
       ftInteger:   ClientDataSet.FieldDefs.Add(ADOTable1.FieldList.Fields[j].FieldName, ftInteger, ADOTable1.FieldList.Fields[j].Size, FALSE);
       ftSmallint:  b:=true;
       ftCurrency:  b:=true;
       ftAutoInc:   ClientDataSet.FieldDefs.Add(ADOTable1.FieldList.Fields[j].FieldName, ftInteger, 0, FALSE);
       ftWord:      b:=true;
       ftFloat:     b:=true;
       ftBoolean:   b:=true;
       ftBCD:       b:=true;
       ftTime:      b:=true;
       ftDate:      b:=true;
       ftDateTime:  b:=true;
       ftBytes:     b:=true;
       ftVarBytes:  b:=true;
       ftBlob:      b:=true;
       ftMemo:      b:=true;
       ftGraphic:   b:=true;
       ftFmtMemo:   b:=true;
       ftParadoxOle: b:=true;
       ftDBaseOle:  b:=true;
       ftTypedBinary:b:=true;
       ftCursor:    b:=true;
       ftFixedChar: b:=true;
       ftLargeint:  b:=true;
       ftADT:       b:=true;
       ftArray:     b:=true;
       ftReference: b:=true;
       ftDataSet:   b:=true;
       ftOraBlob:   b:=true;
       ftOraClob:   b:=true;
       ftVariant:   b:=true;
       ftInterface: b:=true;
       ftIDispatch: b:=true;
       ftGuid:      b:=true;
       ftTimeStamp: b:=true;
       ftFMTBcd:    b:=true;
         else
         Begin
           b:=false;
         End;
      end;
   end;
  // Dataset aktvieren
  ClientDataSet.CreateDataset;
  ClientDataSet.Open;
  ClientDataSet.LogChanges:=false;
  ADOTable1.First;
  while not ADOTable1.eof do
    begin
      ClientDataSet.Append;
      For j:=0 to ADOTable1.FieldList.count-1 do        //ADOTable1.FieldList.Fields[j].FieldName
        begin
          ClientDataSet.FieldByName(ADOTable1.FieldList.Fields[j].FieldName).AsVariant := ADOTable1.FieldValues[ADOTable1.FieldList.Fields[j].FieldName];
        end;
      ADOTable1.next;
     end;
  ClientDataSet.SaveToFile('d:\Transfer.xml');
  ClientDataSet.Close;
  ClientDataSet.Free;
  ADOTable1.First;
end;

himitsu 17. Nov 2009 13:53

Re: Konvertierung Access --> XML
 
Warum Platzhalter? (wo du ja noch nichtmal das B auswertest)
Delphi-Quellcode:
ftUnknown:    ;
ftString:     ClientDataSet.FieldDefs.Add(...
ftWideString: ClientDataSet.FieldDefs.Add(...
ftInteger:    ClientDataSet.FieldDefs.Add(...
ftSmallint:   ;
ftCurrency:   ;
ftAutoInc:    ClientDataSet.FieldDefs.Add(...
ftWord:       ;
ftFloat:      ;
ftBoolean:    ;
ftBCD:        ;
ftTime:       ;
ftDate:       ;
ftDateTime:   ;
ftBytes:      ;
ftVarBytes:   ;
ftBlob:       ;
ftMemo:       ;
ftGraphic:    ;
ftFmtMemo:    ;
ftParadoxOle: ;
ftDBaseOle:   ;
ftTypedBinary: ;
ftCursor:     ;
ftFixedChar:  ;
ftLargeint:   ;
ftADT:        ;
ftArray:      ;
ftReference:  ;
ftDataSet:    ;
ftOraBlob:    ;
ftOraClob:    ;
ftVariant:    ;
ftInterface:  ;
ftIDispatch:  ;
ftGuid:       ;
ftTimeStamp:  ;
ftFMTBcd:     ;
else          {Fehler oder was weiß ich .... kommt man überhaut hier jemals vorbei?};
Wobei ich es wohl eher etwa so lösen würde.
Hier hätte man auch 'ne bessere Kontrolle über alles, welches schon implementiert ist.
Delphi-Quellcode:
//ftUnknown:  ;
ftString:     ClientDataSet.FieldDefs.Add(...
ftWideString: ClientDataSet.FieldDefs.Add(...
ftInteger:    ClientDataSet.FieldDefs.Add(...
//ftSmallint: ;
//ftCurrency: ;
ftAutoInc:    ClientDataSet.FieldDefs.Add(...
//ftWord:     ;
//ftFloat:    ;
//ftBoolean:  ;
//ftBCD:      ;
//ftTime:     ;
//ftDate:     ;
//ftDateTime: ;
//ftBytes:    ;
//ftVarBytes: ;
//ftBlob:     ;
//ftMemo:     ;
//ftGraphic:  ;
//ftFmtMemo:  ;
//ftParadoxOle: ;
//ftDBaseOle: ;
//ftTypedBinary: ;
//ftCursor:   ;
//ftFixedChar: ;
//ftLargeint: ;
//ftADT:      ;
//ftArray:    ;
//ftReference: ;
//ftDataSet:  ;
//ftOraBlob:  ;
//ftOraClob:  ;
//ftVariant:  ;
//ftInterface: ;
//ftIDispatch: ;
//ftGuid:     ;
//ftTimeStamp: ;
//ftFMTBcd:   ;
else          Raise Exception.Create('not implemented');

R2009 17. Nov 2009 14:24

Re: Konvertierung Access --> XML
 
Ja ja ist ja gut,

das b wird vielleicht mal ausgewertet und ich bin noch mittendrin!
(und ausserdem bin ich ein fauler Mensch! Deshalb sind die noch da)
Hab das b benutzt um einen Platzhalter für den Debugger zu haben. Ohne Platzhalter
springt der Debugger einfach über die entsprechenden Einträge weg.
Da die Zuordnung Datentypen Access --> XML nicht so ganz trivial ist hab ich das damit versucht rauszufinden.


Grüsse
Rainer


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz