![]() |
Datenbank: DB2/AS400 • Version: V5R1M0 • Zugriff über: BDE
AutoInc im Primärschlüssel-Feld
Hi Leute,
ich muss gerade mit der BDE rumwurschteln ... :? Ich habe eine Tabelle, wo ich auf dem Primärschlüssel-Feld ein AutoInc-Feld habe. Jetzt habe ich das Phänomen, dass wenn ich ich einen neuen Satz anlege, dieser beim Posten wie von Geisterhand aus der Datenmenge fliegt. Nur ein Close und Open zeigt mir die richtigen Daten an. Da ich allerdings nicht für jeden Insert die Datenmenge schließen und wieder öffnen möchte, stehe ich vor einem Problem. Ich hab auch folgendes in der Hilfe gelesen: Zitat:
SQL-Code:
Ich möchte auf jeden Fall die von der DB generierte ID benutzen und mir nicht selber eine ermitteln.
SELECT IDENTITY_VAL_LOCAL() AS ID FROM <TABLENAME>
Dazu brauche ich eine Möglichkeit, mir nach dem Post die letzte ID zu ermitteln, damit dieses Komische Verhalten in der TQuery nicht auftritt. MfG Stevie |
Re: AutoInc im Primärschlüssel-Feld
Zitat:
einige gravierende Nachteile: Die Datenbank (na ja die BDE) erzeugt den Wert des Primärschlüssels. Deine Anwendung kennt diesen Wert nicht und es gibt auch keine zuverlässige Methode diesen Wert abzufragen. Grund: du könntest ja einen Datensatz einfügen, der in allen Feldern identisch zu einem bestehenden Datensatz ist. Nur das Primärschlüsselfeld wäre dann unterschiedlich, aber genau das kennst du ja nicht!!! Dieses SELECT IDENTITY_VAL_LOCAL() ist ein Krücke, die nur bei wenigen Datenbanken funktioniert und nicht portierbar ist. Es gibt nur eine saubere Methode, wie man AutoIncfelder implementieren kann und das benötigt sog. Generatoren. (und die BDE kennt diese nicht) Eine Paradox-Tabelle hat einen internen & unsichtbaren Generator für das AutoInc-Feld. Dieser Generator kann von Aussen nicht gesetzt werden. Wenn durch ein Programmabsturz der interne Generator z.B. auf 47 steht, aber in der Tabelle schon ein Datensatz mit Key 47 gespeichert ist, dann kann man keinen neuen Datensatz mehr speichern!!! ->Fehler doppelter Primärschlüssel blah... Du solltest die AutoInc-Felder vermeiden, wie der Teufel das Weihwasser. Schreib einfach, was du in deiner Tabelle speichern möchtest und wir sagen dir, wie der Primärschlüssel gebaut werden kann. |
Re: AutoInc im Primärschlüssel-Feld
Moin,
ich stimme shmia zu. Aber man kann den ID-Wert ermitteln. Da ein AutoInc-Feld immer weitergezählt wird, kann man einfach die größte Zahl mit
SQL-Code:
bestimmen. Das ist der gerade eingefügt Datensatz. Bei Mehrbenutzersystemen kann man so allerdings Probleme bekommen.
SELECT MAX(id) FROM tabelle
Was ich allerdings nicht verstehe ist, wenn du mit Insert einen Datensatz anlegst und ihn mit Post schreibst, dann steht doch die Datenmenge auf genau diesem Datensatz. Oder sehe ich da jetzt was falsch? MfG Thorsten |
Re: AutoInc im Primärschlüssel-Feld
Hallo Stevie,
du wirst wissen, warum du mit der BDE auf eine AS400 Datenbank zugreifst. Das Verschwinden und Wiederauftauchen von Datensätzen könnte an einem unpassenden Defaultwert für den isolation level liegen. DB2 auf der AS400 bzw. iSeries kennt zwei Schlüsselkonzepte - IDENTITY und SEQUENCE. SEQUENCE ist IBM lingo für generator. Mag sein, dass die IDENTITY Felder von der BDE als AutoInc reflektiert werden, aber dass die BDE den Paradox-AutoInc-Mechanismus auf einem SQL-Server bereitstellt bezweifele ich. Grüße vom marabu |
Re: AutoInc im Primärschlüssel-Feld
Zitat:
Zitat:
Zitat:
|
Re: AutoInc im Primärschlüssel-Feld
Hai Stevie,
frage doch einmal SvB. Ich glaube der greift auch mit Delphi auf eine DB2/AS400 zu. Aber ich glaube nicht mit der BDE. |
Re: AutoInc im Primärschlüssel-Feld
Zitat:
![]() marabu |
Re: AutoInc im Primärschlüssel-Feld
Zitat:
Eine Sequenz anzulegen, habe ich jetzt geschafft, aber wie lese ich den Wert aus einer Sequenz aus? Bei Oracle funktioniert das ja so:
SQL-Code:
Aber wie geht das auf der DB2?
select test_sql.nextval from dual
P.S. Wir haben hier wohlgemert eine V5R1! :? |
Re: AutoInc im Primärschlüssel-Feld
Wenn du den Wert vorher haben willst, dann kannst du ihn über folgende Expressions auslesen:
SQL-Code:
Hinterher kommst du bei Bedarf auch noch dran:
NEXT VALUE FOR sequence_name
SQL-Code:
Ob das Ganze auch mit V5R1 funktioniert, kann ich nicht sagen - habe keine Testmöglichkeit. Probier du doch mal. Im Handbuch solltest du unter "Language Elements :: Expressions :: Sequence Reference" nähere Informationen finden. Wenn du den sequence value im Programm brauchst, dann wirst du wohl eine Store Procedure definieren, die dir den Wert über "SET :V = NEXT VALUE FOR sequence_name" zurück gibt.
PREVIOUS VALUE FOR sequence_name
marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 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