Problem beim Einfügen von double-Werten mit Nachkommastellen

Hallo,
ich habe zurzeit Schwierigkeiten Datensätze in eine Tabelle zu schreiben, wenn der Datensatz double-Werte mit Nachkommastellen enthält.
Als Betriebssystem benutze ich Linux, über ODBC greife ich auf die Postgres-Datenbank zu. Bei der Erzeugung des Insert-Befehls benutze ich zum Befüllen der Spalten den SQLBindParameter-Befehl. Bei den Spalten, die mir Schwierigkeiten bereiten, verwende ich als Typ SQL_FLOAT.
Die Ausführung des Befehls funktioniert ohne Probleme, solange ich nur Datensätze mit Werten einfüge, die keine Nachkommastellen haben. Sobald ich aber Werte mit Nachkommastellen einfügen will, bekomme ich beim Einfügen folgende Fehlermeldung:
SQLSTATE=HY000, native error code=7 'FEHLER: ungültige Eingabesyntax für Typ double precision: „-31078,9“.
Habe ich irgendwo etwas vergessen?
Für jeden Tipp bin ich dankbar. Falls etwas unklar ist, fragt mich einfach.
Viele Grüße
Kai



 „-31078,9“

Du versuchst, in ein Feld für ein Double 2 Zahlen einzugeben, -31078 und 9. Das geht natürlich nicht. Vermutlich willst Du -31078.9 da eingeben, stimmts? Also, tue es einfach…


Andreas

Hallo Andreas,

vielen Dank für Deinen Tipp!
Die Datensätze versuche ich einzufügen, indem ich einerseits einen SQL-Befehl mit Platzhalter zusammensetze und einem SQLHANDLE mit SQLBindParameter mitteile, wie die Platzhalter beim anschließenden SQLExecDirect zu ersetzen sind. Diesen Befehl rufe ich für die Spalten, die mir Schwierigkeiten bereiten, nur einmal auf, außerdem bekomme ich keinen Fehler zurück.
Es ist mir jetzt nicht klar, wie ich auf diese Weise versuchen kann, mehrere Werte in einer Spalte einzufügen. Hättest Du vielleicht noch eine Idee?


Viele Grüße
Kai

Ich erkläre es Dir noch mal laaaaangsam: tausche das Komma in der Zahl gegen einen Punkt.

Andreas

Ergänzend: Intern arbeitet die meiste SW mit dem international gebräuchlichen ‘.’ als Dezimaltrenner. In Ländern, die ein Komma nutzen übernimmt meist die Ländereinstellung und/oder die GUI die richtige Interpretation, so das man als Nutzer nichts damit zu tun hat (sofern die SW das auch richtig nutzt). Wenn man aber nun mit Postgres direkt kommunizirt, dann muß man da selbst aufpassen.

Gruß Uwe

Außer man nutzt den MONEY-Datentyp, der importiert das richtig, wenn man LC_* passend gesetzt hat.

Stimmt:

test=# create table ads (geld money);
CREATE TABLE
test=# set lc_monetary='de_DE';
SET
test=# insert into ads values ('12,23');
INSERT 0 1
test=# select * from ads;
   geld
----------
 EUR12,23
(1 row)

Andreas

Hallo,
vielen Dank Eure Mails.
Vielleicht habe ich in meiner ersten Anfrage aber etwas unklar ausgedrückt: Zum Zugriff auf die Postgres-Db via ODBC benutze die C-Funktionen: Ich erzeuge mir also ein Handle, erzeuge einen SQL-Befehl mit Platzhaltern (z.B. insert into mydb.addressen (name, vorname) values(?,?) und teile dem Handle mit SQLBindParameter mit, wie die Platzhalter zu interpretieren sind. Wenn ich einen Platzhalter mit einem double-Wert verbinde, übergebe ich SQLBindParameter einen entsprechenden (gecasteten) double-Wert und keine Zeichenkette. Wenn für alle Platzhalter festgelegt ist, wie sie zu interpretieren sind, rufe ich die Funktion SQLExecDirect auf (wo ich auch keinen Einfluss darauf nehme, wie die übergebenen double-Werte formatiert werden).
Diese Vorgehensweise habe ich auch schon im anderen Umfeld verwendet und es gab nie Probleme. Unter Linux bekomme ich die besagte Fehlermeldung, ohne dass ich eine Idee habe warum. Für jeden Tipp bin ich daher dankbar.

Viele Grüße
Kai

Noch mal: Floats werden mit einem Punkt getrennt.

Ich weiß nicht, wie und wo du die Werte in deinem Programm castest, aber offensichtlich gibt es an dieser Stelle ein Problem.

Die Funktion SQLBindParameter rufe ich genauso auf, wie’s bei Geiger beschrieben ist. Wo soll das Problem sein?

Viele Grüsse
Kai

Vielleicht wäre es praktisch, wenn du die relevanten Stellen deines Codes hier mal zeigst.

Das Problem ist dort, wo Deine Eingabe in PG ankommt:

ungültige Eingabesyntax für Typ double precision: „-31078,9“.

PG erwartet(!) einen Double-Wert, es kommt aber -31078,9. Das ist definitiv kein Double. Du wirst in Deiner Anwendung, bevor Du die Daten an PG wirfst, aus dem Komma einen Punkt machen müssen. Punkt.

Andreas

Hallo,
wer von Euch hat denn schon mal unter Linux über ODBC mit den C-Funktionen auf eine Postgres-Datenbank zugegriffen und die beschriebene Fehlermeldung bekommen?
Viele Grüße
Kai

Ich würde sagen, jeder der aus dem “,” keinen “.” gemacht hat. Die Lösung wurde ja schon genannt.

Nur für den Fall, dass es tatsächlich nicht daran liegt, der ads hat ja schon nach der Codstelle gefragt.

Wie wäre es mit einem kurzen Beispielprogramm das lauffähig ist und dein Problem verursacht? Also: Verbindung zur Datenbank herstellen und eine Datensatz mit einem Double-Wert einfügen der den Fehler auslöst.

Gruß
Sparrow

Hallo,


wenn Ihr mir nur noch sagen könntet, wo man in den Funktionen SQLExecDirect und SQLBindParameter oder an einer anderen Stelle das float-Format ein- oder verstellen kann, wäre ich ein großes Stück weiter.


Der Code läuft unter Window übrigens ohne Probleme. Und die Zuordnung zwischen Treiber und der Datenbank habe ich unter Linux mit ODBCConfig gemacht.


Viele Grüße
Kai

seufz Wenn du nicht in der Lage bist uns ein Stück lauffähigen Beispielcode zu liefern, mache ich den Thread zu. Das ganze wird nämlich langsam sinnlos hier.