|
|
MS SQL adatbázis kezelés Delphi-ből
26. rész
|
|
Példaprogram letöltése
8501 bájt
|
Az ügyfél-kiszolgáló alkalmazások kétrétegűek, az egyik réteg a kiszolgáló vagy szerver, a másik réteg az ügyfél vagy kliens. Bizonyos alkalmazások esetén ezt a struktúrát többfelé is bonthatjuk, így többrétegű alkalmazásról beszélhetünk. A többrétegű alkalmazás tehát több, egymással együttműködő logikai egységből áll, amelyek szétszórva helyezkednek el a hálózat számítógépein.
Ennek megvalósításáról lesz szó mostani cikkünkben.
Ily módon a kliens alkalmazásunk egész vékony lehet, az üzleti logikát pedig központosíthatjuk. A többrétegű alkalmazások 'legegyszerűbb' formája a háromrétegű alkalmazás. A megjelenítési réteg tartalmazza a felhasználói interfészt, az adatszolgáltatási réteg működteti az adatbázis funkciókat és az üzleti szabályok (business rules) rétege jelenti a középső réteget, az itt megvalósított funkciók miatt akarunk tulajdonképpen programot írni. A középső réteg, vagyis az alkalmazás szerver menedzseli az ügyfél és az adatbázis szerver közti adatforgalmat, ezért data broker-nek is nevezik. Bonyolultabb rendszerekben további rétegeket tehetünk az ügyfél és az adatbázisszerver közé. Ilyen lehet például egy security services broker, ami a tranzakciók biztonságára felügyel.
A többrétegű alkalmazások támogatása a Delphiben a MIDAS (Multi-tier Distributed Application Services Suite) technológiára épül. A MIDAS lényegében egy adatkommunikációs technológia. A MIDAS stílusú kommunikáció két résztvevője a provider és a client dataset, amelyek adatcsomagok (data packet) formájában cserélnek információt egymással. Alacsony szinten az adatcsomag nem más, mint egy byte-folyam, de szerencsére nekünk ezzel nem kell foglalkoznunk; táblákat fogunk küldözgetni, amik akár BLOBokat vagy beágyazott táblákat is tartalmazhatnak.
Nézzük meg röviden a résztvevőket.
A client dataset adatokat kap a providertől, azokat a belső memória cache-ében tárolja, és hozzáférést biztosít ezekhez az adatokhoz. Minden adatmódosítás egy naplóban kerül rögzítésre. Az eredeti adatok a client dataset Data property-én keresztül érhetők el, a napló pedig a Delta property-n keresztül. A client dataset által birtokolt adatok bármikor egy külső fájlba menthetők. Azon túl, hogy a client dataset adataihoz hozzáférünk és módosíthatjuk azokat, szűrhetjük, sorba rendezhetjük őket és kereshetünk bennük. A client datasetnek nincs tudomása az adatok forrásáról.
Az adatcsomagok felépítése a provider komponens feladata. Az adatok előkészítése teljes mértékben a programozó feladata, azok származhatnak egy SQL lekérdezésből, de akár byte-onként is előállíthatjuk őket tetszőleges forrásból. A végeredmény mindenképpen egy egységesített formájú tábla lesz. A tábla mezeinek típusa szinte bármi lehet, sztring, egész típusok, dátum, BLOB, sőt még dataset típusú is lehet. Az egyes mezőkhöz vagy sorokhoz megszorításokat (constraint) kapcsolhatunk, amivel szabályozhatjuk, hogy mi kerülhet az egyes mezőkbe. Amikor egy kliens alkalmazás frissíti a client dataset adatait, a megszorítások automatikusan érvényre jutnak. Ha egy megszorítás feltétele nem teljesül, a frissítés visszautasításra kerül, és kivétel generálódik.
Mihelyst az adatok bekerültek a client dataset belső cache-ébe, lehetőségünk van azokat módosítani. A client dataset nyilvántart minden módosítást, és memóriában tárolt indexeket tart karban annak érdekében, hogy az adatokat különféle sorrendben szolgáltathassa. Továbbá a client dataset támogatja a Document/View architektúrát, ami azt jelenti, hogy ugyanannak az adatcsomagnak több nézetét is létrehozhatjuk egyszerre. Ezt a műveletet klónozásnak (cloning) nevezik. Egy adatcsomaghoz annyi klónt gyárthatunk, amennyit akarunk.
Ha az adatcsomag valamely adatait sikeresen módosítottuk, frissítenünk kell a forrást is. Ez úgy történik, hogy a client dataset a módosításokat tartalmazó napló állományát (Delta property) elküldi a providernek. Ha az adatok forrása egy adatbázis, akkor a provider képes arra, hogy a változtatásokat automatikusan a megfelelő tábláknak küldje tovább. A frissítési eljárást a programozó teljes mértékben az ellenőrzése alatt tarthatja, ha akarja. Ha a napló egy rekordját nem sikerül érvényesíteni az adatbázisban, a provider a rekordot beírja a hibanaplóba (error log) a hiba szövegével és a rekord forrásbeli értékével együtt. Amikor az egész napló feldolgozása véget ér, a hibák számától függ, hogy a sikeres módosítások commitálódnak-e, vagy visszagörgetődnek. Az 'ingerküszöböt' mi adhatjuk meg. Ez után a provider a hibanaplót visszaküldi a client datasetnek. A visszakapott hibanapló alapján a client dataset végigmegy a saját napló fájlján, és a sikeres módosításokat az adatain is végrehajtja, majd a bejegyzéseket törli a naplóból. Ha problémás rekordot talál, egy esemény keletkezik. Ilyenkor például a felhasználó döntheti el, hogy mi történjen.
Háromféle adatfolyamot láthattunk tehát az előzőekben, amik szóba jöhetnek a client dataset és a provider közti kommunikációban.
1. Adatcsomag megy a providertől a client datasethez, és a belső cache-be kerül.
2. A módosításokat tartalmazó napló (change log) megy a client datasettől a provider felé.
3. A sikertelen módosításokat tartalmazó hibanapló (error log) megy a providertől a client dataset felé.
A MIDAS alapú alkalmazások alapvetően kétféle szerkezetűek lehetnek. Írhatunk monolitikus alkalmazásokat, amik mind a client dataset, mind a provider komponenst tartalmazzák. És írhatunk több alkalmazást is, ahol az egyik alkalmazás tartalmazza a providert, a másik a client dataset komponenst. Az első esetben a programozás során egyszerre látjuk mindkét komponens property-jeit, nem gond az adatcsomagot az egyiktől a másikig eljuttatni. A második esetben már arra is oda kell figyelnünk, hogy milyen módon juttatjuk el az adatcsomagot az egyik helyről a másikra. Használhatjuk a TCP/IP protokollt, az IIOP-t (CORBA) vagy az RPC-t (DCOM és DCE esetében).
Az alapok áttekintése után írjunk egy nagyon egyszerű programot.
Nyissunk egy új applikációt és egy új adatmodult. Az adatmodulra húzzunk le egy TDatabase és egy TQuery komponenst. A TDatabase komponenst kössük rá a Test1 aliasra, vagyis csatlakozzunk az SQL Server pubs adatbázisához. A TQuery komponenst kössük össze az adatbázissal, és az SQL property-be írjuk be: 'SELECT * from titles'. A MIDAS lapról húzzunk le egy TDataSetProvider komponenst, a DataSet property-je mutasson a Query-nkre.
Csináljunk egy TClientDataSet komponenst is, a ProviderName property-jében hivatkozzunk a TDataSetProviderre, majd tegyünk mellé egy TDataSource komponenst, hogy a client datasetet a vizuális komponensek is lássák. A TClientDataSet-et nyissuk meg (Active = true). Tegyünk fel egy TActionList komponenst is az adatmodulra, és csináljunk két Action-t (Érvényesít és Visszavon). Mindkét Action csak akkor legyen elérhető, ha a client datasetet már szerkesztjük, tehát az OnUpdate eseménykezelő függvény legyen a következő:
procedure Tdm1.ActionUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled :=
(ClientDataSet1.State in dsEditModes) or
(ClientDataSet1.ChangeCount > 0);
end;
Az Érvényesítés OnExecute eseménykezelőjében érvényesítsük a client dataset változtatásait, hiba esetén azt jelezzük a képernyőn is.
procedure Tdm1.Action1Execute(Sender: TObject);
begin
if ClientDataSet1.ApplyUpdates(0) > 0 then
raise Exception.Create('Hiba!');
end;
A Visszavon OnExecuteja a következő:
procedure Tdm1.Action2Execute(Sender: TObject);
begin
ClientDataSet1.CancelUpdates;
end;
Már csak a Form elkészítése van hátra. Tegyünk le két gombot (TButton), és kössük össze őket a két Action-nel. Tegyünk le egy TDBNavigatort és egy TDBGridet, és kapcsoljuk össze őket a client datasettel a TDataSource komponensen keresztül. Kész is a program, lehet futtatni.
Indítás után a Pubs adatbázis Titles tábláját látjuk a Provider-en és a Client TDataset-en keresztül. Ha módosítjuk a DBGrid adatait, a módosítások a client dataset Delta property-jében, vagyis a change log-ban gyűlnek. Ha a Visszavon gombra kattintunk, a CancelUpdates metódus meghívásával semmissé válnak a módosítások, vagyis kiürül a change log. Ha az Érvényesít gombra kattintunk, az ApplyUpdates metódus a naplót elküldi a client dataset ProviderName property-jében meghatározott providernek, megvárja, amíg az érvényesíti a változásokat az SQL Serveren, majd fogadja az error logot és ennek megfelelően alakítja a change logját. Visszatérési értékként a hibák számát kapjuk meg. Az ApplyUpdates metódus egy paramétert is kap; specifikálhatjuk, hogy legfeljebb hány hiba merülhet fel az update során. Ha ennél a számnál több hiba keletkezik, az összes változás visszagörög, egyébként commitálódik.
|
Cikksorozat
| 2591 | Windows | Tippek és trükkök - RAS - Modem csengetési szám állítása | 1. rész |
| 2622 | Windows | Tippek és trükkök - Program futtatása más felhasználóként | 2. rész |
| 2640 | Windows | A Windows ikonméretének megváltoztatása és Windows 2000 Asztaltémák | 3. rész |
| 2657 | Windows | Tippek és trükkök - Internet Explorer | 4. rész |
| 2667 | Windows | Tippek és trükkök | 5. rész |
| 2684 | Windows | Alapértelmezések állítása, telepítési fájlok helye, intéző nézetek | 6. rész |
| 2696 | Windows | Biztonsági trükkök | 7. rész |
| 2702 | Windows | Windows XP trükkök | 8. rész |
| 2729 | Windows | Windows 2000 és XP tippek, trükkök | 9. rész |
| 2757 | Windows | Registry trükkök | 10. rész |
| 2784 | Windows | Tippek, trükkök | 11. rész |
| 2829 | Windows | Tippek, trükkök | 12. rész |
| 2889 | Windows | Windows XP tippek | 13. rész |
| 2909 | Windows | Tippek Windows XP-hez | 14. rész |
| 2919 | Windows | Windows tippek | 15. rész |
| 2924 | Windows | Windows tippek | 16. rész |
| 2963 | Windows | Windows tippek | 17. rész |
| 2973 | Windows | Windows Tippek | 18. rész |
| 2981 | Windows | Windows tippek | 19. rész |
| 2990 | Windows | Tippek-trükkök | 20. rész |
| 3027 | Windows | IIS tippek | 21. rész |
| 3034 | Windows | Windows XP tippek-trükkök | 22. rész |
| 3088 | Windows | Windows 2000/XP tippek, trükkök | 23. rész |
| 3133 | Windows | Windows XP tippcsokor | 24. rész |
| 3140 | Windows | Windows XP tippek, trükkök | 25. rész |
| 3152 | Windows | XP és IIS tippek - trükkök | 26. rész |
| 3158 | Windows | Windows XP tippek, trükkök | 27. rész |
| 3168 | Windows | Tippek, trükkök | 28. rész |
| 3170 | Windows | Registry trükkök | 29. rész |
| 3179 | Windows | Tippek, trükkök | 30. rész |
| 3197 | Windows | Windows XP tippek, trükkök | 31. rész |
| 3205 | Windows | Tippek, trükkök | 32. rész |
| 3214 | Windows | Tippek, trükkök | 33. rész |
| 3223 | Windows | Tippek, trükkök | 34. rész |
| 3233 | Windows | Tippek, trükkök | 35. rész |
| 3271 | Windows | Tippek, trükkök | 36. rész |
| 3307 | Windows | Tippek, trükkök | 37. rész |
| 3370 | Windows | Tippek, trükkök | 38. rész |
| 3399 | Windows | Tippek, trükkök | 39. rész |
| 3510 | Windows | Tippek, trükkök | 40. rész |
| 3611 | Windows | Hardverrel kapcsolatos tippek, trükkök | 41. rész |
| 3668 | Windows | Registry trükkök | 42. rész |
| 3711 | Windows | Tippek, trükkök | 43. rész |
| 3771 | Windows | Tippek, trükkök | 44. rész |
| 3801 | Windows | Tippek, trükkök | 45. rész |
| 3831 | Windows | Tippek, trükkök | 46. rész |
| 3891 | Windows | Tippek, trükkök | 47. rész |
| 3921 | Windows | Tippek, trükkök | 48. rész |
| 3981 | Windows | Tippek, trükkök | 49. rész |
| 4041 | Windows | Tippek, trükkök | 50. rész |
| 4071 | Windows | Tippek, trükkök | 51. rész |
| 4151 | Windows | Tippek, trükkök | 52. rész |
| 4171 | C# | Tippek, trükkök | 53. rész |
| 4211 | Windows | Tippek, trükkök | 54. rész |
| 4251 | Windows | Tippek, trükkök | 55. rész |
| 4281 | Windows | Tippek, trükkök | 56. rész |
| 3589 | Delphi | Tippek, trükkök | 57. rész |
| 3718 | Delphi | Tippek, trükkök | 58. rész |
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 224. 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!
|