2016-03-21 96 views
0

是否有任何方法將所有數據庫記錄和結構多個查詢整合到一個XML文件中?將TFDMemTable數據附加到一個XML文件中

我所做的是:

procedure CopyRecords(Sender: TObject); 
begin 
    try 

    TFDQuery.SQL.Text := 'SELECT * FROM SAMPLE_TABLE1'; 
    TFDQuery.FetchOptions.Unidirectional := False; 
    TFDQuery.Open; 
    TFDQuery.FetchAll; 

    TFDmemtable.Data := DM.qry_SQL.Data; 
    TFDmemtable.First; 

    while not TFDmemtable.Eof do 
    begin 
    TFDmemtable.Edit; 

    TFDmemtable.Post; 
    TFDmemtable.Next; 
    end; 

    TFDmemtable.SaveToFile('C:\Test.xml', sfXML); 
    finally 
    TFDmemtable.Close; 
    end; 
end; 

這對於一個查詢工作正常,但如果我改變SQL文本,並保持文件名comtents被覆蓋。我想更改查詢(SQL.text)並將所有查詢數據保存到一個 XML文件中。

TFDQuery.SQL.Text := 'SELECT * FROM SAMPLE_TABLE1'; 
... save ... 
TFDQuery.SQL.Text := 'SELECT * FROM SAMPLE_TABLE2'; 
... save (append) ... 

回答

3

如果你想創建/追加爲你所描述的XML文件,你實際上並不 需要使用FDMemTable。您可以直接從您的FDQuery中完成以下所示的操作。

正如你會看到它基本上

  • 節省了TFDQuery以XML格式的TStringStream;
  • 使用 Windows的MSXML DOM解析器將StringStream的內容加載到XmlDocument對象;
  • 將先前保存的查詢的XML文件加載到第二個XmlDocument中;和
  • Table節點的內容從保存的查詢複製到 第二個XmlDocument中並保存該文檔。

代碼:

uses 

    Data.DB, ADOInt, Data.Win.ADODB, Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids, 
    System.Classes, SysUtils, Variants, Vcl.Forms, Vcl.Controls, Vcl.ExtCtrls, Vcl.DBCtrls, 
    FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, 
    FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, 
    FireDAC.Phys, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, 
    FireDAC.DApt, FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.Phys.MSSQL, 
    FireDAC.Phys.MSSQLDef, FireDAC.VCLUI.Wait, FireDAC.Comp.UI, 
    Dialogs, FireDAC.Stan.StorageXML, WinApi.MSXMLIntf, WinApi.MSXML; 

type 
    TForm1 = class(TForm) 
    DataSource1: TDataSource; 
    DBNavigator1: TDBNavigator; 
    DBGrid1: TDBGrid; 
    FDConnection1: TFDConnection; 
    FDQuery1: TFDQuery; 
    FDGUIxWaitCursor1: TFDGUIxWaitCursor; 
    Button1: TButton; 
    Memo1: TMemo; 
    FDStanStorageXMLLink1: TFDStanStorageXMLLink; // This is needed to save the Query to XML 
    [...] 
    protected 
    procedure SaveToXML(FDQuery: TFDQuery); 
    end; 

const 
    scSavedData = 'D:\delphi\code\firedac\SavedData.Xml'; 
    scSavedSingleQuery = 'D:\delphi\code\firedac\SavedSingleQuery.Xml'; 
    scSavedDataXML = '<?xml version="1.0" encoding="utf-8"?><Data/>'; 

procedure TForm1.SaveToXML(FDQuery: TFDQuery); 
var 
    SS : TStringStream; 
    XmlDoc1, 
    XMlDoc2 : IXMLDOMDocument2; 
    NodeList: IXmlDomNodeList; 
    nSource: IXmlDomNode; 
    nDestination : IXmlDomNode; 
    eDestination : IXmlDomElement; 
begin 
    SS := TStringStream.Create; 
    XmlDoc1 := CoDomDocument.Create; 
    try 
    FDQuery.SaveToStream(SS, sfXML); 
    XmlDoc1.loadXML(SS.DataString); 
    NodeList := XmlDoc1.documentElement.selectNodes('//FDBS/Manager/TableList/Table'); 
    nSource := NodeList.item[0]; 
    // At this point, nSource is the XML node which contains the data + metadata 
    // of the FDQuery's result set 
    // Next we splice it into an XML file of previously saved FDQuery result sets 
    // or create this file if it doesn't already exist 

    XmlDoc2 := CoDomDocument.Create; 
    if FileExists(scSavedData) then begin 
     XmlDoc2.load(scSavedData) 
    end 
    else begin 
     XmlDoc2.loadXML(scSavedDataXML); 
    end; 
    nDestination := nSource.cloneNode(True) as IXmlDomNode; 
    XmlDoc2.documentElement.appendChild(nDestination); 
    eDestination := nDestination as IXmlDomElement; 
    eDestination.setAttribute('Sql', FDQuery.SQL.Text); 

    Memo1.Lines.Text := XmlDoc2.documentElement.Xml; 
    XmlDoc2.save(scSavedData); 
    finally 
    SS.Free; // Only this needs to be freed 
    // all the other (interface) objects will be finalized as the procedure exits 
    end; 
end; 
+0

謝謝!這非常有用 – Steve88