Hallo,<br>
ich versuche, ein ADO-Recordset möglichst performant in XML zu wandeln. In einer Diskussion aus dem Jahre 2001 schrieb Andreas Kosch, dass es prinzipiell 3 Wege gäbe, dies zu tun.<br>
<ul>
<li>
<font color="#000080">
a) RecordSet-Objekt: SaveToFile (mit der pfXML-Anweisung), oder</font>
</li>
<li>
<font color="#000080">
b) RecordSet+Stream-Objekt:
aStrm := CoStream.Create;
aRS.Save(aStrm, adPersistXML);
sXML := aStrm.ReadText(aStrm.Size);</font>
</li>
<li>
<font color="#000080">
c) DOMDocument-Objekt:
aXML := CoDOMDocument30.Create;
aRS.Save(aXML, adPersistXML);
sXML := aXML.xml;</font>
</li>
</ul>
<font color="#000080">
Zitat: 'Der Weg c) ist von der Performance her gesehen der Schnellste.'<br>
<br>
</font>
Weg a) kommt aus technischen Gründen nicht in Frage.
<font color="#000080">
<br>
</font>
Ein paar Test haben ergeben, dass Weg b) in der Praxis völlig inakzeptabel ist.
Es scheint sogar als ob sich die benötigte Zeit mit steigender Datenmenge exponentiell
erhöht. Weg c) führt zu akzeptablen Werten (=18 Sekunden, ca. Faktor 10
bei 2000 Datensätzen und einer 'XML-Datenmenge' von 3,24 MB gegenüber Weg b))<br>
<br>
Es gibt jedoch noch einen Weg über den TStringStream, der noch schneller ist,
als Weg c). Mit den obigen Testdaten nochmals um ca. Faktor 4. Das ist bei einer
absoluten Zeit von 4 Sekunden gegenüber 16 Sekunden ein gravierender
Performancegewinn.
<pre>
function RecordsetToXML(const aRS: _Recordset): string;
var
Stream : TStringStream;
begin
Result := '';
if aRS = nil then Exit;
Stream := TStringStream.Create('');
try
aRS.Save(TStreamAdapter.Create(Stream) as IUnknown, adPersistXML);
Stream.Position := 0;
Result := Stream.DataString;
finally
Stream.Free;
end;
end;</pre>
Die Sache hat jedoch einen Haken: Irgendwie scheint der StringStream nicht mit
dem Unicode aus aRS.Save zurechtukommen. Nach dem Speichern (aRS.Save) in den
Stream, sind die Umlaute nicht mehr lesbar bzw. wurden durch andere Zeichen
ersetzt.<br>
Wie könnte man den Weg über den Stringstream verwenden, ohne dass die Umlaute
verschwinden ? Es wäre ein sehr schneller Weg, an die XML Daten zu kommen.<br>
Viele Grüsse an's Forum<br>
Hermann<br>
<br>
Umgebung: ADO 2.7, Delphi 6.2, MS-SQL Server 7 (Codepage 1252)<br>
ich versuche, ein ADO-Recordset möglichst performant in XML zu wandeln. In einer Diskussion aus dem Jahre 2001 schrieb Andreas Kosch, dass es prinzipiell 3 Wege gäbe, dies zu tun.<br>
<ul>
<li>
<font color="#000080">
a) RecordSet-Objekt: SaveToFile (mit der pfXML-Anweisung), oder</font>
</li>
<li>
<font color="#000080">
b) RecordSet+Stream-Objekt:
aStrm := CoStream.Create;
aRS.Save(aStrm, adPersistXML);
sXML := aStrm.ReadText(aStrm.Size);</font>
</li>
<li>
<font color="#000080">
c) DOMDocument-Objekt:
aXML := CoDOMDocument30.Create;
aRS.Save(aXML, adPersistXML);
sXML := aXML.xml;</font>
</li>
</ul>
<font color="#000080">
Zitat: 'Der Weg c) ist von der Performance her gesehen der Schnellste.'<br>
<br>
</font>
Weg a) kommt aus technischen Gründen nicht in Frage.
<font color="#000080">
<br>
</font>
Ein paar Test haben ergeben, dass Weg b) in der Praxis völlig inakzeptabel ist.
Es scheint sogar als ob sich die benötigte Zeit mit steigender Datenmenge exponentiell
erhöht. Weg c) führt zu akzeptablen Werten (=18 Sekunden, ca. Faktor 10
bei 2000 Datensätzen und einer 'XML-Datenmenge' von 3,24 MB gegenüber Weg b))<br>
<br>
Es gibt jedoch noch einen Weg über den TStringStream, der noch schneller ist,
als Weg c). Mit den obigen Testdaten nochmals um ca. Faktor 4. Das ist bei einer
absoluten Zeit von 4 Sekunden gegenüber 16 Sekunden ein gravierender
Performancegewinn.
<pre>
function RecordsetToXML(const aRS: _Recordset): string;
var
Stream : TStringStream;
begin
Result := '';
if aRS = nil then Exit;
Stream := TStringStream.Create('');
try
aRS.Save(TStreamAdapter.Create(Stream) as IUnknown, adPersistXML);
Stream.Position := 0;
Result := Stream.DataString;
finally
Stream.Free;
end;
end;</pre>
Die Sache hat jedoch einen Haken: Irgendwie scheint der StringStream nicht mit
dem Unicode aus aRS.Save zurechtukommen. Nach dem Speichern (aRS.Save) in den
Stream, sind die Umlaute nicht mehr lesbar bzw. wurden durch andere Zeichen
ersetzt.<br>
Wie könnte man den Weg über den Stringstream verwenden, ohne dass die Umlaute
verschwinden ? Es wäre ein sehr schneller Weg, an die XML Daten zu kommen.<br>
Viele Grüsse an's Forum<br>
Hermann<br>
<br>
Umgebung: ADO 2.7, Delphi 6.2, MS-SQL Server 7 (Codepage 1252)<br>
Comment