![]() |
Datenbank: XML • Version: XE7 • Zugriff über: Firedac
Kommendes AutoInc Value bestimmen
Hallo ich habe eine einfache
XML Datenbank und ich würde gerne den kommenden AutoInc Counter in procedure TDataModule1.FDMemTableBeforeInsert(DataSet: TDataSet); auslesen. Geht das ? Bei der folgenden Abfrage geht das es wäre nur toll das "before" zu machen
Delphi-Quellcode:
procedure TDataModule1.FDMemTableAfterPost(DataSet: TDataSet);
var Counter : LongInt; Count : Integer; begin Count := 6; Counter := DataSet.FieldByName('Counter').AsLargeInt; AddSongs(Counter,Count); end; |
AW: Kommendes AutoInc Value bestimmen
Hallo vieleicht habe ich da einen falschen Denkansatz.
Ich habe eine Mutter Memory Table und generiere ein Auto Inc mit Counter, soweit sogut, dann habe ich ein Unter Table und möchte das diese auf Counter reagiert und alle Datensätze anzeigt. |
AW: Kommendes AutoInc Value bestimmen
Ein AutoInc wird (eigentlich) von der Datenbank vergeben, es wird beim Speichern eines neuen Satzes ermittelt und dann in die entsprechenden Spalte eingefügt.
Es ist vorher nicht bekannt und kann von daher auch nicht vorher bestimmt werden. Unter Oracle würd' ich 'ne Sequenz nehmen und von der im Before-Ereignis den nächsten Wert abfragen, sowie diesen dann in die entsprechende Spalte einfügen. Gleichzeitig hätte ich ihn für weitere Verarbeitungen zur Verfügung. Bei FireBird geht's über 'nen Generator. Auf die automatische Vergabe des Wertes über AutoInc muss man dann aber verzichten. Welche Zwischenschicht sowas ggfls. wie handhaben kann, weiß ich nicht. |
AW: Kommendes AutoInc Value bestimmen
Zitat:
Zitat:
|
AW: Kommendes AutoInc Value bestimmen
AutoInc wird im Normalfall vom DBMS verwaltet und dient in der Regel dazu, Datensätzen eine einzigartigen ID zu verpassen, um die sich das Anwendungsprogramm nicht kümmern muss.
Solange sichergesellt ist, dass eine Table nur von einem Cleint verwendet wird, was ja bei MemoryTables möglich ist, dann könnte man einfach mal Max(Couter) abfragen. Der nächste Int wäre dann wohl auch der nächste AutoInc-Wert. ABER: Ein DBMS speichert sich für die Tables die jeweiligen aktuellen AutoInc-Wert weg, und und nimmt dies zum Bestimmen des nächsten AutoInc-Werts. Das heißt, wird aus der Table: ID Name 1 Tom 2 Klaus 3 Peter der Datensatz "Peter" gelöscht, bleibt der letzte AutoInc der Tabelle auf 3. Wenn jetzt "Willi" eingefügt wird, dann sieht die Tabelle so aus ID Name 1 Tom 2 Klaus 4 Willi Würde man also mit Max(ID) vor dem Einfügen von "Willi" abfragen, bekäme man als Result 2 und würde fälschlicherweise davon ausgehen, dass der nächste die 3 wäre. Es gibt je nach DBMS auch die Möglichkeit für eine AutoInc den gespeicherten Wert abzufragen. Ob das bei MemoryTables auch geht, weiß ich nicht. Oder du verwaltest Counter generell selbst, also kein AutoInc sondern nur ein normales Int-Feld. Dann kannst du generell mit Max(Couter)+1 den nächsten bestimmen, musst ihn aber dann auch selber mit eintragen. Letzteres ist aber in eine Multiuser-Umgebung nicht wirklich zu empfehlen, dann es kann auf Grund verschiedener Ursachen immer dazu kommen, dass zwischen Abfrage des Max(Couter)+1 und dem tatsächlichen Speichern des Datensatzes doch noch ein anderes Speichervorgang eines anderen Clients dazwischen kommt. Und schon hätte eine Inkonsistenz. |
AW: Kommendes AutoInc Value bestimmen
Zitat:
Arbeite recht viel mit der kbmMemTable. Ist auch nur 'ne Textdatei, quasi CSV mit 'nem Header davor, in dem die Tabellendefinition steht. Kann auch AutoInc. Ist alles in Delphi, Quelltext vorhanden. Trotzdem kann ich da 'nen AutoInc-Wert nicht im BeforePost-Ereignis abfragen. Das macht auch "die Datenbank". Auch wenn da real garkeine Datenbank im eigentlichen Sinne vorhanden ist. Hier müsste man also mal durch die Sourcen von TFDMemTable gehen, schauen, wo und wie die AutoIncs vergeben bzw. verwalten und ggfls. da dann ansetzen. Bei 'ner sinnvollen Kapselung des datenbanktypischen Verhaltens, dürften die Aussichten eher schlecht sein, einen AutoInc-Wert vor seiner Vergabe zu erhalten. |
AW: Kommendes AutoInc Value bestimmen
Zitat:
Delphi-Quellcode:
(unter der Annnahme, daß das AutoInc-Feld den Index 0 hat).
FDMemTable1.Table.Columns.CurrValues[0]
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 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 by Thomas Breitkreuz