如果你想创建/追加为你所描述的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;
谢谢!这非常有用 – Steve88