XML-Dokument als Client eines Providers verwenden
Nach oben zu XML in Datenbankanwendungen verwenden - Index
Die Komponente Datasnap.Xmlxform.TXMLTransformClient dient als eine Art Adapter, der die Verwendung eines oder mehrerer XML-Dokumente als Client eines Anwendungs-Servers (oder einfach als Client einer Datenmenge, mit der über eine Komponente vom Typ TDataSetProvider eine Verbindung hergestellt wird) ermöglicht. Dies bedeutet, dass Sie mithilfe von TXMLTransformClient Datenbankdaten als XML-Dokument publizieren können und Aktualisierungsanforderungen (Einfügen oder Löschen von Daten) einer externen Anwendung nutzen können, welche die Daten in Form von XML-Dokumenten zur Verfügung stellt.
Zur Angabe des Providers, von dem das TXMLTransformClient-Objekt Daten abruft und in den die Aktualisierungen übernommen werden, verwenden Sie Provider-Komponenten.
Befindet sich der Provider auf einem Remote-Anwendungs-Server, so müssen Sie eine DataSnap-Verbindungskomponente zur Verbindung mit diesem Server verwenden. Um die Verbindungskomponente zu geben, verwenden Sie Mit dem Datenbankserver verbinden.
XML-Dokument von einem Provider abrufen
TXMLTransformClient verwendet eine interne TXMLTransform-Komponente, um vom Provider stammende Datenpakete in ein XML-Dokument zu konvertieren. Auf diese TXMLTransform-Komponente können Sie zugreifen, indem Sie für die Eigenschaft TransformGetData einen entsprechenden Wert setzen.
Vor dem Erstellen eines XML-Dokuments, das die von einem Provider stammenden Daten repräsentiert, müssen Sie die eigenständige TXMLTransform-Komponente angeben. Falls die Transformation auch benutzerdefinierte Knoten betrifft, ist es sinnvoll, für TransformGetData zusätzlich ein Xmlxform.OnTranslate, das eine eigenständige TXMLTransform-Komponente verwendet, zu defineren. Falls die Transformation auch benutzerdefinierte Knoten betrifft, ist es sinnvoll, für TransformGetData zusätzlich eine Ereignisbehandlungsroutine für Xmlxform.OnTranslate zu definieren.
Es ist nicht erforderlich, das Quelldokument für TransformGetData anzugeben, da TXMLTransformClient dieses vom Provider abruft. Wenn der Provider jedoch Eingabeparameter erwartet, ist es sinnvoll, diese vor dem Abrufen der Daten vom Provider zu setzen. Verwenden Sie hierzu die Methode SetParams. Für SetParams werden zwei Argumente angegeben: ein XML-String, aus dem nach der Konvertierung in ein Datenpaket die Parameterwerte extrahiert werden, sowie der Name der Transformationsdatei, die zum Konvertieren der XML-Daten in ein Datenpaket verwendet wird. SetParams verwendet die Transformationsdatei, um den XML-String in ein Datenpaket zu konvertieren und extrahiert anschließend die Parameterwerte aus dem Datenpaket.
Hinweis: Beide Argumente können übergeschrieben werden, wenn Sie das Dokument mit den Parametern oder die Transformationsdatei auf andere Weise angeben möchten. Setzen Sie hierzu einfach eine der Eigenschaften für XML-Dokumente in Datenpakete konvertieren.
Nachdem Sie die Konfiguration für TransformGetData vorgenommen und alle ggf. benötigten Eingabeparameter angegeben haben, können Sie die XML-Daten über die Methode GetDataAsXml abrufen. GetDataAsXml sendet die aktuellen Parameterwerte an den Provider, ruft ein Datenpaket ab, konvertiert es in ein XML-Dokument und gibt dieses als String aus. Sie können diesen String in einer Datei speichern:
var
XMLDoc: TFileStream;
XML: string;
begin
XMLTransformClient1.ProviderName := 'Provider1';
XMLTransformClient1.TransformGetData.TransformationFile := 'CustTableToCustXML.xtr';
XMLTransformClient1.TransFormSetParams.SourceXmlFile := 'InputParams.xml';
XMLTransformClient1.SetParams('', 'InputParamsToDP.xtr');
XML := XMLTransformClient1.GetDataAsXml('');
XMLDoc := TFileStream.Create('Customers.xml', fmCreate or fmOpenWrite);
try
XMLDoc.Write(XML, Length(XML));
finally
XMLDoc.Free;
end;
end;
XMLTransformClient1->ProviderName = "Provider1";
XMLTransformClient1->TransformGetData->TransformationFile = "CustTableToCustXML.xtr";
XMLTransformClient1->TransFormSetParams->SourceXmlFile = "InputParams.xml";
XMLTransformClient1->SetParams("", "InputParamsToDP.xtr");
AnsiString XML = XMLTransformClient1->GetDataAsXml("");
TFileStream pXMLDoc = new TFileStream("Customers.xml", fmCreate || fmOpenWrite);
__try
{
pXMLDoc->Write(XML.c_str(), XML.Length());
}
__finally
{
delete pXMLDoc;
}
Aktualisierungen an einem XML-Dokument in einen Provider übernehmen
Mit TXMLTransformClient ist es ferner möglich, alle in einem XML-Dokument enthaltenen Daten in die Datenmenge des Providers einzufügen oder alle in einem XML-Dokument enthaltenen Datensätze aus der Datenmenge des Providers zu entfernen. Für diese Aktualisierungen rufen Sie die Methode ApplyUpdates auf, und übergeben Folgendes:
- Einen String, der als Wert den Inhalt des XML-Dokuments mit den einzufügenden bzw. zu löschenden Daten enthält.
- Den Namen einer Transformationsdatei, die zum Konvertieren der XML-Daten in ein Einfüge- oder Lösch-Delta-Paket dient. (Beim Definieren der Transformationsdatei mit XMLMapper können Sie angeben, ob die Transformationsdatei für ein Einfüge- oder Lösch-Delta-Paket verwendet werden soll.)
- Die Anzahl von Aktualisierungsfehlern, die toleriert werden können, bevor die Aktualisierung abgebrochen wird. Wenn weniger Datensätze eingefügt oder gelöscht werden können als angegeben, gibt ApplyUpdates die Anzahl der Fehler zurück. Wenn mehr Datensätze eingefügt oder gelöscht werden können als angegeben, wird die gesamte Aktualisierungsoperation zurückgesetzt, und es erfolgt keine Aktualisierung.
Mit dem folgenden Aufruf wird das XML-Dokument Customers.xml in ein Delta-Paket konvertiert, und alle Aktualisierungen werden unabhängig von der Anzahl der Fehler übernommen:
StringList1.LoadFromFile('Customers.xml');
nErrors := ApplyUpdates(StringList1.Text, 'CustXMLToInsert.xtr', -1);
StringList1->LoadFromFile("Customers.xml");
nErrors = ApplyUpdates(StringList1->Text, "CustXMLToInsert.xtr", -1);