Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQLite AUTOINCREMENT Error mit UniDac TUniQuery (https://www.delphipraxis.net/208796-sqlite-autoincrement-error-mit-unidac-tuniquery.html)

dstein 15. Sep 2021 09:09

Datenbank: SQLite • Version: 3.35.5 • Zugriff über: Unidac TUniQuery

SQLite AUTOINCREMENT Error mit UniDac TUniQuery
 
Liste der Anhänge anzeigen (Anzahl: 2)
Beim Erstellen einer kleinen Windows 32-Bit App mit SQLite als Daba erhalte ich eine Fehlermeldung.
Wenn per dbNavigator ein Insert ausgeführt wird und dbNavigator POST gespeichert wird, erfolgt die Fehlermeldung.
Im Projekt XYZ ist eine Exception der Klasse EDatabaseError mit der Meldung FEld IDNR muss einen Wert haben aufgetreten.

Siehe: DebuggerException.png

Das ärgerliche für mich, ich habe vor 2020 mehrere auf SQLite basierende Apps geschrieben, welche auch jetzt noch ohne Problem funktionieren. Doch alle aktuellen Projekte erzeugen den gleichen Fehler.
Ich habe diverse Einstellungen und Versionen von unidac75d25proV7.5.13 bis zur aktuellen unidac_9.0.1_d25pro Version ausprobiert. Ebenso unterschiedliche sqlite3.dll (sqlite3_3.23.1.dll, sqlite3_3.35.5.dll, sqlite3_3.8.10.2.dll) Versionen in Kreuzversuche ausprobiert. Nach Wochen des ausprobieren, gebe ich auf, ich finde die Ursache oder falschen Parameter, für die Fehlermeldung nicht.
DevUmgebung:
• Delphi 10.2.3 2631 Tokyo Enterprise Build 2004 (11.03.2018), Delphi 10.2 Release 3
• Universal Data Access Components, UniDac Professional License
• SQLite.dll Version 3.35.5

Um Querverhalten zu minimieren, habe ich beiliegende Testapp als absolutes simple Projekt geschrieben.
Siehe: AppError.png

Die App erstellt eine SQLite Datenbank (vorhandene wird vorher gelöscht) und erzeugt per TUniScript eine Tabelle mit zwei Feldern, Index und füllt die Tabelle mit zwei Datensätze.
CREATE TABLE Test (
IDNR INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
Betreff VARCHAR (100) COLLATE NOCASE);
CREATE INDEX pkIDNR ON Test (IDNR ASC);
INSERT INTO Test (Betreff) VALUES ('Betreff 11');
INSERT INTO Test (Betreff) VALUES ('Betreff 22');

Da per Script „INSERT INTO Test (Betreff) VALUES ('Betreff 11');“ ein Datensatz mit AUTOINCREMENT Wert angelegt werden kann, funktioniert die Datenbank und INCREMENT Methode wohl.

Zugriff auf die Tabelle erfolgt mit TUniQuery. Wobei mit SQL Generator das Insert Script anders ist als bei MS SQL.

// SQLite
INSERT INTO Test
(IDNR, Betreff)
VALUES
(:IDNR, :Betreff)

// MS SQL
INSERT INTO dbo.Test
(Betreff)
VALUES
(:Betreff)
SET :IDNR = SCOPE_IDENTITY()

Aber warum funktioniert das simple Insert per dbNavigator nicht. Beim Vergleichen von alten SQL-InsertSource und aktuellen SQL-InsertSource konnte ich keinen Unterschied feststellen.
Hat jemand eine Idee wo mein Denkfehler oder fehlender Parameter liegt?

jobo 15. Sep 2021 11:02

AW: SQLite AUTOINCREMENT Error mit UniDac TUniQuery
 
Ich habe mir die angehängten Dateien nicht runtergeladen.

Wieso übergibst Du für SQLite eine ID, obwohl Du sie in der DB per Autoincrement erzeugst?
In der MS SQL Variante machst Du es m.E. richtig.

Wie der Auto Wert zurück geholt wird nach dem Insert, ist ja evtl. wieder System spezifisch. Wobei ich zumindest dem Lesen nach den Eindruck habe, dass aktuelle Delphi Komponenten hier eine Menge Einstellmöglichkeiten bieten und viel unter der Haube machen. Hier liegt vielleicht auch das Problem. Wenn es früher immer funktioniert hat, ist es nun mit aktuelleren Komponenten problematisch, weil sie es genauer behandeln und auf ein unglückliches Grundkonstrukt stoßen.

dstein 17. Sep 2021 09:26

AW: SQLite AUTOINCREMENT Error mit UniDac TUniQuery
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich glaube die Ursache gefunden zu haben.
Die Option Required im IDNR Feld muß False sein!

UniQuery1->Options->RequiredFields = false;

Zumindest ist die Fehlermeldung weg und das AUTOINCREMENT funktioniert.
Das ist anders als beim MS SQL-Provider.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf