![]() |
nächste id im datensatz
hi,
ich füge mit TQuery einen neuen datensatz in eine paradox - tabelle ein. nun würde ich gerne wissen, was für eine id ( automatischer wert ) dieser datensatz hat. wie mache ich das, ohne extra einen select zu machen ? es geht mir einfach um die performance :) |
Re: nächste id im datensatz
Leider gar nicht. Zumindest nicht ohne ein Select.
Das Problem ist, daß der Datensatz nur um TQuery existiert, bis er an die DB geschickt wird. Die DB nimmt das SQL Statement an (INSERT INTO ...) und das wars. Eine Rückgabe welcher Key von der DB automatisch vergeben wurde erfolgt nicht. Alternative: Ein SELECT auf die höchste ID machen, selber mitzählen und hoffen, daß kein anderer User inzwischen ein Insert macht. Das würde Deine Zählung nämlich verfälschen. |
Re: nächste id im datensatz
normalerweise kannst du doch die id bei einem insert mit angeben?!?! oder liege ich da sehr falsch (kenn' mich mit paradox leider nicht aus). bei oracle, mssqls oder mysql funktionierts aber so!!!
bau dir einfach selber eine GUID und schieb die dann mit deinem sql-insert rein. |
Re: nächste id im datensatz
Zitat:
Zitat:
|
Re: nächste id im datensatz
Bis jetzt habe ich das auch immer mit einem zusätzlichen Select gemacht, was ja nicht gerade optimal ist.
PHP kennt zu Beispiel beim Zugriff auf MySQL einen Befehl, mit dem man die ID feststellen kann, ohne ein zusätzliches QUery! Ich habe das Problem mit einer Interbase Datenbank, wir aber überall das gleiche sein! |
Re: nächste id im datensatz
Zitat:
das geht so weit ich das weis nicht! Wenn ich dem DB-Server sage er soll eine eindeutige ID vergeben habe ich darauf keine Einfluss. Wenn Du selbst ein GUID vergibst (mache ich inzwichen auch) dann ist der DB-Server ja nicht mehr für die Vergabe einer ID zuständig. Aber wir sollten mal Paul jr. fragen; der hat sicher eine Tipp für uns. :?: :?: |
hmm,
IMHO geht dass nicht auf DBs die keine Transaktionen unterstützen.
ISt ja logisch, zwischen deinem Insert und den SEELCT könnte ein anderer Insert oder UPDAte abgearbeitet worden sein, dadurch bist du raus. Sogar auf Transactionservern hast du ein Problem wenn eventuell ein Trigger oder Constraint auf der Tabelle liegt die irgendetwas macht was du garnicht beeinflussen kannst. |
Re: nächste id im datensatz
Warum fügst Du den Datensatz mit TQuery ein.
Ich habe die gleichen Probleme, da ich meistens über den ID Tabellen in einer 1:n Beziehung verknüpfe. Meine Vorgehensweise: Tab_.Appand (oder Tab_.Insert) Tab_[Variable].Value := Wert .... Tab_.Post Tab_.ID hat seinen neuen Wert für weiter Aufgaben. Kalli |
Re: nächste id im datensatz
hi,
danke für eure antworten, schade das ich einen select machen muss, ich dachte, ich kann was sparen ich füge die daten per TQuery ein, weil ich daten über mehrere dabellen updaten / ändern / selectieren muss / kann / darf ;) |
Re: nächste id im datensatz
Greift ein TQuery nicht in der Regel auf ein vorhandes Tableobjekt zu? Dann müßte doch bei einen INSERT bei RequestLive-Query´s das Table doch automatisch in den selben zustand versetzt werden, oder hab ich da was falsch verstanden. Auch bei einen query1.next geht doch zumindest der logik nach die Table mit.
Dementsprechend müsste man doch auch mit eienen table1id.value bzw. table1.fieldbyname('id').value (oder .asinteger) die id abrufbar sein. Habs noch nie überprüft, aber ich glaub so arbeitet das query doch(solange RequestLive auf true steht) |
Re: nächste id im datensatz
@theomega:
Eine übliche Vorgehensweise bei Interbase ist: Eine Stored Procedure, die einen neuen Generatorwert zurückgibt, aufrufen, und diesen beim Insert übergeben. Das ist auf jeden Fall viel weniger aufwändig als ein SELECT. IBX macht so was ähnliches (zumindest in IBDataSet), wenn man die Eigenschaft GeneratorField richtig einstellt. Grüße Urs |
Re: nächste id im datensatz
Könntest du das mal näher Erleutern? Mit dem Generator-Field?
|
Re: nächste id im datensatz
GeneratorField ist eine Eigenschaft von TIBCustomDataSet (IBX), die dazu dient, die Behandlung von AutoIncrement-Feldern zu vereinfachen.
Man setzt im OI den Feldnamen und den Generatornamen (der muss natürlich vorhanden sein) und bestimmt mit der Eigenschaft ApplyEvent, wann der neue Generatorwert geholt wird: a) gamOnNewRecord Wenn Du in der Komponente einen neuen Datensatz einfügst (beforeInsert). Der Vorteil davon ist, dass Du während der Bearbeitung des neuen Datensatzes schon weißt, welche ID der neue Datensatz bekommen wird (ist je nachdem für irgendwelche MasterDetail-Beziehungen hilfreich). Der Nachteil ist, dass bei einem Cancel der Generatorwert "verloren geht". b) gamOnPost Bevor der Datensatz gepostet wird, wird vom Generator ein neuer Wert abgerufen und in das Feld gesetzt. Vor- und Nachteil wie a) nur umgekehrt. c) gamOnServer Teilt der Komponente mit, dass sich der Server (durch Trigger) selbst um die Vergabe des AutoInc-Wertes kümmert. Wenn man die Trigger richtig gesetzt hat und das Programm den neuen ID-Wert nicht vor dem Posten wissen muss, dürfte das die beste Methode sein, da sie nicht die zusätzliche Netzwerkbelastung für das holen des Generatorwerts verursacht. Grüße Urs |
Re: nächste id im datensatz
Hallo zusammen,
ich grüble nun schon seit ein paar Tagen an meinem Problem, dass ich an einer Fremd-DB ein paar Einträge an Stammdatentabellen ergänzen möchte. Die Fremdtabelle ist relativ einfach aufgebaut, es gibt dort eine ID und eine Einheitenspalte. Die ID-Spalte scheint eine AutoWert-Spalte zu sein, so dass ich inzwischen da angelangt bin, dass wohl ein IBDataSet mit dem Generatorfield zum Einsatz kommen muss. Mein Code sieht folgendermaßen aus
Delphi-Quellcode:
Für die Eigenschaft InsertSQL habe ich
procedure TFormEinheiten.Button1Click(Sender: TObject);
begin IBDataSetEinheiten.Insert; ShowMessage(IntToStr(IBDataSetEinheiten.FieldValues['ID'])); IBDataSetEinheiten.Post; IBTransactionEinheiten.Commit; if Not(IBDataSetEinheiten.Active) then IBDataSetEinheiten.Active := True; end;
Gruß Manfred Anmerkung: Wenn Ereignis anwenden auf On Server steht, ist natürlich die ShowMessage-Zeile nicht da! |
Re: nächste id im datensatz
Hallo,
bin eigentlich gerade nicht so ganz drin im Thema, aber: könnte es sein, dass in der Datenbank ein Trigger aktiv ist, der beim Posten des Datensatzes nochmal einen Generatorwert abruft? Gruß Urs |
Re: nächste id im datensatz
Hallo Urs,
ja, ich habe auch schon darüber nachgedacht, aber da es sich um eine Fremddatenbank handelt, von der ich nur das Passwort weiß um eine Zusatzanwendung zu schreiben, ist mir der genaue Inhalt nicht bekannt. Leider gibt es auch keine Doku dazu, also kann ich nur per Try & Error an die Sache herangehen. Wenn es denn ein Trigger sein sollte, wie kann ich denn das Problem lösen? Gruß Manfred |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 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