Discussion:
Kaputte Zahlen - Oracle, ODBC, VB6
(zu alt für eine Antwort)
Stefan Nobis
2004-07-19 09:10:55 UTC
Permalink
Hi.

Ich habe da ein kleines Problem und mir gehen die Ideen aus:

Oracle (9i, Problem tritt aber auch mit 8.x auf, soll mit 7.3
nicht aufgetreten sein) und Client-Applikation laufen auf
demselben System (Windows XP SP1, Problem soll laut anderen
Testern auch auf anderen Systemen wie Win2000 und Win98
auftreten). Zugriff auf die Datenbank erfolgt mittels des bei
Oracle mitgelieferten ODBC-Treibers.

Ich habe mal eine ganz simple Tabelle angelegt:

create table data(x NUMBER(5,2), y FLOAT);
insert into data values(1.5, 1.5);

Wenn ich jetzt mit meiner VB6 Client-Applikation die beiden Daten
auslesen, bekomme ich für x den Wert "15" und für y den Wert
"1,5". Der VB6-Code sieht grob so aus:

,----
| Dim x As Double
| Dim y As Double
|
| 'con.Execute "ALTER SESSION SET NLS_TERRITORY=GERMANY"
| 'con.Execute "ALTER SESSION SET NLS_NUMERIC_CHARACTERS=',.'"
|
| Set rs = con.OpenResultset("select * from data")
|
| While Not rs.EOF
| x = rs!x
| y = rs!y
| MsgBox "Value: " & x & " - " & y
| rs.MoveNext
| Wend
`----

Ich vermute mal, dass da irgendwie die Lokalisierung eine Rolle
spielt. Daher habe ich auch schon versucht, mit diesen Parametern
zu spielen. Grundsätzlich liefert mir

select * from nls_{database,session}_parameters;

NLS_TERRITORY=AMERICA und entsprechend NLS_NUMERIC_CHARACTERS=.,

Der Versuch mit ALTER SESSION SET NLS_* war bisher ebenfalls
erfolglos. Auch Änderungen des Datentyps von x (z.B. String oder
Variant) änderten nichts an dem Problem.

Irgendeine Lösung für das Problem muss es aber doch geben, so
kaputt kann der ODBC-Treiber von Oracle doch nicht sein. Ein
kurzer Test mit dem Microsoft ODBC Treiber für Oracle ergab, dass
alles problemlos lief, d.h. es kam auch für x der Wert
"1,5". Allerdings unterstützt der MS Treiber für Oracle nur ODBC
Level 2, ich brauche aber Level 3 -- das wiederum stellt mir der
Oracle ODBC Treiber zur Verfügung.

Ich würde mich über jeden Hinweis zur Lösung des Problem mit dem
Oracle ODBC Treiber wirklich sehr freuen!
--
Stefan.
Dirk
2004-07-22 10:51:22 UTC
Permalink
Hi Stefan,

das ist ein Oracle-BUG.
Der ODBC-Treiber benutzt die NLS-Werte, die er aus seinem ORACLE_HOME
bekommt.
VisualBasic hingegen arbeitet mit den XP-Regional-Settings.

z.B.
NLS_LANG auf GERMAN_GERMANY.WE8ISO8859P1.
Das bedeutet das NLS_NUMERIC_CHARACTERS auf ",." gesetzt ist (der
erste teil von NLS_NUMERIC_CHARACTERS ist das Dezimalzeichen und der
zweite Teil der Group-Separator).

XP/VB-Regional-Einstellung für das Dezimalzeichen ist "."

Auswirkung:
"." wird von der Visual Basic Anwendung genutzt
"," wird vom Oracle ODBC driver genutzt
Alle numerischen Werte aus der DB mit einem Integer und Dezimalstellen
werden aufgrund der Differenz dadurch OHNE das Dezimalzeichen
angezeigt wie du es beschrieben hast.

Um das Problem zu beheben musst du darauf achten, dass sowohl Oracle
ODBC als auch VB das GLEICHE Dezimalzeichen benutzen.

Entweder änderst du die Region-Einstellungen unter XP ab oder den
NLS_LANG Wert in der Registry.
Den Registry-Eintrag findest du (für XP weiß ich es nicht genau) unter
HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOMEnnn/NLS_LANG
HOMEnnn ist das ORACLE_HOME deines ODBC-Treibers.

Danach sollte es funzen.

Greetz
Dirk Drexler
Stefan Nobis
2004-07-23 12:13:27 UTC
Permalink
Post by Dirk
das ist ein Oracle-BUG.
Das hatte ich schon befürchtet.
Post by Dirk
Der ODBC-Treiber benutzt die NLS-Werte, die er aus seinem
ORACLE_HOME bekommt.
Das war der entscheidende Tipp. Danke!
Post by Dirk
Entweder änderst du die Region-Einstellungen unter XP ab oder
Das hat leider nichts geholfen -- egal, ob ich auf Deutsch
oder Englisch(USA) eingstellt habe, das Problem blieb bestehen.
Post by Dirk
den NLS_LANG Wert in der Registry.
Das hingegen hat geholfen. Hier muss offensichtlich dieselbe
Territory wie in der Datenbank eingestellt sein!

Nachdem ich NLS_LANG in der Registry (per Umgebungsvariable hatte
ich das vorher schon mal getestet und das war erfolglos) auf
AMERICAN_AMERICA gesetzt habe, funktionierte plötzlich alles wie
gewünscht -- jetzt bekomme ich abhängig von der XP
Region-Einstellung entweder "1.5" oder "1,5".

Hach, kann das Leben schön sein. :)

Nochmals vielen Dank für den Tipp!
--
Stefan.
Loading...