Hallo,
in einem Windows Phone 8 Projekt verwende ich sqlite-winrt um auf eine SQLite Datenbank zuzugreifen.
Dabei ist mir aufgefallen, dass PrepareStatementAsync(query)
eine Exception auslöst, wenn query
zwar korrekt ist aber nicht ausgeführt werden kann.
Konkret geht es bei mir um ein ein Query um einen Trigger zu erstellen:
Statement sqlStatement = await db.PrepareStatementAsync("CREATE TRIGGER MyTrigger...");
sqlStatement.StepAsync();
Der Aufruf läuft ohne Probleme, wenn MyTrigger in der Datenbank noch nicht existiert. Das sqlStatement
wird also korrekt erstellt. Hierdurch wird der Trigger natürlich noch nicht angelegt. Das passiert erst durch das dann folgende sqlStatement.StepAsync()
.
Existiert der Trigger der Datenbank jedoch schon, kommt es bereits in PrepareStatementAsync(...)
zur Exeption. Warum?
Ich würde verstehen, wenn in diesem Fall sqlStatement.StepAsync()
einen Fehler liefert (vielleicht nicht unbedingt als Exception) denn der Trigger kann nicht zweimal erstellt werden. Aber PrepareStatementAsync(...)
führt doch an der Datenbank noch keinerlei Änderungen durch, sondern erstellt nur aus dem Query ein Statement.
Ist einfach "schlau" und weiß "Hey, die Ausführung eines Statments mit diesem Query wird zu einem Fehler führen, darum kann ich diesen auch jetzt schon melden"? Oder mache ich irgendwas falsch?
Also wenn ich raten dürfte, würde ich sagen, dass man DDL (CREATE TABLE, TRIGGER, etc. ) nicht "planen" also auch nicht "preparen" kann. Es macht zumindest auch nicht besonders viel Sinn. Das Preparestatement ist für parametrisierte Statements (SELECT, UPDATE, INSERT, DELETE) gedacht.
Ich nehme daher an, dass der Wrapper nicht bis stepAsync wartete sondern direkt reinhaut.