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?