Delphi - TSQLDataSet osztály

dbExpress paletta 2. rész

forráskód letöltése
Az SQLDataSet osztály általános célú, többféle feladatra használható komponens, hozzáférést biztosít az adatbázis különböző adatkészletéhez.
A mellékelt példához az Interbase példa adatbázisát használjuk. Ha az employee.gdb nem az alapértelmezett helyen található (C:\Program Files\Common Files\Borland Shared\Data\employee.gdb), akkor a program futtatása előtt az SQLConnection1 komponens Params property-jében a Database mező értékét javítsa.
Az osztályt felhasználhatjuk komponens formájában, de futási időben is létrehozhatjuk.
A TSQLDataSet osztály a következő feladatokra használható:
  • egy adatbázisban található tábla összes rekordjának lekérdezése;
  • egy tábla adott rekordjainak lekérdezése (SELECT);
  • egy tárolt eljárás eredményének lekérdezése;
  • olyan lekérdezések és tárolt eljárások futtatása, melyeknek nincs visszatérési értéke;
  • meta-adatok lekérdezése (táblák nevei, tárolt eljárások, stb.).
A TSQLDataSet osztály közvetlenül a TCustomSQLDataSet osztályból származik, ami az alapja minden dbExpress adatkészletnek (TSQLQuery, TSQLTable, stb.).
A komponens egy egyirányú adatforgalmat tesz lehetővé, tehát az általa reprezentált adatok nem szerkeszthetők közvetlenül, hiába kapcsoljuk a komponenst egy DataSource komponenshez. Van azonban lehetőség így is erre az UPDATE parancs használatával, vagy a ClientDataSet és DataSetProvider komponensek (Data Access paletta) használatával. A DataSetProvider komponens DataSet property-jében adjuk meg az SQLDataSet komponenst, majd a ClientDataSet komponens ProviderName property-jében a DataSetProvider komponenst. Ezután a ClientDataSet komponenst kapcsoljuk egy DataSource komponenshez ugyanúgy, mint ahogyan egy egyszerű Table komponenssel tennénk.
A SQLDataSet komponens használatához feltétlenül szükség van egy SQLConnection komponensre, amit az SQLConnection property-ben kell megadni.
CommandText
Ebben a property-ben tudjuk megadni a futtatandó SQL script-et, a tárolt eljárás nevét, vagy a tábla nevét. Ez attól függ, hogy a CommandType property-ben mit adtunk meg. Az SQL script szerkesztéséhez használhatunk egy egyszerű szerkesztőt, a CommandText Editor-t.
CommandType
Ebben a property-ben adhatjuk meg, hogy pontosan milyen formában kívánjuk felhasználni a komponenst, vagyis milyen adatokat szeretnénk elérni vele.
Értékei a következők lehetnek:
  • ctQuery: egy tetszőleges SQL script adható meg a CommandText property-ben. Ez általában egy SELECT lekérdezés;
  • ctTable: a komponens egy teljes táblát reprezentál. A CommandText property-ben a tábla nevét tudjuk megadni;
  • ctStoredProc: tárolt eljárás futtatása. A CommandText property-ben az adatbázisban lévő tárolt eljárások egyikét választhatjuk ki.
DataSource
Ebben a property-ben megadhatjuk a paramétereket tartalmazó táblához (master) kapcsolt DataSource komponenst. Amennyiben a CommandText property egy paraméterezett lekérdezést tartalmaz, de az alkalmazás nem biztosítja a megfelelő paramétereket a Params property-n keresztül, akkor az ebben a property-ben megadott adatforrásból veszi azokat. Ha az aktuális rekord adatai megváltoznak a paramétereket tartalmazó adatkészletben, akkor az SQLDataSet adatkészlet is frissítődik az új értékeknek megfelelően.
DesignerData
Ez egy string típusú property, melynek nincs előre definiált jelentése. Az alkalmazás készítője (vagyis mi) tetszőleges feladatokra használhatja fel.
IndexDefs
Ez a property tartalmazza az összes Index definíciót, amit az adatbázis szerver az adatkészlethez rendelt. Az index definíciókat nem használja közvetlenül a komponens a rekordok rendezésére, hanem azok sorrendje az SQL lekérdezés ORDER BY kulcsszava után felsorolt mezők szerint lesz rendezveA TCustomSQLDataSet osztályból származtatott osztályokban ez a property tartalmazza az indexet definícióit. Az itt felsorolt idexek egyikének nevét adhatjuk meg az IndexName property-ben.
MaxBlobSize
Egy adatbázisban tárolhatunk olyan bináris adatokat is, amelyek mérete nem meghatározott, illetve nem felelnek meg egyetlen jól meghatározható adattípusnak sem. Az ilyen adatokat ún. BLOB (Binary Large Object) típusú mezőkben tárolhatjuk. Az ilyen mezők maximális méretét határozza meg a MaxBlobSize property.
Ha a property értéke –1, akkor az adatbázis szerver nem korlátozza az ilyen típusú mezők méretét. Ha az értéke 0, akkor az SQL kapcsolat létrehozásánál megadott paramétereket használja, ha pedig nagyobb mint 0, akkor a pontos méretét adja meg a BLOB mezőknek.
NoMetadata
A property meghatározza, hogy az adatokkal együtt a meta információkra is szükség van-e. Ha a property-nek hamis értéket adunk, akkor az megnövelheti a teljesítményt, amennyiben az adatkészlethez sok index tartozik, mivel ezeket nem kell a szervernek elküldenie. Mindemellett viszont az adatok módosítása lassúbb lehet, ha a ClientDataSet és DataSetProvider komponenseken keresztül történik.
A property-nek minden olyan műveletnél, ami indexeket használ, hamisnak kell lennie (pl. master-detail kapcsolat, adatok módosítása ClientDataSet-en keresztül, ha a DataSetProvider komponens UpdateMode property-jének értéke nem upWhereAll).
ParamCheck
Ez a logikai típusú property azt adja meg, hogy a paraméterlista frissítve lett-e az SQL script megváltoztatásakor. Alapesetben a Parameters property tartalma, vagyis a paraméterlista automatikusan frissítődik, a CommandText property (illetve TSQLQuery esetén az SQL property) tartalma szerint. Ez azt jelenti, hogy amikor ez a property megváltozik, akkor a paraméterlista újra generálódik. Néhány speciális esetben viszont ez nem történik meg. Például amikor DDL-ben (Data Definition Language – adatdefiníciós nyelv) egy tárolt eljárást adunk meg, akkor ennek valószínűleg lesznek paraméterei, viszont ezek nem a DLL paraméterei.
Ahhoz, hogy a paraméterlista ne készüljön el automatikusan, a property értékét állítsuk hamisra.
Params
Az SQL script vagy tárolt eljárás paraméterei. A paraméterlista automatikusan létrejön a CommandText property-ből. Minden paraméterhez tartozik egy TParam osztály, amiben a paraméter tulajdonságait és értékét tudjuk megadni. Ennek dataType property-jében kell megadni a paraméter típusát. Tárolt eljárásnál ellenőrizni kell a paraméterek számát és típusát, mert előfordulhat, hogy az adatbázis szerver nem, vagy nem jól adja meg ezeket.
Prepared
A property-ből megtudható, hogy a lekérdezés (vagy más SQL utasítás) elkészült-e, mielőtt futtatnánk. Ez automatikusan megtörténik az Open vagy ExecSQL (vagy ExecProc) metódusok meghívásakor. Amikor az SQL adatkészlet előkészítése megtörtént, akkor a dbExpress, illetve az adatbázis szerver lefoglalja a szükséges erőforrásokat az SQL lekérdezésnek és paramétereinek.
Ha a lekérdezést vagy tárolt eljárást többször is futtatjuk, akkor állítsuk a Prepared property értékét igazra, mielőtt megnyitnánk az adatkészletet. Ezzel a teljesítményt kedvező irányba befolyásolhatjuk, mivel az adatkészletet csak egyszer kell előállítani, és nem kell minden megnyitáskor várni rá. Ha viszont arra van szükségünk, hogy minden megnyitás előtt újra legyen generálva a lekérdezés, akkor állítsuk a property értékét hamisra. Ezt kell tennünk például akkor, amikor egy paraméter, vagy a SortFieldNames property értékét megváltoztatjuk.
ProcParams
Ha az SQL adatkészlet egy tárolt eljárás eredménye, akkor ebben a property-ben vannak felsorolva a tárolt eljárás paraméterei. Ez a property protected, tehát az alkalmazásból közvetlenül nem tudjuk használni, viszont a Params property-ben megtalálhatók a paraméterek, melyek ennek a listának az alapján lettek beállítva.
RecordCount
Amikor az adatkészlet megnyitott állapotban van, akkor az abban szereplő rekordok számát adja meg a property. Több eset is előfordulhat, amikor a property használata hibát okoz. Ezek a következők:
  • az adatkészlet egy tárolt eljárást reprezentál;
  • egy olyan lekérdezés eredménye, amely paramétereket is használ;
  • több tábla összekapcsolásából létrejött adatkészlet.
RowsAffected
Ha az adatkészlet egy olyan lekérdezést reprezentál, aminek nincs visszatérési értéke, akkor a RecordCount property nem használható annak megállapítására, hogy a művelet hány rekordot érintett (módosítás, törlés). Erre használhatjuk viszont a RowsAffected property-t. Ha nem érintett egy rekordot sem, akkor a property értéke 0. Ha a művelet közben valami hiba történi, akkor az értéke –1, ez általában kivétellel (hibaüzenettel) is jár.
SortFieldNames
Ezt a property-t akkor használhatjuk, ha a CommandType property értéke ctTable. A property-ben kell felsorolni azokat a mezőket, melyek tartalma szerint a rekordokat sorba kell rendezni. Az elsődleges rendezési szempont az elsőnek megadott mező tartalma, utána a második, és így tovább.
SQLConnection
Az adatbázissal való kapcsolatot megvalósító SQLConnection komponens, amihez az SQLDataSet komponenst kapcsoljuk. Ez legyen az első property, amit beállítunk, mert néhány property csak akkor adható meg helyesen, ha ezt megadtuk (pl. Params).
TransactionLevel
Annak a tranzakciónak az azonosítója, ahová ez az adatkészlet tartozik. Ez az érték a StartTransaction (TSQLConnection) eljárásnál használt azonosító. Ha a property értéke 0, akkor a tranzakciók az indítás sorrendjében hajtódnak végre.
A legtöbb alkalmazásnál nem kell ezt a property-t használni, mivel a tranzakciók indítás szerinti sorrendben történő végrehajtása megfelelő. InterBase adatbázis esetén viszont az egyes tranzakciók átfedhetik egymást, itt van értelme a property használatának.
ExecSQL
Ha olyan lekérdezést, vagy tárolt eljárást szeretnénk futtatni, aminek nincs visszatérési értéke, akkor használjuk ezt a függvényt. A SELECT lekérdezések nyilván nem tartoznak ide, viszont a DELETE, UPDATE, INSERT és CREATE TABLE műveletek igen. Az ExecDirect paraméterben megadhatjuk, hogy a lekérdezést újra kell-e generálni, például azért, mert az paraméterezett. Ez utóbbi esetben a paraméter értéke hamis kell hogy legyen. A függvény visszatérési értéke az érintett rekordok száma (lásd RowsAffected property).
Ne futtassunk olyan lekérdezést, aminek van visszatérési értéke. Ilyen például a SELECT lekérdezés, vagy ha a CommandType property értéke ctTable, stb.
CreateBlobStream
A függvény visszatérési értéke egy TStream osztály, amin keresztül a BLOB mező tartalmát feltölthetjük adattal, illetve amin keresztül kiolvashatjuk az adatokat. A függvény első paramétere a mező objektuma (TField), a második pedig egy TBlobStreamMode típusú érték, amely a következők egyike lehet:
  • bmRead: a mező tartalmát csak kiolvassuk;
  • bmWrite: a mező tartalmát csak módosítjuk;
  • bmReadWrite: lekérdezzük és módosítjuk is a mező tartalmát.
A mező objektumának típusa TBlobField, vagy ennek leszármazottja kell hogy legyen.
GetKeyFieldNames
A függvény a paraméterként megadott TStrings típusú objektumot feltölti az adatkészlethez definiált indexekben található mezőnevekkel. Minden sor a listában egy-egy indexhez tartozik, melyben a mezőnevek pontosvesszővel vannak egymástól elválasztva.
GetQuoteChar
Ez a függvény az idézőjelként használt karaktert, illetve karaktereket adja vissza, melyek az SQL lekérdezésben vannak használva.
IsSequenced
Ha a property értéke igaz, akkor a RecNo property a rekordok sorszámát adja vissza, illetve a property-vel meghatározhatjuk, hogy melyik rekordra pozícionálunk.
A TCustomSQLdataSet osztályban a property értéke mindig hamis, mivel a rekordokhoz nem rendel sorszámot.
ParamByName
A függvény a megadott nevű paraméter TParam objektumát adja vissza. Ez a függvény használható a paraméterek értékeinek futásidőben történő megadására.
SetSchemaInfo
Az eljárás megadja, hogy az adatkészlet meta-adatot tartalmaz-e, és ha igen, akkor pontosan milyet. Az első paraméter a SchemaType, melynek értékei a következők lehetnek:
  • stNoSchema: az adatkészlet a lekérdezés vagy tárolt eljárás adatait tartalmazza, és nem meta-adatokat;
  • stTables: az adatbázisban található táblák listája, a TableScope property-ben meghatározott feltételek alapján;
  • stSysTables: az adatbázis által használ rendszer táblák. Nem minden adatbázis használ ilyeneket a meta-adatok tárolására, ekkor az adatkészlet üres;
  • stProcedures: az adatbázisban használt tárolt eljárások listája;
  • stColumns: a megadott tábla mezőinek listája;
  • stProcedureParams: a megadott tárolt eljárás paramétereinek száma;
  • stIndexes: a megadott tábla indexeinek listája.
A második és harmadik paraméter a SchemaObjectName és a SchemaPattern. A SchemaObjectName a tábla vagy tárolt eljárás neve, amiről az információkat lekérdezzük (stColumns, stIndexes, stb.). Azoknál a típusoknál, ahol nincs szükség ezek nevére, a paraméter egyszerűen nem lesz figyelembe véve (pl. stTables, stProcedures, stb.).
A SchemaPattern egy SQL maszk, aminek a lekérdezett adatoknak meg kell felelniük. Ha például a táblák neveit kérdezzük le, és egy tábla neve nem felel meg a maszknak, akkor az nem fog szerepelni az eredményben. A maszkban használhatjuk a „%” karaktert több karakter, és a „_” karaktert egy karakter helyettesítésére. Ha ténylegesen a „%” illetve „_” jelre van szükségünk, akkor adjuk meg duplán azokat: „%%” illetve „__”. Ha nem akarunk maszkot használni, akkor adjunk meg egy üres sztringet.
Ha a CommandText property-t megváltoztatjuk, akkor a SchemaType értéke automatikusan stNoSchema lesz.
A TSQLDataSet osztály a TDataSet osztályból származik, tehát az itt felsoroltakon kívül további property-kkel, metódusokkal és eseményekkel rendelkezik.

dbExpress paletta cikksorozat