2016-03-21 73 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

相关问题