
A mellékelt példaprogram megnyitása előtt az ADOXMLConverter.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponens a TComponent osztályból származik. Tartalmaz egy Recordset property-t, amelyen keresztül hozzárendelhetjük egy ADO komponenshez. Ez lehet mondjuk egy TADOQuery vagy egy TADOTable komponens. A Recordset property TCustomADODataSet típusú.
A komponensnek szüksége van egy XmlFilename String típusú property-re, amelyben megadhatjuk majd annak az állománynak a nevét, amelybe az adatokat el szeretnénk menteni, illetve ahonnan be szeretnénk olvasni azokat.
A RecordsetToXML függvény
function RecordsetToXML(const Recordset: _Recordset): String;
A függvény a Recordset-ből XML formátumot készít. Működésének lényege az alábbi forráskódban látható.
RS:=CreateOleObject('ADODB.Recordset');
RS:=Recordset;
RS.Save(TStreamAdapter.Create(Stream) as IUnknown, adPersistXML);
Stream.Position:=0;
Result:=Stream.DataString;
Az RS egy Variant, a Stream pedig egy TStringStream típusú változó. Az RS értékül kapja a Recordset tulajdonságot, majd azt elmenti a Stream változóba. A Stream változóba már az XML formátum kerül. Ez a konverzió az adPersistXML paraméter hatására jön létre.
A függvény hívása a következő módon történhet:
Memo1.Lines.Text:=ADOXMLConverter1.RecordsetToXML(ADOQuery1.Recordset);
A RecordsetFromXML függvény
Function RecordsetFromXML(const XML: String): _Recordset;
A függvény az XML paraméterben kapott XML formátumú szöveget átalakítja Recordset tulajdonsággá, és ezt adja visszatérési értékként.
Stream:=TStringStream.Create(XML);
Stream.Position:=0;
RS:=CreateOleObject('ADODB.Recordset');
RS.Open(TStreamAdapter.Create(Stream) as IUnknown);
Result:=IUnknown(RS) as _Recordset
A függvény hívása a következő módon történhet:
ADOQuery1.Recordset:=ADOXMLConverter1.RecordsetFromXML(Memo1.Lines.Text);
A SaveToXmlFile eljárás
Procedure SaveToXmlFile(const Recordset: _Recordset);
Az eljárás működése hasonlít a RecordsetToXML függvény működéséhez, csak az XmlFileName property-ben megadott állományba menti el az átkonvertált adatokat. A RecordsetToXML függvénnyel ellentétben itt a Stream (TStringStream) változó helyett a MemoryStream (TMemoryStream) változót használjuk, amely képes tartalmát elmenteni egy fájlba.
MemoryStream.SaveToFile(fXMLFileName);
A függvény hívása a következő módon történhet:
ADOXMLConverter1.XmlFileName:='Temp.xml';
ADOXMLConverter1.SaveToXmlFile(ADOQuery1.Recordset);
A ReadFromXmlFile függvény
Function ReadFromXmlFile: _Recordset;
A függvény működése hasonlít a RecordsetToXML függvény működéséhez, csak az XmlFileName property-ben megadott állományból olvassa be az adatokat. A SaveToXmlFile eljáráshoz hasonlóan itt is TMemoryStream-et használunk.
MemoryStream.LoadFromFile(fXMLFileName);
A függvény hívása a következő módon történhet:
ADOXMLConverter1.XmlFileName:='Temp.xml';
ADOQuery1.Recordset:=ADOXMLConverter1.ReadFromXmlFile;
A Notification eljárás
Ha a Recordset tulajdonságot beállítjuk, majd letöröljük azt a komponenst, amire az mutat, akkor máris szembe találjuk magunkat az „Access Violation” ablakkal. Ez a metódus hivatott kivédeni ezt a problémát az alábbi kóddal.
if (AComponent=fRecordset) and (Operation=opRemove) then
fRecordset:=nil;