HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

TimeStamp adattípusok összehasonlítása MS SQL Server-ben


Példaprogram letöltése

10575 bájt

Ha megvizsgáljuk az MS SQL Server beépített TIMESTAMP adattípusát, arra a következtetésre juthatunk, hogy az ilyen típusú oszlopok tartalma nem igazán hasonlít arra az adatra, amire nevéből jogosan következtetni lehetne. Cikkünkben bemutatjuk, hogy tulajdonképpen mire is használható az adattípus, hol lehet jelentősége, és hogy milyen – az SQL Server Book Online dokumentációjában mindeddig nem említett – függvénnyel hasonlíthatjuk össze az ilyen adatokat.

A példához szükséges a TSDB adatbázis, melyet a mellékelt Run.cmd BATCH állomány lefuttatásával hozhatunk létre. Csak arra kell ügyelni, hogy a TSDB.sql parancsállomány a BATCH állománnyal azonos mappában legyen. A TSDB.sql parancsállomány 5. sorában adja meg helyesen a létrehozandó adatbázisfájlok mappájának nevét és elérési útvonalát.
TimeStamp adattípus
A TimeStamp adattípus egy különlegessége a MS SQL Server típushalmazának, mivel - nevével ellentétben nincs köze időbélyegekhez – elegendő deklarálnunk a tábla létrehozásakor, majd értékének generálása a rendszer dolga. A táblába közvetlenül nem is vihető be ilyen típusú adat, az INSERT parancs megadásakor ki kell hagynunk az oszlopot az értékadó listából, UPDATE parancs kiadásakor a rendszer hibaüzenetet ad.
Minden táblába kerülő rekord ilyen típusú oszlopában a rendszer generál egy egyedi, 8 bájtos, bináris adatot (például 0x00000000000000C4). A rekord módosításakor a rekord TimeStamp típusú oszlopába automatikusan új adat kerül, tehát használható annak megállapítására, hogy az adott rekord egy időpillanat óta megváltozott-e, vagy sem.
A csak-olvasható táblákban ennek nincs jelentősége, azonban olyan rendszerekben, ahol egy adott táblát egy adott időpillanatban több felhasználó is használhat és módosíthat, igen hasznos segítség. Egyszerűen meg kell határozni azt, hogy az új és a régi TimeStamp bináris adatok eltérnek-e, vagy nem.
Ennek módja az, hogy meg kell hívni a MS SQL Server beépített, azonban valamilyen ok miatt a dokumentációból kimaradt TSEQUAL függvényt, mely paraméterként TimeStamp típusú adatot vár. Szintaxisa:
TSEQUAL(<TimeStamp típusú adat>,< TimeStamp típusú adat >)
A függvény jellegzetessége, hogy egy IF utasításban lekérdezhetjük, van-e eltérés a két paraméterben megadott adat közt, és teljesen azonos adatok esetén TRUE értéket ad vissza. Azonban eltérő adatok esetén visszaad egy FALSE értéket, és mellé egy Exception kivétel is keletkezik. A kivételt programból el kell kapni, ám előfordulása jelzi, hogy az adatok eltérnek, vagyis az adott rekord módosult az eredeti tartalomhoz képest.
UpdatedClient alkalmazás
A mellékelt alkalmazáscsomag két programot tartalmaz. Ezekkel modellezzük azt a helyzetet, amikor több felhasználó férhet hozzá egy táblához egy időben. Az UpdaterClient alkalmazásban egy DBGrid kontrolban folyamatosan látható az adatbázisunk Table1 táblájának tartalma.
A Table1 adattábla megadott rekordjának ProductName oszlopban található értéke módosítható a MÓDOSÍTÁS feliratú gombbal. Ehhez a ComboBox kontrolban ki kell választani egy ProductID azonosítót, valamint meg kell adni egy új nevet az Edit kontrolban.
Az UPDATE művelet egy egyszerű SQL paranccsal végrehajtható.
Az adattábla ProductPropery-je TimeStamp típusú adat, melynek megvan az a jellegzetessége, hogy a deklaráción kívül nincs vele különösebb dolgunk, azonban a rendszer jótékony kezelése folytán mégis hasznos segítség lehet.
CREATE TABLE Table1(
  ProductID INT IDENTITY(1, 1) NOT NULL,
  ProductName VARCHAR(50) NOT NULL,
  ProductProperty TIMESTAMP,
  InsDate DateTime NOT NULL)
GO
ViewerClient alkalmazás
Ebben az alkalmazásban a LEKÉRDEZÉS gombbal kérdezhetjük a rekordok állapotát. A rekordokat egy TADODataSet objektumba töltjük be, majd a gomb megnyomása után végrehajtunk minden memóriabeli TimeStamp típusú értékre egy összehasonlítást az aktuális táblabeli értékkel. Vagyis ha a másik alkalmazásban módosítottak egy rekordot, akkor a TimeStamp típusú érték megváltozik.
Ehhez írtunk egy tárolt eljárást, mely paraméterként megkapja az összehasonlítandó rekord azonosítóját, valamint a memóriabeli TimeStamp értéket. Az eljárásban kiolvastuk az adott érték táblabeli változatát, és ezzel az értékkel hasonlítjuk össze a kapott értéket.
CREATE PROCEDURE AreTimeStampsEqual (@id int, @ts timestamp, @result INT OUTPUT, @time datetime output)
AS
  ...   
  select @ts1 = ProductProperty, @time = InsDate from Table1 where ProductID = @id
  if TSEQUAL(@ts1,@ts)
    set @r = 0
  set @result = @r      
GO
A rekordokat a következőképpen olvassuk be:
...
with DM.dataSet, DM do begin
  Active := true;
  Open;
  First;
  while (not EOF) do begin
    try
A kiolvasott mezőértékeket átadjuk a TADOCommand objektum Parameters kollekciójának, majd elvégezzük a tárolt eljárást.
command.Parameters[1].Value := Fields[0].Value;
command.Parameters[2].Value := Fields[1].Value;
command.Execute;
A gomb kezelőfüggvényében egy Try-Except blokkban helyeztük el a végrehajtó műveletet, hiszen eltérő értékek esetén kivétel generálódik. Azonos értékek esetén jelezzük a ListBox kontrolban, hogy a rekordok nem módosultak.
ListBox1.Items.Add('Az ' + IntToStr(i) + '. rekord nem módosult');
Kivétel esetén a hiba az adatok megváltozásáról árulkodik, így itt erről adunk tájékoztatást.
except on X : Exception do begin
  ListBox1.Items.Add('Az ' + IntToStr(i) + '. rekord módosult.');
  s := command.Parameters[4].Value;
  ListBox1.Items.Add('Időpontja: ' + s);
  ...
  Next;
end;
Mivel hiba esetén nem lép tovább a rekordmutató a TADODataSet objektumban, így a kivételkezelő ágban ezt meg kell tennünk. A rekordok összevetése után frissítenünk kell a memóriabeli adatokat.
Requery;
Amennyiben a SQL Server Query Analyser programjával futtatjuk a tárolt eljárásunkat, akkor megkapjuk a visszatérési értékeket minden esetben, azonban a végrehajtás után kapott kísérőüzenetben a következő sor jelenik meg, a rendszer beépített figyelőlogikájának eredményeként:
The timestamp (changed to <új TimeStamp érték>) shows that the row has been updated by another user.

Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2003 évkönyv 421. 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 |