Textfelder und Auto-Commit bei PostgreSQL

Aller Anfang ist schwer: das habe ich heute wieder einmal schmerzlich feststellen müssen bei Datenbankabfragen auf eine Postgre-Datenbank. Eine kuriose Fehlermeldung und seltsame Ergebnisse beim Speichern brachten mich zum Verzweifeln.

Ein simpler Speichervorgang, mit MSSQL und MySQL schon 1000mal problemlos erledigt, brachte bei meiner neuen Postgre 8.4 Datenbank eine wirklich seltsame Fehlermeldung: LargeObjects (LOB) dürfen im Modus ’auto-commit’ nicht verwendet werden. Was um Himmels Willen hat das zu bedeuten? Das SQL-Statement sah zu diesem Zeitpunkt so aus:

INSERT INTO modul_notizen (id, user_id, meldung, erledigt, dte_create, dte_change, titel ) VALUES ( 'D1E97BE5-546F-4505-B156E8BE177DF409', 'D0BB54D2-151B-4F26-8F420F8C7049BCBA', 'asdasdasdasd', false, [CF_SQL_TIMESTAMP], [CF_SQL_TIMESTAMP], 'asd' )

Das übliche googlen brachte zwar interessante Begebenheiten zu Tage, führten aber leider zu keinerlei Erleuchtung. Das Setzen von BEGIN- und END-Blöcken wurde vorgeschlagen, was nichts an der Fehlermeldung änderte. Die Einstellungen im Railo-Administrator gaben auch keine Anhaltspunkte. Verbindungsparameter des JDBC-Treibers? Fehlanzeige. Erst der Einsatz des cftransaction-Tags brachte Licht ins Dunkel, wenn auch nicht die Lösung an sich. Die neue Fehlermeldung, für das exakt gleiche SQL-Statement lauetet nun: Für den Parameter 5 wurde kein Wert angegeben.. Schon besser, und gleich wurde ich auch fündig. Und zwar hatte ich im Original-Query die Hash-Zeichen vergessen bei zwei Werten:

INSERT INTO modul_notizen (id, user_id,
    meldung,
    erledigt,
    dte_create,
    dte_change,
    titel
    )
VALUES (
    <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.notizID#">,
    <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.userID#">,
    <cfqueryparam cfsqltype="cf_sql_clob" value="#arguments.meldung#">,
    <cfqueryparam cfsqltype="cf_sql_bit" value="#arguments.erledigt#">,
    <cfqueryparam cfsqltype="cf_sql_timestamp" value="local.tNow">,
    <cfqueryparam cfsqltype="cf_sql_timestamp" value="local.tNow">,
    <cfqueryparam cfsqltype="cf_sql_clob" value="#arguments.titel#">
    );

Für diesen doofen Anfängerfehler wurde ich meines Erachtens aber auch ein wenig hart mit einer ziemlich doofen Fehlermeldung bestraft. Denn mir ist immer noch nicht ganz klar, weshalb ein Timestamp ein Large-Object sein soll. Im selben Query habe ich zwar sogenannte Blobs verwendet, aber doch nicht für den Timestamp. Das Unverständnis bleibt.

cf_sql_longvarchar für Text-Daten

Das korrigierte Query warf nun keine Fehlermeldung aus, allerdings war das Ergebnis immer noch nicht zufriedenstellend. Denn die Datenfelder ’meldung’ und ’titel’ enthielten nicht die erwarteten Daten. Was war passiert? Ich habe die Daten im cfqueryparam-Tag mit dem cfsqltype=«cf_sql_clob» deklariert. Das hat bei ColdFusion mit MSSQL und MySQL immer wunderbar hingehauen, vermutlich aber eher zufällig denn gewollt. Korrekterweise hätte ich nämlich cfsqltype=«cf_sql_longvarchar» verwenden sollten. Und so klappte es auch mit dem Nachbarn:

INSERT INTO modul_notizen (id, user_id,
    meldung,
    erledigt,
    dte_create,
    dte_change,
    titel
    )
VALUES (
    <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.notizID#">,
    <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.userID#">,
    <cfqueryparam cfsqltype="cf_sql_longvarchar" value="#arguments.meldung#">,
    <cfqueryparam cfsqltype="cf_sql_bit" value="#arguments.erledigt#">,
    <cfqueryparam cfsqltype="cf_sql_timestamp" value="#local.tNow#">,
    <cfqueryparam cfsqltype="cf_sql_timestamp" value="#local.tNow#">,
    <cfqueryparam cfsqltype="cf_sql_longvarchar" value="#arguments.titel#">
    );

Manchmal bieten auch die kleinen Aufgaben viel Lernpotential…

Kommentare

Leave this field empty
Ihren Kommentar hinzufügen

Falls Sie abonnieren, werden alle neuen Kommentare zu diesem Thema an Ihre E-Mail-Adresse gesandt.

TrackBacks

Es gibt keine Trackbacks für diesen Eintrag.

Trackback URL dieses Eintrages:
http://www.samelis.ch/blog/mischa/trackback.cfm?id=814716F2-6BD6-4041-BE36E2C96A2E1E04