AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi AutoInc im Primärschlüssel-Feld
Thema durchsuchen
Ansicht
Themen-Optionen

AutoInc im Primärschlüssel-Feld

Ein Thema von Stevie · begonnen am 10. Aug 2005 · letzter Beitrag vom 11. Aug 2005
Antwort Antwort
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.009 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

AutoInc im Primärschlüssel-Feld

  Alt 10. Aug 2005, 14:16
Datenbank: DB2/AS400 • Version: V5R1M0 • Zugriff über: BDE
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:
Warnung: AutoGenerateValue kann fehlschlagen, wenn sich der automatisch generierte Feldwert in einem Schlüsselfeld befindet. Die Abfrage, die den neuen Feldwert abruft, kann den Datensatz, der gerade eingetragen wurde, nicht immer eindeutig ermitteln.
Allerdings gibt es eine Möglichkeit, die zuletzt eingetragene ID zu ermitteln:
SELECT IDENTITY_VAL_LOCAL() AS ID FROM <TABLENAME> Ich möchte auf jeden Fall die von der DB generierte ID benutzen und mir nicht selber eine ermitteln.
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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: AutoInc im Primärschlüssel-Feld

  Alt 10. Aug 2005, 15:55
Zitat von Stevie:
Ich möchte auf jeden Fall die von der DB generierte ID benutzen und mir nicht selber eine ermitteln.
Dazu brauche ich eine Möglichkeit, mir nach dem Post die letzte ID zu ermitteln,
damit dieses Komische Verhalten in der TQuery nicht auftritt.
Ein AutoInc-Feld ist für den Programmierer sehr bequem, da es sich um nix kümmern muss, aber es gibt
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.
Andreas
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: AutoInc im Primärschlüssel-Feld

  Alt 10. Aug 2005, 16:12
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
SELECT MAX(id) FROM tabelle bestimmen. Das ist der gerade eingefügt Datensatz. Bei Mehrbenutzersystemen kann man so allerdings Probleme bekommen.
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: AutoInc im Primärschlüssel-Feld

  Alt 10. Aug 2005, 20:43
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.009 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

Re: AutoInc im Primärschlüssel-Feld

  Alt 11. Aug 2005, 09:10
Zitat von shmia:
Dieses SELECT IDENTITY_VAL_LOCAL() ist ein Krücke, die nur bei wenigen Datenbanken funktioniert
und nicht portierbar ist.
Ähm, lieg ich jetzt falsch, wenn ich sage, dass IDENTITY_VAL_LOCAL() eine Funktion der Datenbank ist und garnix mit der BDE zu tun hat??
Zitat von omata:
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?
Na eben nicht, das hab ich doch oben geschrieben, oder?
Zitat von marabu:
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.
Hm, funktioniert das mit den Sequences so wie bei Oracle z.B.? Dass ich mir die ID durch die Sequence ermitteln kann und dann in meinen Datensatz schreiben kann VOR dem Post?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#6

Re: AutoInc im Primärschlüssel-Feld

  Alt 11. Aug 2005, 09:13
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: AutoInc im Primärschlüssel-Feld

  Alt 11. Aug 2005, 13:26
Zitat von Stevie:
Hm, funktioniert das mit den Sequences so wie bei Oracle z.B.? Dass ich mir die ID durch die Sequence ermitteln kann und dann in meinen Datensatz schreiben kann VOR dem Post?
Das scheint mir die relevante Stelle im Handbuch zu sein: klick

marabu
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.009 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

Re: AutoInc im Primärschlüssel-Feld

  Alt 11. Aug 2005, 14:02
Zitat von marabu:
Zitat von Stevie:
Hm, funktioniert das mit den Sequences so wie bei Oracle z.B.? Dass ich mir die ID durch die Sequence ermitteln kann und dann in meinen Datensatz schreiben kann VOR dem Post?
Das scheint mir die relevante Stelle im Handbuch zu sein: klick

marabu
Jau, danke, diese Doku kannte ich noch garnicht.
Eine Sequenz anzulegen, habe ich jetzt geschafft, aber wie lese ich den Wert aus einer Sequenz aus?
Bei Oracle funktioniert das ja so:
select test_sql.nextval from dual Aber wie geht das auf der DB2?

P.S. Wir haben hier wohlgemert eine V5R1!
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: AutoInc im Primärschlüssel-Feld

  Alt 11. Aug 2005, 15:47
Wenn du den Wert vorher haben willst, dann kannst du ihn über folgende Expressions auslesen:

NEXT VALUE FOR sequence_name Hinterher kommst du bei Bedarf auch noch dran:

PREVIOUS VALUE FOR sequence_name 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.

marabu
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz