Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MSSQL/T-SQL: Wie "timestamp" speichern? (https://www.delphipraxis.net/146363-mssql-t-sql-wie-timestamp-speichern.html)

Bbommel 18. Jan 2010 18:12

Datenbank: SQL Server • Version: 2005 • Zugriff über: ADO

MSSQL/T-SQL: Wie "timestamp" speichern?
 
Hallo zusammen,

ich stehe gerade ein bisschen auf dem Schlauch und wundere mich, dass ich trotz Google noch nichts hilfreiches hierzu finden konnte, denn ich kann mir nicht vorstellen, dass das Problem sonst noch niemand hatte. Hmpf. :gruebel:

Kurz: Hat jemand eine Idee, wie ich den etwas eigenwilligen timestamp eines SQL-Servers sauber innerhalb von Delphi speichern kann, um ihn bei einer späteren Abfrage wieder mit angeben zu können?

Ich möchte bzw. muss halt alle 10 Minuten eine Tabelle abfragen und schauen, ob sich irgendwas geändert hat. Die Tabelle verfügt auch über eine Timestamp-Spalte, die ja vom Server automatisch aktualisiert wird. Alles super also - wenn ich dieses blöde Dingen irgendwie vernünftig abfragen und bei meiner nächsten Abfrage auch wieder sauber übergeben könnte.

Hat jemand eine hilfreiche Idee?

Besten Dank
Bommel

PS: Um ein Missverständnis zu vermeiden - dass ich den aktuellen Timestamp mit "SELECT @@DBTS" bekomme, weiß ich - aber wohin mit dem Ergebnis dieser Abfrage?

shmia 18. Jan 2010 18:35

Re: MSSQL/T-SQL: Wie "timestamp" speichern?
 
Die timestamp-Felder kannst du als (Ansi-)String auslesen:
Delphi-Quellcode:
var
  ts_wert : AnsiString;
begin
  ts_wert := dataset.FieldByName('timestamp_feld').AsString;
Der String hat eine Länge von 8 Zeichen.
Wenn du den String anzeigen möchtest musst du ihn in Hex-Zeichen umwandeln.
Um zu prüfen, ob sich der timestamp geändert hat kannst du direkt einen Stringvergleich vornehmen:
Delphi-Quellcode:
var
  ts_akt : AnsiString;
begin
  ts_ := dataset.FieldByName('timestamp_feld').AsString;
  if ts_akt <> ts_gemerkt then
    ... // Datensatz verändert

omata 18. Jan 2010 23:36

Re: MSSQL/T-SQL: Wie "timestamp" speichern?
 
Schau dir mal die Unit SqlTimSt an.

Dann kannst du auch so etwas machen...
Delphi-Quellcode:
var
  ts_wert : TSQLTimeStamp;
begin
  ts_wert := dataset.FieldByName('timestamp_feld').AsSQLTimeStamp;

Bbommel 19. Jan 2010 12:09

Re: MSSQL/T-SQL: Wie "timestamp" speichern?
 
Danke für eure Antworten.

TSQLTimeStamp hatte ich beim Wühlen auch schon gefunden, es aber wieder verworfen. TSQLTimeStamp bildet ja einen echten Datum/Zeit-Stempel ab, während Microsoft ja für den "timestamp" des SQL-Servers ausdrücklich darauf hinweist, dass dieser mit einem Datum und einer Uhrzeit nichts zu tun hat. Ich habe es gerade dennoch mal kurz getestet, aber wie erwartet lieferte mir
Delphi-Quellcode:
[...]
    currQuery.SQL.Add('SELECT @@DBTS');
    currQuery.Open;
    lastTimestamp:=currQuery.Fields[0].AsSQLTimeStamp;
...die Fehlermeldung, dass der Wert nicht in einen SQLTimeStamp umgewandelt werden könne.

Ich werde es wohl so oder so ähnlich machen, wie shmia vorgeschlagen hat. Oder alternativ auch so:

Delphi-Quellcode:
var lastTimestamp: TBytes;
[...]
begin
[...}
    currQuery.SQL.Add('SELECT @@DBTS');
    currQuery.Open;
    lastTimestamp:=currQuery.Fields[0].AsBytes;
[...]
end;
Ist ja letztlich das gleiche... :) Mal schauen, was mir am Ende besser gefällt. Vor allem möchte ich ja am Ende ein neue Abfrage starten, die in etwa so aussieht:

Delphi-Quellcode:
  currQuery.SQL.Add('SELECT * FROM Tabelle WHERE timestamp>'+lastTimestamp);
Wobei es halt noch die Herausforderung ist, dieses "+lastTimestamp" in etwas umzuwandeln, womit dann auch der SQL Server glücklich wird.

Bis denn
Bommel

Stevie 21. Jan 2010 12:00

Re: MSSQL/T-SQL: Wie "timestamp" speichern?
 
Du kannst den Timestamp ganz einfach in einen bigint umcasten oder umgekehrt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz