Delphi-PRAXiS
Seite 5 von 8   « Erste     345 67     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   ID nicht gefunden nach last_insert_rowid() (https://www.delphipraxis.net/192717-id-nicht-gefunden-nach-last_insert_rowid.html)

himitsu 14. Mai 2017 17:42

AW: ID nicht gefunden nach last_insert_rowid()
 
Zitat:

Zitat von EdAdvokat (Beitrag 1371384)
Künftig greife ich natürlich darauf zurück, SQL-Statements auszuprobieren und erst dann einzusetzen. Habe ich da was falsch verstanden?

Nee.

Aber um ganz sicher zu gehn, baust du dir einfach eine Form mit Memo, DB-Grid und je einem Sendeknopf für Execute/Open auf, mit den Komponenten, die du verwendest. (oder es gibt eine Test-/Demo-App des Komponentenherstellers)
Da kannst du dann mit einer "vergleichbaren" Umgebung testen, wie in deinem Programm vorkommt
und bemerkst auch schon beim Testen Sonderprobleme bezüglich deiner Umgebung.

EdAdvokat 14. Mai 2017 18:47

AW: ID nicht gefunden nach last_insert_rowid()
 
dazu habe ich den DBBrowser für SQL installiert und mit SQLite-DB-Tabellen experimentiert gem. Tutorials SQL. Damit habe ich auch die hier verwendeten SQL-Statements nachvollzogen, leider erst nach Finden der Lösung. Nichts destotrotz kann man ja weiter experimentieren und üben.

nahpets 14. Mai 2017 18:58

AW: ID nicht gefunden nach last_insert_rowid()
 
Der DBBrowser verhält sich wie der DBBrowser.

Ein selbst mit Delphi geschriebenes Programm, verhält sich wie alle selbst mit Delphi geschriebenen Programme.

Der DBBrowser muss sich weder so wie ein Programm, dass Zeos nutzt verhalten, noch wie ein Programm des DBExpress nutzt.

Du wirst sicherlich eine große Übereinstimmung erhalten, aber nicht zwingend eine unbegrenzte Portierbarkeit.

In einem selbst geschriebenen Programm kannst Du genau sehen, wie sich ein selbst geschriebenes Programm in einer bestimmten Situation verhalten wird.

Mit dem DBBrowser erfährst Du nur, dass es mit dem DBBrowser funktioniert und kannst mutmaßen, dass es höchstwahrscheinlich mit 'nem Eigenbau auch so funktionieren wird.

Da Du aber gerade gemerkt hast, dass Du mit Zeos und DBExpress nicht zwingend ein gleiches Verhalten erwarten kannst, ist himitsus Vorschlag, was eigenes zu bauen, garnicht mal so verkehrt.

Und da es Dir ja in erster Linie ums lernen geht, wäre ein eigener DBBowser ja sicherlich nicht unbedingt das ungeeignetste Projekt.

Oder anders: Damit kannst Du genau die Unterschiede herausarbeiten und erfahren, wie Du sinnvollerweise vorgehst, um eben von den Unterschieden der Zugriffkomponenten wegzukommen.

TRomano 15. Mai 2017 09:18

AW: ID nicht gefunden nach last_insert_rowid()
 
Die absolute Sicherheit gibt die Abfrage "SELECT MAX(ID) FROM ..." aber nun mal gar nicht in einer Multi-User-Umgebung mit hochfrequenten Eingaben.
Wer sagt denn, dass er seine ID des INSERT's bekommt und nicht die letzte eingefügte (und damit maximale) ID eines anderen Users? Da es in diesem Beispiel ja auch nicht über eine Transaktion geht funktioniert es so nicht zu 100%.
Genau dafür haben DB-Systeme wie Firebird die RETURNING_VALUE im INSERT-Statement.

jobo 15. Mai 2017 10:07

AW: ID nicht gefunden nach last_insert_rowid()
 
Da kann ich nur voll zustimmen.
Allerdings sind wir in diesem Thread bei SQLite und das ist keine klassische Mehrbenutzerumgebung.
Folglich müsste hier die LastInsertRowID ausreichen und funktionieren.
Ich hätte nichts dagegen wenn SQLite RETURNING unterstützt, einfach aus Komforgründen.

himitsu 15. Mai 2017 10:30

AW: ID nicht gefunden nach last_insert_rowid()
 
Alternativ kann man die ID eben auch selber füllen, vor abschicken des Posts die Sequenz abfragen, also im AfterInsert oder spätestens BeforePost(wenn NULL) holen und eintragen, so hat man da schon die richtige ID.

jobo 15. Mai 2017 10:34

AW: ID nicht gefunden nach last_insert_rowid()
 
Zitat:

Zitat von himitsu (Beitrag 1371445)
Alternativ kann man die ID eben auch selber füllen, vor abschicken des Posts die Sequenz abfragen, also im AfterInsert oder spätestens BeforePost(wenn NULL) holen und eintragen, so hat man da schon die richtige ID.

Das ist aber in SQLite auch nicht konform zu echten RDBMS oder? Es gibt nur autoincrement, die SQLite selber verwaltet und das ist was anderes, als Sequenzen zu definieren und selbst zu verwalten/nutzen.

Aviator 15. Mai 2017 11:09

AW: ID nicht gefunden nach last_insert_rowid()
 
Zitat:

Zitat von nahpets (Beitrag 1371391)
Da Du aber gerade gemerkt hast, dass Du mit Zeos und DBExpress nicht zwingend ein gleiches Verhalten erwarten kannst, ist himitsus Vorschlag, was eigenes zu bauen, garnicht mal so verkehrt.

Und da es Dir ja in erster Linie ums lernen geht, wäre ein eigener DBBowser ja sicherlich nicht unbedingt das ungeeignetste Projekt.

Oder anders: Damit kannst Du genau die Unterschiede herausarbeiten und erfahren, wie Du sinnvollerweise vorgehst, um eben von den Unterschieden der Zugriffkomponenten wegzukommen.

Wenn er komplett unabhängig von Komponenten sein will dann muss der über die DLL von SQLite arbeiten. Und das ist sehr aufwendig. Ich schreibe aktuell ein Programm das einem DBBrowser oder HeidiSQL oder auch dem Microsoft SQL Management Studio ähnlich/gleich kommt.

Der Aufwand für so ein Programm ist nicht zu unterschätzen. Ich würde mal behaupten, dass so ein Programm zum Lernen auch nicht zielführend ist da viel zu aufwendig.

EdAdvokat 15. Mai 2017 11:32

AW: ID nicht gefunden nach last_insert_rowid()
 
jobo, Du schreibst
Zitat:

Allerdings sind wir in diesem Thread bei SQLite und das ist keine klassische Mehrbenutzerumgebung.
Folglich müsste hier die LastInsertRowID ausreichen und funktionieren.
LAST_INSERT_ROWID () funktionierte jedoch nicht. Lediglich mit dem SQL-Statement
Delphi-Quellcode:
qMain.SQL.Text := 'SELECT ID FROM KONTAKTE ORDER BY ID DESC LIMIT 1';
kam ich ohne Fehlermeldung weiter. Mit den Zeos-Komp. klappte es auf Anhieb mit LAST_INSERT_ROWID (). Leider gibt es bei dbExpress nicht die Einstellmöglichkeiten der Zeos-Komp.

nahpets 15. Mai 2017 16:43

AW: ID nicht gefunden nach last_insert_rowid()
 
Zitat:

Zitat von Aviator (Beitrag 1371452)
Zitat:

Zitat von nahpets (Beitrag 1371391)
Da Du aber gerade gemerkt hast, dass Du mit Zeos und DBExpress nicht zwingend ein gleiches Verhalten erwarten kannst, ist himitsus Vorschlag, was eigenes zu bauen, garnicht mal so verkehrt.

Und da es Dir ja in erster Linie ums lernen geht, wäre ein eigener DBBowser ja sicherlich nicht unbedingt das ungeeignetste Projekt.

Oder anders: Damit kannst Du genau die Unterschiede herausarbeiten und erfahren, wie Du sinnvollerweise vorgehst, um eben von den Unterschieden der Zugriffkomponenten wegzukommen.

Wenn er komplett unabhängig von Komponenten sein will dann muss der über die DLL von SQLite arbeiten. Und das ist sehr aufwendig. Ich schreibe aktuell ein Programm das einem DBBrowser oder HeidiSQL oder auch dem Microsoft SQL Management Studio ähnlich/gleich kommt.

Der Aufwand für so ein Programm ist nicht zu unterschätzen. Ich würde mal behaupten, dass so ein Programm zum Lernen auch nicht zielführend ist da viel zu aufwendig.

Naja, so meinte ich das nicht.

Hatte eher an ein TMemo, ein TDBGrid, 'ne TDataSource, 'nen TDBNavigator gedacht.

Für die Datenbankverbindung wird einmal Zeos genutzt und einmal DBExpress. (Und wer will nimmt auch noch die ADO-Komponenten, die sich auch wieder anders verhalten.)

Durch ändern der Querykomponente des DataSet von TDataSource kann man dann zwischen den unterschiedlichen Datenbankkomponeten hin- und herschalten.

Mir ging es eher darum ein Programm zu schreiben, das die vorhandenen Datenbankkomponenten nutzt und nicht ein Programm, das vollständig ohne die zu Delphi gehörenden Datenbankkomponenten auskommt.

Dass man sowas "nicht mal eben" schreiben kann, ist vollkommen klar.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr.
Seite 5 von 8   « Erste     345 67     Letzte »    

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