Einzelnen Beitrag anzeigen

dstein

Registriert seit: 28. Jul 2005
Ort: Dormagen
51 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

SQLite AUTOINCREMENT Error mit UniDac TUniQuery

  Alt 15. Sep 2021, 09:09
Datenbank: SQLite • Version: 3.35.5 • Zugriff über: Unidac TUniQuery
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?
Angehängte Dateien
Dateityp: zip Source1.zip (571,2 KB, 1x aufgerufen)
Dateityp: zip ErrorProjectEXE.zip (2,07 MB, 0x aufgerufen)
Dirk
- Lang ist der Weg durch Lehren, kurz und wirksam durch Beispiele.
(Seneca, röm. Dichter u. Phil., 4 v. Chr. - 65 n.Chr.) -

Geändert von dstein (15. Sep 2021 um 09:17 Uhr)
  Mit Zitat antworten Zitat