Unterschied .prepareStatement <> .createStatement

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Unterschied .prepareStatement <> .createStatement

Beitrag von F3K Total »

Hallo zusammen,
in diesem Beitrag hat DPunch freundlicherweise erläutert, wo der Unterschied der o.a. Befehle liegt.
Ich übe gerade damit und kann Abfragen, Parameterabfragen, insert und update-Befehle erzeugen und ausführen.
Der Versuch mit .prepareStatement eine Tabelle anzulegen scheitert, zum Vergleich:
Mit diesem Code klappts:

Code: Alles auswählen

Sub S_create_Statement_Create_Table
ocontroller = thisdatabasedocument.currentcontroller
if not ocontroller.isconnected then ocontroller.connect
oconnection = ocontroller.ActiveConnection
ostatement = oconnection.createstatement
sSql = "Create table TEST (ID Integer, NUMMER Integer)"
oStatement.executeupdate(sSql)
msgbox "fertig"
End Sub
Mit diesem Code ...

Code: Alles auswählen

Sub S_prepare_Statement_Create_Table
ocontroller = thisdatabasedocument.currentcontroller
if not ocontroller.isconnected then ocontroller.connect
oconnection = ocontroller.ActiveConnection
sSql = "Create table TEST (ID Integer, NUMMER Integer)"
oStatement = oconnection.prepareStatement(sSql)
oStatement.executeupdate
msgbox "fertig"
End Sub
... bekomme ich folgende Fehlermeldung
prep.png
prep.png (13.06 KiB) 1198 mal betrachtet
Hat jemand eine Idee wieso?

beste Grüße von Rik
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Unterschied .prepareStatement <> .createStatement

Beitrag von juetho »

Hat jemand eine Idee wieso?
Meine Vermutung lautet, dass es am DDL-Befehl scheitert. Laut API-Referenz sollen auch DDL-Befehle ausgeführt werden können. Aber vielleicht will die Datenbank selbst das nicht erledigen, während die Schnittstelle zwischen Base und der Datenbank noch "großzügig" ist.

Versuch' doch einmal execute; vielleicht klappt es damit. Gruß Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Unterschied .prepareStatement <> .createStatement

Beitrag von F3K Total »

Hallo Jürgen,
.execute ... hatte ich bereits probiert, geht nicht.
Gruß Rik
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Unterschied .prepareStatement <> .createStatement

Beitrag von DPunch »

Servus

Das ist in der Tat ein merkwürdiges Verhalten. Betroffen sind nur die DDL-fähigen Befehle .execute und .executeUpdate - und zwar genau dann, wenn zwischen der Erstellung des PreparedStatement-Objekt und dem Ausführen der Kommandos kein Zugriff auf das Objekt vorliegt.
Es scheint so, als wäre das Objekt aus irgendeinem Grund noch nicht vollständig initialisiert, so dass eine Anweisung, die etwas anderes als ein ResultSet zurückgibt, auf eine nicht gesetzte Property/Method zuzugreifen versucht.
Mit einem einfachen

Code: Alles auswählen

oStatement.clearParameters
oder einem vollkommen sinnfreien Aufruf wie

Code: Alles auswählen

oStatement.Columns
vor dem Ausführen des Statements wird diese Lücke geschlossen, warum auch immer.
Hier liegt eindeutig ein OOo-seitiger Bug vor.

Nebenbei angemerkt sei noch, dass PreparedStatements für DDL-Anweisungen und generell für nicht parametrisierte Anweisungen, die nicht mehrfach ausgeführt werden, grundsätzlich eher ungeeignet sind, hier ist ein "normales" Statement die bessere Wahl.
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Unterschied .prepareStatement <> .createStatement

Beitrag von F3K Total »

Hallo DPunch
DPunch hat geschrieben:Hier liegt eindeutig ein OOo-seitiger Bug vor.

Nebenbei angemerkt sei noch, dass PreparedStatements für DDL-Anweisungen und generell für nicht parametrisierte Anweisungen, die nicht mehrfach ausgeführt werden, grundsätzlich eher ungeeignet sind, hier ist ein "normales" Statement die bessere Wahl.
vielen Dank für die Erklärung.
Dann bleibt es bei mir für die DDL bei .createStatement. Für die DML .prepareStatement.

beste Grüße von Rik
Antworten