AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Interbase: Generierte ID ermitteln ?
Thema durchsuchen
Ansicht
Themen-Optionen

Interbase: Generierte ID ermitteln ?

Ein Thema von mschaefer · begonnen am 5. Apr 2003 · letzter Beitrag vom 16. Okt 2004
Antwort Antwort
Seite 2 von 3     12 3      
Gast
(Gast)

n/a Beiträge
 
#11
  Alt 7. Apr 2003, 10:56
Nun... Lemmy ... ob es vorher oder nachher ist... ins hier irrelevant... denke ich... Eine SELECT Anweisung an dieser Stelle... bringt hier immer Gefahren (was wenn zwei User gleichzeitig diese Abfrage weg-schicken?)...In meinen Augen ist Deine Storage-Prozedure die richtige Lösung...

Gruß

Paul Jr.
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#12
  Alt 7. Apr 2003, 11:14
Hallo Paul, hallo Lemmy

bin wirklch begeistert ! An dem Ding beisse ich mir schon einige
Zeit die Zähne aus. Damit habt Ihr glatt die Borland-Interbase Newsgroup
in den Schatten gestellt. Die Procedure von Lemmy ist sicherlich
der eleganteste Weg. Da ich nun mit den Zeos-Komponenten auf Interbase
(genaugenommen Firebird) zugreife mag ich nochmal auf die vorweggenommene ID-Abfrage kommen.

Hiermit könnte ich im Ereignis beforePost der Query mit einer temporären
Querykomponente ein automatisch generierte SQL abschicken, die mir den Generator liefert, den ich dann ins Primarykey-Feld der Hauptquery eintragen kann. (da kann ich ja glatt noch ´ne Komponente draus basteln...)


Wenn ich das richtig verstanden habe sollte es auch kein Problem machen,
wenn zwei zur selben Zeit auf die Gerneratroabfrage zugreifen. Irgendwie wird eine zuerst bearbeitet, die Id erhöht und jeder bekommt seine Eigene. Oder hab ich was übersehen ?


Viele Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#13
  Alt 7. Apr 2003, 11:32
Zitat von Paul Jr.:
Eine SELECT Anweisung an dieser Stelle... bringt hier immer Gefahren (was wenn zwei User gleichzeitig diese Abfrage weg-schicken?)
Nein, ganz sicher nicht!
1. Die Generatoren in IB/FB sind Transaktionsunabhängig
2. Eine Select wird immer nur in ihrer Transaktion ausgeführt!

d.h. Selbst wenn 2 User gleichzeitig diese Select ausführen, erhalten beide einen eindeutigen Generator-Wert, da dieser die Anfragen nacheinander ausführt!

Letztendlich mache ich in der SP doch genau dasselbe: Ich selektiere eine ID und verwende die anschließend in einer InsertSQL. Selbst wenn 100 User diese SP gleichzeitig ausführen kann da nix schiefgehen....

Grüße
Lemmy
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#14
  Alt 7. Apr 2003, 11:46
... da gebe ich mich geschlagen... 8)

Bei mir habe ich jetzt folgende Prozedur gefunden (ist eine nette Ergänzung zu unserem Thema)... wohl gemerkt die Spalte Bezeichnung ist hier NOT NULL und Eindeutig...

Code:
SET TERM ^ ;
CREATE PROCEDURE INSERT_TABLE1 (
   XBEZEICHNUNG VARCHAR(50)
) RETURNS (
   XID INTEGER
) AS
BEGIN
   xID = GEN_ID(TABLE1_ID_GEN, 1);
   INSERT INTO TABLE1 (ID
   , BEZEICHNUNG)
   VALUES(:xID
   , :xBEZEICHNUNG);
   WHEN SqlCode -803 DO
   BEGIN
      SELECT MAX(ID) FROM TABLE1
      WHERE
      (BEZEICHNUNG = :xBEZEICHNUNG)
      Into :xID;
      SUSPEND;
   END
END^

Gruß

Paul Jr.
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#15
  Alt 7. Apr 2003, 13:04
Hallo Martin ,

solltest Du Probleme haben mit Verwendung dieses Konstruktes... dann Frage ganz einfach weiter..., da es ist schon wichtig für Dich bzw. für Deine Anwendung... die Art und Weise wie Du es anbindest... bzw. wo...

Als erstes solltest Du zuerst diese Prozedur überhaupt aus Deinem Programm ansprechen... und dann überlege wie Du diese einsetzen wirst...


Gruß

Paul Jr.
  Mit Zitat antworten Zitat
Ralf Stehle

Registriert seit: 8. Aug 2003
124 Beiträge
 
Delphi 7 Professional
 
#16

Re: Interbase: Generierte ID ermitteln ?

  Alt 15. Okt 2004, 18:55
Ich habe den Code für die Generatorabfrage ausprobiert, bin aber gescheitert

Delphi-Quellcode:
DM.IBQuery1.Active := False;
 DM.IBQuery1.SQL.Text := 'Select Gen_ID(GEN_UDAT, 1) AS ID from rdb§database';
 DM.IBQuery1.Active := true;
Ich bekomme nur die Fehlermeldung Table unknown rdb
Ralf Stehle
ralfstehle@yahoo.de
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#17

Re: Interbase: Generierte ID ermitteln ?

  Alt 15. Okt 2004, 18:59
$, nich §


Delphi-Quellcode:
DM.IBQuery1.Active := False;
 DM.IBQuery1.SQL.Text := 'Select Gen_ID(GEN_UDAT, 1) AS ID from rdb$database';
 DM.IBQuery1.Active := true;
  Mit Zitat antworten Zitat
Ralf Stehle

Registriert seit: 8. Aug 2003
124 Beiträge
 
Delphi 7 Professional
 
#18

Re: Interbase: Generierte ID ermitteln ?

  Alt 15. Okt 2004, 18:59
Ich hab´s. Da war ein Tippfehler bei einem Beitrag im Forum
(§ ist falsch $ ist richtig)

so muß es richtig heißen:

Delphi-Quellcode:
 DM.IBQuery1.Active := False;
 DM.IBQuery1.SQL.Text := 'Select Gen_ID(GEN_UDAT, 1) AS ID from rdb$database';
 DM.IBQuery1.Active := true;
Ralf Stehle
ralfstehle@yahoo.de
  Mit Zitat antworten Zitat
Ralf Stehle

Registriert seit: 8. Aug 2003
124 Beiträge
 
Delphi 7 Professional
 
#19

Re: Interbase: Generierte ID ermitteln ?

  Alt 15. Okt 2004, 19:03
wow, du warst eine sekunde schneller. Vielen Dank.
Hast Du auch eine Idee was in dieser Zeile falsch ist?

Insert Into UDAT (ID, UNTERSUCHUNGSDATUM, PATIENT) VALUES (Gen_ID(GEN_UDAT,1),''2004-10-15'',''Thomas Cook'') Der Datensatz wird nicht eingefügt. Es kommt aber auch keine Fehlermeldung.


2. Wie kann ich einen neuen Generator per SQL-Befehl erzeugen?
Kann ich einem neuen Generator ein Nummer zuweisen, wenn ich z.B. schon Daten in einer Tabelle habe und ab sofort per Generator incrementieren möchte?
Ralf Stehle
ralfstehle@yahoo.de
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#20

Re: Interbase: Generierte ID ermitteln ?

  Alt 15. Okt 2004, 19:09
Zitat von Ralf Stehle:
wow, du warst eine sekunde schneller. Vielen Dank.
Hast Du auch eine Idee was in dieser Zeile falsch ist?

Insert Into UDAT (ID, UNTERSUCHUNGSDATUM, PATIENT) VALUES (Gen_ID(GEN_UDAT,1),''2004-10-15'',''Thomas Cook'') Der Datensatz wird nicht eingefügt. Es kommt aber auch keine Fehlermeldung.


2. Wie kann ich einen neuen Generator per SQL-Befehl erzeugen?
Kann ich einem neuen Generator ein Nummer zuweisen, wenn ich z.B. schon Daten in einer Tabelle habe und ab sofort per Generator incrementieren möchte?
zu 1. Ich würde mit Parameter arbeiten, bin mir nicht sicher, wie Interbase das Datum erwartet. Wenn du per Parameter und .AsDateTime arbeitetst dann sollte es keine Probleme geben (natürlich nur wenn UNTERSUCHUNGSDATUM ein TIMESTAMP oder DATE ist !)

kannst du den ganzen Code posten (samt ExecSQL; und Transaktion ... )

2.) 'CREATE GENERATOR MEINGENERATOR;' (mit ExecSQL)
'SET GENERATOR MEINGENERATOR TO 12;'
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 10:40 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