Anmelden

View Full Version : ODBC - Sonderzeichen INSERT auf I5 klappt nicht



DrNick
22-02-05, 10:59
Wenn wir mit dem Linux iSeries-ODBC-Treiber ein INSERT Statement mit Sonderzeichen (z.B. ÄÖÜ ...) absetzen, bekommen wir folgende Fehlermeldung:

SQL error: [unixODBC][IBM][iSeries Access ODBC Driver][DB2 UDB]SQL0104 - Error message text unavailable. Message can not be translated successfully., SQL state 37000 in SQLExecDirect

Ein SELECT auf I5-Daten mit Sonderzeichen klappt ohne Probleme.

Fuerchau
22-02-05, 11:20
Der SQL0104 deutete auf einen Syntaxfehler des Insert's hin.
Das hat mit Sonderzeichen nichts zu tun.
Stelle den vollständigen SQL mal hier rein.

Übrigens:
Die SQL-Fehler kannst du auf der AS/400 mit
DSPMSGD RANGE(SQL0104) MSGF(QSQLMSG)
anschauen.

DrNick
22-02-05, 11:24
Ein Syntax-Fehler kann es eigentl. nicht sein, da der gleiche INSERT Befehl ohne Sonderzeichen einwandfrei funktioniert.

Fuerchau
22-02-05, 11:39
Das häufigste Problem sind nicht die Sonderzeichen, sondern dynamische SQL's die die Daten zusammenstellen:

insert into mytable (f1, f2, ...) values (123, 'xxx', ...)

Alphafelder sind genau dann das Problem, wenn sie selber wieder Hochkomma enthalten !
In diesem Fall sind die Hochkommata nämlich zu verdoppeln !!!

Besser ist es immer mit sogenannten Parametern zu arbeiten:

insert into mytable (f1, f2, ...) values (?, ?, ...)

Jedem Parameter kann dann ein Wert zugewiesen werden und per Execute ausgeführt werden.
Ein gravierender Vorteil: Die Syntax wird nur 1 Mal geprüft. Die Feldinhalten werden dann sehr schnell übertragen.

Prüfe deine Zeicheninhalte auf Hochkomma !

DrNick
22-02-05, 12:40
Es waren nur 2 Test-Statements, das Erste lautetet:

INSERT INTO BIBLIOTHEK.TABLE (Nummer,Textfeld) VALUES (123456,'ABC')

und funktionierte. Das Zweite:


INSERT INTO BIBLIOTHEK.TABLE (Nummer,Textfeld) VALUES (123456,'ÄÖÜ')

und lief nicht. Komisch, komisch ... :(

Fuerchau
22-02-05, 12:54
In irgendeiner Form scheint das 'ÄÖÜ' nicht so auf der AS/400 anzukommen. Sonst würde kein Syntaxfehler (SQL0104) gemeldet werden.
Es scheint ein Problem der Hex-Darstellung zu sein. Nun kenne ich mich mit Linux nicht aus, aber versuch mal anstelle von Konstanten im Insert ParameterMarker "?" zu verwenden.
Parametermarker werden mit entsprechenden SQL-API's gebunden:
SQLBindParameter bzw. SQLPutParameter o.ä.

Du kannst auch auf der AS/400 mal einen IP-Trace aufsetzen um zu sehen, was denn tatsächlich übertragen wird:
TRCTCPAPP APP(*DATABASE) SET(*ON) RMTNETADR(*INET '192.186.1.5')
mit TRCTCPAPP APP(*DATABASE) SET(*OFF) wird dann ein Protokoll ausgegeben.

TARASIK
22-02-05, 13:30
Hallo,
vielleicht hilft dies:

Problem: A Linux® application using the iSeries ODBC driver for Linux® received a SQL0104 token not valid error. The error occurred only when the SQL statement contained literals that used characters outside the invariant character set.

The isql utility shipped with versions of unixODBC prior to June 2003 does not call the setlocale() function and may run into this problem.

Resolution: The Linux® ODBC driver is using the locale set up by the application to convert the SQL statement. If the application does not set up the locale in its main(), the default compiler "C" locale is used. This implies a client code page of 367 is used for some client conversions. Code page 367 does not support many characters outside the invariant character set. The main application must ensure the locale is set up properly.

#include <locale.h>
int main( int argc, char* argv[])
{
setlocale( LC_ALL, "" ) ;
}

DrNick
22-02-05, 14:05
Danke für den Tipp, leider können wir den Eintrag nicht machen, da wir
das RPM-Packet direkt mit SUSE 9.2 installiert haben.

TARASIK
22-02-05, 14:36
Hallo,
vielleicht hilft Dir dieser Link:
http://www-1.ibm.com/servers/eserver/iseries/access/linux/guide/odbcproperties.html

in dem Bereich "Translation properties" CCSID