2016-03-23 2 views
3

Ich habe eine XML-Datei, wo ich Datenbankinfos (TableName, Datensätze usw.) speichern Gibt es eine Möglichkeit, Datensätze zu einer Abfrage oder Dataset aus der Datei zu laden? Ich möchte TablaName Parameter ändern und nachdem ich die Datenbank mit Tabellendatensätzen füllen möchte. Danke für die Antworten!Füllen Sie FDQuery/Dataset mit gespeicherten DB-Infos aus XML-Datei

Meine XML wie folgt aussehen:

<?xml version="1.0" encoding="UTF-8"?> 
-<Data> 
    -<Table Sql="Select * from VAT_RATE " MinimumCapacity="50" EnforceConstraints="False" TabID="0" SourceID="1" SourceName="VAT_RATE" Name="FDQuery"> 
    -<ColumnList> 
    <Column SourceID="1" SourceName="VAT_RATE_ID" Name="VAT_RATE_ID" OriginColName="VAT_RATE_ID" OriginTabName="VAT_RATE" OInKey="True" OInWhere="True" OInUpdate="True" Base="True" Searchable="True" DataType="Int32"/> 
    <Column SourceID="2" SourceName="BEGINS" Name="BEGINS" OriginColName="BEGINS" OriginTabName="VAT_RATE" OInWhere="True" OInUpdate="True" Base="True" Searchable="True" DataType="Date" OAllowNull="True" AllowNull="True"/> 
    <Column SourceID="3" SourceName="ENDS" Name="ENDS" OriginColName="ENDS" OriginTabName="VAT_RATE" OInWhere="True" OInUpdate="True" Base="True" Searchable="True" DataType="Date" OAllowNull="True" AllowNull="True"/> 
    <Column SourceID="4" SourceName="NAME" Name="NAME" OriginColName="NAME" OriginTabName="VAT_RATE" OInWhere="True" OInUpdate="True" Base="True" Searchable="True" DataType="AnsiString" SourceSize="20" Size="20"/> 
    <Column SourceID="5" SourceName="ACCOUNT" Name="ACCOUNT" OriginColName="ACCOUNT" OriginTabName="VAT_RATE" OInWhere="True" OInUpdate="True" Base="True" Searchable="True" DataType="AnsiString" SourceSize="20" Size="20"/> 
    <Column SourceID="6" SourceName="KEY" Name="KEY" OriginColName="KEY" OriginTabName="VAT_RATE" OInWhere="True" OInUpdate="True" Base="True" Searchable="True" DataType="Currency" SourceScale="2" SourcePrecision="9" Scale="2" Precision="9"/> 
    <Column SourceID="7" SourceName="D_EFAULT" Name="D_EFAULT" OriginColName="D_EFAULT" OriginTabName="VAT_RATE" OInWhere="True" OInUpdate="True" Base="True" Searchable="True" DataType="Int16"/> 
    <Column SourceID="8" SourceName="count_ID" Name="count_ID" OriginColName="count_ID" OriginTabName="VAT_RATE" OInWhere="True" OInUpdate="True" Base="True" Searchable="True" DataType="Int32"/> 
    </ColumnList> 
    <ConstraintList/> 
    <ViewList/> 
    -<RowList> 
    -<Row RowState="Unchanged" RowID="0"> 
     <Original count_ID="14" D_EFAULT="0" KEY="20" ACCOUNT="20%" NAME="20%" ENDS="20090630" BEGINS="20051001" VAT_RATE_ID="1"/> 
     </Row> 
    -<Row RowState="Unchanged" RowID="1"> 
     <Original count_ID="14" D_EFAULT="0" KEY="18" ACCOUNT="18%" NAME="18%" BEGINS="20040101" VAT_RATE_ID="3"/> 
    </Row> 
    </RowList> 
    </Table> 
</Data> 

Im Beispiel TablneName ist ... Source = "VAT_RATE"

Antwort

4

Der einfachste Weg, dies zu tun, scheint die SaveTXML Methode in meiner Antwort auf sein zu ändern zu Ihrer früheren q (Append TFDMemTable data into one XML file) wie unten gezeigt und fügen Sie eine LoadFromXML Methode.

Der Grund für die SaveToXML Modifikation ist, dass ein FDQuery die Manager Knoten des XML erfordert, die es erzeugt, wenn eine speichern tun, und die frühere Version von meinem SaveToXML es abgezogen.

Im LoadFromXML, die Abfrage + Daten, die es

durch diese Aussage bestimmt geladen
Node := NodeList.item[0]; 

NodeList ist die Liste der untergeordneten Knoten der gespeicherten XML-Top-Level-Dokumentelement und item[0] ist einfach die erste einer dieser Knoten (sie sind nummeriert 0 .. NodeList.length - 1). Wenn Sie also einen anderen laden möchten, können Sie die Nummer item[] entsprechend anpassen. Abhängig davon, wie vertraut Sie mit XML-XPath-Abfragen sind, gibt es verschiedene andere Möglichkeiten, den XML-Knoten auszuwählen, dessen Abfrage + Daten Sie neu laden, aber XPath ist ein völlig anderes Thema. Stellen Sie sicher, dass Sie jede Version der XML-Datei löschen oder umbenennen, die vor der Änderung an SaveToXML gespeichert wurde, da die vorherige Version nicht kompatibel mit LoadFromXML ist.

Code:

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.LoadFromXML(FDQuery: TFDQuery); 
var 
    SS : TStringStream; 
    XmlDoc : IXmlDOMDocument; 
    NodeList: IXmlDomNodeList; 
    Node: IXmlDomNode; 
    Element : IXmlDomElement; 
begin 
    if FDQuery.Active then 
    FDQuery.Close; 
    SS := TStringStream.Create; 
    XmlDoc := CoDomDocument.Create; 
    try 
    XmlDoc.load('file://' + scSavedData); 
    NodeList := XmlDoc.documentElement.childNodes; 
    Node := NodeList.item[0]; 
    SS.WriteString(Node.xml); 
    FDQuery.LoadFromStream(SS, sfXML); 
    finally 
    SS.Free; 
    end; 
end; 

procedure TForm1.SaveToXML(FDQuery: TFDQuery); 
var 
    SS : TStringStream; 
    XmlDoc1, 
    XMlDoc2 : IXMLDOMDocument2; 
    nDestination : IXmlDomNode; 
    eDestination : IXmlDomElement; 
begin 
    SS := TStringStream.Create; 
    XmlDoc1 := CoDomDocument.Create; 
    try 
    FDQuery.SaveToStream(SS, sfXML); 
    XmlDoc1.loadXML(SS.DataString); 
    Memo1.Lines.Text := SS.DataString; 

    XmlDoc2 := CoDomDocument.Create; 
    if FileExists(scSavedData) then begin 
     XmlDoc2.load(scSavedData) 
    end 
    else begin 
     XmlDoc2.loadXML(scSavedDataXML); 
    end; 
    nDestination := XmlDoc1.DocumentElement.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; 
    end; 
end; 
Verwandte Themen