2012-04-10 2 views
1

Meine Windows-Anwendung (in C geschrieben) verwendet SQLite (mit der eingebetteten amalgamierten Quelle) zum Speichern von Offline-Daten, und hatte keine Probleme mit ihm in einem Multibyte-Zeichen Set bauen. Ich konvertiere jetzt die Codebasis in Unicode. SQLite läuft sehr gerne mit dem Unicode-Build und erstellt SQLite-Datenbanken in UTF-16LE-Codierung.SqLite-Datenbank wird nicht geschlossen, wenn in Unicode und PRAGMA journal_mode gesetzt ist

Ich bin jedoch auf eine sehr seltsame Sache gestoßen. Wenn ich die Abfrage PRAGMA journal_mode = DELETE (eigentlich, es auf einen der zulässigen Werte, einschließlich OFF setzt, macht das gleiche), alles läuft gut, bis der Code die Datenbank schließt, an diesem Punkt gibt der Aufruf an sqlite3_close()SQLITE_BUSY zurück, mit dem Fehler "unable to close due to unfinalised statements".

Das passiert sogar, wenn die einzige Abfrage, die ich auf der Datenbank ausführen, dieser einzelne Pragma-Befehl ist! Ich kann andere pragmas in Ordnung (z. B. "PRAGMA synchronous = NORMAL") und alle meine SQL-Abfragen ausführen, und die Datenbank wird ziemlich glücklich schließen; Es ist nur dieses journal_mode Pragma, das dieses seltsame Verhalten verursacht, und NUR im Unicode-Build des Codes - das Multibyte-Build zeigt dieses Problem nicht. Dies geschieht unabhängig davon, ob die Datenbank bereits [im UTF-16LE-Modus] existiert oder ob sie beim ersten Öffnen erstellt wird.

Irgendwelche Ideen, was könnte falsch sein? Ich benutze SQLite Build v3.7.11.

+0

Noch eine Anmerkung: Technisch gesehen ist der Pragma-Aufruf nicht die einzige Abfrage, die ich ausführe: Ich führe auch den Aufruf 'PRAGMA quick_check (1)' aus, wenn ich die DB zum ersten Mal öffne/erstelle. –

+0

Etwas verwirrt, 'journal_mode' scheint nicht" NORMAL "als einer seiner erlaubten Werte zu haben – Hasturkun

+0

Whoops, ich meinte" DELETE "- d. H. Der Standard. Ich werde die Frage bearbeiten. –

Antwort

1

Ich fand das Problem am Ende. War in meinem eigenen Wrapper-Code. Da sqlite keinen Unicode-äquivalenten Aufruf für sqlite3_exec() hat, ließ ich die Unicode-Version zu meinem Code durchgehen, der/step/finalize vorbereitete (für den Fall, dass der Aufrufer Daten von einer SQL-Abfrage zurückgewinnen möchte), aber aus irgendeinem Grund das journal_mode-Pragma setzte bewirkt, dass SqLite einige Daten zurückgibt, was es nicht für die anderen Pragmas, die ich gesetzt habe, gibt - somit gab es für dieses Pragma ein nichtfinalisiertes Stmt.

Für zukünftige Referenz, wenn Sie SQLITE_BUSY beim Schließen erhalten, können Sie sqlite3_next_stmt() aufrufen, um die [nächste] unfinalised-Anweisung, dann sqlite3_sql(), um es erhalten, um Ihnen die vorbereitete SQL-Anweisung zugeordnet zu erhalten. Sehr hilfreich!

+1

Sie haben mir mindestens eine Stunde Debugging erspart, danke. – user38329

Verwandte Themen