AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Ersten Wert in die DB schreiben und sofort abfragen, bevor andere geschrieben werden?
Thema durchsuchen
Ansicht
Themen-Optionen

Ersten Wert in die DB schreiben und sofort abfragen, bevor andere geschrieben werden?

Ein Thema von OrNEC · begonnen am 1. Feb 2014 · letzter Beitrag vom 2. Feb 2014
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von blawen
blawen

Registriert seit: 1. Dez 2003
Ort: Luterbach (CH)
677 Beiträge
 
Delphi 12 Athens
 
#11

AW: Ersten Wert in die DB schreiben und sofort abfragen, bevor andere geschrieben wer

  Alt 1. Feb 2014, 20:09
Er möchte aber doch keine DB-Komponenten von Delphi verwenden ...
Woraus schliesst Du, dass es sich um Delphi-Komponenten handelt (Das Beispiel wurde u.a. um ein "z" gekürzt (zeos))?

Naja, wenn man mit SQL arbeiten kann, sollte man eher so vorgehen:

Delphi-Quellcode:
MyQuery.SQL.Text := 'select * from Tabelle_Sprache where Sprache = ' + QuotedStr(Edit_Sprache.Text);
MyQuery.Open;
if MyQuery.RecordCount = 0 then
begin
  // Hier die Insert-Methode einfügen/aufrufen
end;
In meinem Beispiel wurde nur der Insertteil aufgeführt. Die Frage von OrNEC bezieht sich ja lediglich auf das Feststellen der neuen Datensatznummer.
Roland
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: Ersten Wert in die DB schreiben und sofort abfragen, bevor andere geschrieben wer

  Alt 1. Feb 2014, 21:53
Nochmal an alle, die es in der Hitze der Diskussion nicht mitbekommen haben:

Der Zugriff auf SQLite erfolgt über SQLiteSimpleDelphi-Wrappers von Tim Anderson.
Da ist nix mit TDataSet, TDataSource, TDBEdit, TDBComboBox, TDB...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#13

AW: Ersten Wert in die DB schreiben und sofort abfragen, bevor andere geschrieben wer

  Alt 1. Feb 2014, 22:37
So wie ich das lese möchtest Du eine Master Deteil-Kombination eintragen:

1. Masterdatesatz eintragen
2. ID(´s) holen7den
3. Detail-Datensatz mit Referenz (der ID ('s) der Master-Tabelle) speichern.

Man kann dafür die SQL-Eingenschaften bei Query-Komponenten nehmen, sind bei Lazarus und Delphi-Versionen mit DB Unterstützung dabei oder das oben aufgeführten Paket. SQLite hat keine Sequences oder Generatoren und daher ist der Ansatz mit Trigger suboptimal, aber SQLite hat zum Ausgleich "AutoIncrement", sodass folgendes geht:

Code:
   CREATE TABLE COMPANY(
   ID INTEGER PRIMARY KEY  AUTOINCREMENT,
   NAME          TEXT     NOT NULL,
);
Master-Tabelle mit Auto-Increment anlegen.
Code:
   CREATE TABLE Employee(
   ID INTEGER PRIMARY KEY  AUTOINCREMENT,
   NAME          TEXT     NOT NULL,
   RID_Company    INT      NOT NULL,
);
Detail-Tabelle mit Auto-Increment und Referenz-ID-Feld anlegen.


Code:
INSERT INTO COMPANY (NAME )
VALUES ( 'Neptum AG' );
Master Datensatz einfügen, wobei das Auto-Inc-Feld nicht angegeben wird


Code:
Select max(ID ) as MAXID from COMPANY
Letzte Höchste ID holen (geht vielleicht per SQLite-Funktion eleganter... )


Code:
INSERT INTO Employee (NAME )
VALUES ( 'Kapt´n Nelson', :MAXID  );
Master Datensatz einfügen, wobei Max-ID in einer Variablen übergeben wird.


Das würde ich so als Weg sehen, wobei ich mit meinen VorPostern übereinstimme,
dass dies nicht abhängig von einer bestimmten Komponente ist.

Grüße in die Runde.
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
OrNEC

Registriert seit: 6. Nov 2009
493 Beiträge
 
FreePascal / Lazarus
 
#14

AW: Ersten Wert in die DB schreiben und sofort abfragen, bevor andere geschrieben wer

  Alt 1. Feb 2014, 22:47
Ich glaube genau das habe ich gesucht. Danke!
Nun muss ich das Praktisch bzw. Syntaktisch richtig umsetzen!
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#15

AW: Ersten Wert in die DB schreiben und sofort abfragen, bevor andere geschrieben wer

  Alt 1. Feb 2014, 23:05
Ohne Autoinc-Feld klappt das aber besser.
Dann muss man eben den Wert des Primärschlüsselfelds vorher ermitteln und kurz in einer Variablen merken.
Select max(ID)+1 as NewID from COMPANY Das ist besser als hinterher nachzuschauen welchen Datensatz man gerade eben eingefügt hat.
Insbesondere wenn man mal mit einer Multiuserdatenbank arbeitet können Autoinc-Felder zu ganz bösen Fehlern führen.
fork me on Github
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#16

AW: Ersten Wert in die DB schreiben und sofort abfragen, bevor andere geschrieben wer

  Alt 2. Feb 2014, 04:50
Öhm, wie kann ein client-basierter Index in einer Multi-User Umgebung "besser" sein als ein vom Server vergebener AutoInc-Index? Oder soll ich am besten gleich die ganze Tabelle locken wenn ein Client darin Inserted?

Davon ab habe ich mir schon oft eine vom DBMS direkt unterstütze Rückgabe der ID eines soeben eingefügten Datensatzes gewünscht. Am liebsten in so einer Form von einer DB-Komponente unterstützt:
Delphi-Quellcode:
MyQuery.SQL.Text := 'INSERT INTO foo VALUES (:bar)';
...
lastIndex := MyQuery.ExecuteWithResult('indexFieldName'); // Exception wenn das genannte Feld kein AutoInc, oder das Statement kein INSERT ist
Das würde zum einen die unhandlichen Abfragen von LastInsertID, sowie die Notwendigkeit alles zugehörige in eine Transaktion zu verpacken sparen.

So eine Methode ließe zudem noch so Nettigkeiten zu wie 'SELECT * FROM foo WHERE bar=:bla', für den Fall dass man genau einen Datensatz als Ergebnis erwartet, und den Wert nur einer Spalte haben will. Exception bei 0 oder >1 Ergebnissen, sowie wenn das gefragte Feld nicht im Ergebnis vorkommt. Spart das Open und den Umweg über die Abbildung auf Fields[]. Ich frage mich fast, warum das sich so nie etabliert hat.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.073 Beiträge
 
Delphi 12 Athens
 
#17

AW: Ersten Wert in die DB schreiben und sofort abfragen, bevor andere geschrieben wer

  Alt 2. Feb 2014, 06:58
Insbesondere wenn man mal mit einer Multiuserdatenbank arbeitet können Autoinc-Felder zu ganz bösen Fehlern führen.
Gerade da sorgen sie doch erst Recht für zuverlässige Indize-Felder?
Aber, man muß wenigstens den "richtigen" Master-Index wieder auslesen, wenn man dazu den Detail-Datensatz anlegen möche.

SELECT Max(ID) FROM Master , nach dem Anlegen des Master-Datensatzes, ist da also totaler Mist, da dort natürlich die falsche ID gelesen werden kann, wenn zwischenzeitlich ein anderer User auch da was eingetragen hat.
Wenn man die IDs im Clienten bestimmt, dann weiß man zwar vor dem Anlegen des Master-Datensatzes, wie dessen ID sein wird und kann sie "sicher" für den Detail-Datensatz nutzen, aber dann muß man womöglich im Clienten extra eine Fehlerbehandlung integrieren, da die Datenbank entsprechend reagiert, wenn zwischen dem SELECT MAX und dem INSERT ein anderer User schneller war und seinen Master-Datensatz anlegete und man nun selber natürlich eine doppelte ID anlegen möchte.

LAST_INSERT_ID ist doch Session an die Sessions gebunden?
Wenn ja, dann ist es an die eigene Verbindung gebunden und den darüber erstellten Datensatz, womit man dann seine ID bekommt, auch wenn jemand Anderes inzwischen gepostet hat.

Einige DBMS kennen sowas wie INSERT INTO table (id, value) VALUES (:id, :value) RETURNING id , was quasi Folgendem entspricht, als "eine" zusammenhängende Abfrage.
SQL-Code:
INSERT INTO table (id, value) VALUES (:id, :value);
SELECT LAST_INSERT_ID();
SQLite aber anscheinend nicht.



Kennt SQLite eigentlich auch Referenzen?
Um gültige Werte der Master-IDs in der Detail-Tabelle sicherzustellen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 2. Feb 2014 um 07:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#18

AW: Ersten Wert in die DB schreiben und sofort abfragen, bevor andere geschrieben wer

  Alt 2. Feb 2014, 07:17
Doku zu SQLite Last Insert Rowid

Ja, das hängt immer an der Session - weil es sonst nutzlos wäre

Doku zu SQLite Foreign Key Support
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 16:28 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