HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Adatbázis táblát XML formátumba átalakító komponens


Példaprogram letöltése

8553 bájt

Az XML szabvány sok minden más mellett lehetővé teszi adatkészletek tárolását is. Ebben a példában egy olyan komponenst készítünk, amely egy tetszőleges adatbázis tábla tartalmát képes elmenteni egy XML fájlba.
A mellékelt példaprogram megnyitása előtt a DbToXml.pas-ban lévő komponenst telepítenie kell a Delphi alá.

A komponens a DataSource property-n keresztül elérhető adatkészletet menti el XML formátumban. A FileName property-ben lehet megadni az XML fájl nevét. Az XML fájl tartalmazni fogja az adatkészlet mezőinek tulajdonságait, valamint a rekordokat is.
Az exportálás az Execute metódus meghívására indul. Ennek kétféle formája van. Az egyiknél paraméterként megadhatjuk a fájl nevét, a másiknál viszont nem kell paramétert megadni, ekkor a FileName property értékét használja. A UseCRLF property igaz érték esetén minden elem külön sorba kerül. Így a fájl jobban olvasható egy egyszerű szövegszerkesztőben, de elemenként két bájttal nagyobb lesz a mérete. Egy XML fájlt egyébként az Internet Explorer akkor is helyesen, hierarchikus elrendezésben jeleníti meg, ha az elemek közvetlenül egymás után következnek.

Az XML fájlt egy TFileStream típusú objektumon keresztül fogjuk kezelni. Az eljárás elején ellenőrizzük, hogy a DataSource property-ben a DataSource komponens meg van-e adva, és ha igen, akkor annak DataSet property-jéhez van-e adatkészlet kapcsolva (pl. Table, Query, stb.). Ha minden rendben, akkor létrehozzuk a fájlt, és kiírjuk bele a megfelelő adatokat.
Az XML fájl első sora a szokásos azonosító sor, amely az XML verziószámát, valamint a standalone attribútumot tartalmazza.
A gyökér elem neve DATAPCKET lesz. Ezen belül a mezők és kulcsok tulajdonságait tartalmazó adatok a METADATA csomóponton belül találhatók. Itt van a FIELDS csomópont is, amin belül egy-egy FIELD elem található a mezők tulajdonságaival. Ebben a mező típusától függően többféle attribútum is szerepelhet, de a mező nevét és típusát meghatározó attribútum, az attrname és a fieldtype attribútumok minden esetben megtalálhatók. Amennyiben a mező neve speciális karaktereket is tartalmaz (pl. szóköz), akkor egy fieldname attribútum is szerepel, amely a mező eredeti nevét tartalmazza. Az ilyen speciális karaktereket tartalmazó mezőneveket nem tudjuk közvetlenül felhasználni, mivel a rekordoknál a ROW elemekben attribútumként szerepelnek, így meg kell felelniük bizonyos formai követelményeknek. Ezekből a mezőnevekből a ValidFieldName függvénnyel állítunk elő érvényes neveket, amely függvény az érvénytelen karaktereket egy aláhúzás („_”) karakterrel helyettesíti.
Ide tartozik még a GetFieldDefStr függvény, amely a paraméterként átadott TFieldDef objektumból előállítja a mező típusát leíró sztringet. A komponens nem támogatja az összes mezőtípust, ezért a SupportedType függvénnyel ezt ellenőrizzük.
Egy teljes meződefiníciót tartalmazó elem, amely például egy automatikus számlálót tartalmaz, így fog kinézni:
<FIELD fieldname=”Számláló” attrname=”Sz_ml_l_” fieldtype=”i4” readonly="true" SUBTYPE="Autoinc" />
A tábla kulcsmezőit is elmentjük, ehhez viszont ellenőriznünk kell, hogy az adott mező kulcsmező-e. Ha az, akkor a Key sztringhez hozzáadjuk a mező sorszámát, természetesen sztringgé alakítva. A Key sztringben a kulcsmezők sorszámai lesznek felsorolva, szóközzel elválasztva. Ez a formátum megfelel az XML fájlban történő tárolási formátumnak is, ami a FIELDS elem lezárása után következik. A FIELDS elem után egy PARAMS elemben megadjuk a tábla kulcsmezőit, de csak akkor, ha vannak ilyenek:
  if Key<>'' then
    Write('<PARAMS DEFAULT_ORDER="'+Key+'" PRIMARY_KEY="'+Key+'" />');
Ha például az első két mező egyben a kulcs is, akkor a PARAMS elem a következőképpen fog kinézni:
<PARAMS DEFAULT_ORDER="1 2" PRIMARY_KEY="1 2" />
Ezzel a METADATA blokkot le is zárhatjuk, és elkezdhetjük a rekordok tárolását. A rekordok egy ROWDATA elemen belül lesznek elhelyezve, minden rekordnak egy-egy ROW elem felel meg. A ROW elem attribútumai a FIELD elemek attrname attribútumaiban megadott értékek lesznek, minden attribútumnak a rekord megfelelő mezőjének tartalma lesz az értéke. Ha például az alábbi mező definíciók voltak a FIELDS blokkon belül:
<FIELDS>
  <FIELD attrname="VendorNo" fieldtype="r8" />
  <FIELD attrname="VendorName" fieldtype="string" width="30" />
</FIELDS>
akkor a ROW elemek a következőképpen néznek ki:
<ROWDATA>
<ROW VendorNo="2641" VendorName="Underwater" />
<ROW VendorNo="2674" VendorName="J.W.  Luscher Mfg." />
</ROWDATA>
A rekordokon egy ciklusban megyünk végig, de előtte két dolgot meg kell tenni. Először is le kell tiltani az DataSource komponenshez tartozó kontrolokat, majd meg kell jegyezni, hogy éppen melyik rekordon álltunk.
var
  bm: TBookMark;
...
  FDataSource.DataSet.DisableControls;
  bm:= FDataSource.DataSet.GetBookmark;
Az aktuális rekordból az adatokat a GetFieldDataStr függvénnyel olvashatjuk ki. Ennek paramétere egy TFieldDef típusú objektum, amely az aktuális mező tulajdonságait tartalmazza.
Miután az összes rekordot elmentettük, újra engedélyezzük a kontrolokat, és visszaállunk az előzőleg elmentett pozícióba.
  FDataSource.DataSet.GotoBookmark(bm);
  FDataSource.DataSet.FreeBookmark(bm);
  FDataSource.DataSet.EnableControls;
A GetFieldDataStr függvény nem minden típusú mezőnek képes kiolvasni az adatait, ezért például a ftGraphics mezőknél egy üres értéket kapunk.




Cikksorozat

#IDKategóriaCikk címeSorozat
1166DelphiOsztály hierarchia lekérdezése1. rész
1180DelphiOsztály hierarchia lekérdezése2. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2001 évkönyv 528. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |