Hallo ich habe ein Problem Numeric Werte aus einer Microsoft SQL-Datenbank auszulesen.
Ich habe in der Datenbank eine Spalte die als numeric(20,0) angelegt ist. Heißt zwanzig Vorkommastellen. Zur Datenbank verbinde ich mich per ODBC-Treiber.
Wenn ich jetzt ein selct * FROM Table mache erhalte ich zwar ein wert für die entsprechende numeric spalte allerdings sieht dieses wie folgt aus QVariant(double, 1.09e+19) ist also als potenz geschrieben. Nur leider sind die weiteren stellen nicht zu vernachlässigen die über diese Schreibweise abgeschnitten werden. Wenn ich versuche das ergebniss mit query.value(0).toString() umzuwandeln bleibt das ergebniss ebenfalls in der Potenzschreibweise stehen.
Ist es ein ODBC-Treiber problem das die Datenbankergebnisse anscheinend standartmäßig als double Datentype zurückgegeben werden? oder liegt das an QT und man kann das problem noch lösen?
Danke schon einmal
Gruß
Schubi
Numeric Werte aus Datenbank auslesen
Re: Numeric Werte aus Datenbank auslesen
Das ist doch nur die Ausgabe. Mit std::cout + Manipulatoren kannst du die Ausgabegenauigkeit beliebig setzen.
Re: Numeric Werte aus Datenbank auslesen
Schon mal danke!
jetzt kann ich ihn zwar mit 20 zeichen auf der Konsole ausgeben aber wie bekomme ich ihn in einen normalen QString gewandelt um damit weiter arbeiten zu können. Weil erst ausgeben und dann wieder einlesen erscheint mir ein wenig unelegant zu sein. Gibt es einen direkten weg der sich ausschließlich mit QT-Datentypen bzw Klassen umsetzen lässt?
jetzt kann ich ihn zwar mit 20 zeichen auf der Konsole ausgeben aber wie bekomme ich ihn in einen normalen QString gewandelt um damit weiter arbeiten zu können. Weil erst ausgeben und dann wieder einlesen erscheint mir ein wenig unelegant zu sein. Gibt es einen direkten weg der sich ausschließlich mit QT-Datentypen bzw Klassen umsetzen lässt?
Re: Numeric Werte aus Datenbank auslesen
Danke noch mal für die Hilfe bin jetzt auf ne gute Lösung gekommen
QString formatierterWert=QString( "%1" ).arg( d, 0, 'f', 0);
QString formatierterWert=QString( "%1" ).arg( d, 0, 'f', 0);
Re: Numeric Werte aus Datenbank auslesen
Habe da doch noch mal ein Problem. Da die genauigkeit von double nicht ausreicht.
Die werte in der Datenbank sind 20 werte lang. Lese ich zb. den wert 10903012224000000001 wird aus der letzten 1 eine 0 gemacht.
aus dem wert 10903012224000001555 macht das system 10903012224000002048.
Die werte in der Datenbank sind 20 werte lang. Lese ich zb. den wert 10903012224000000001 wird aus der letzten 1 eine 0 gemacht.
aus dem wert 10903012224000001555 macht das system 10903012224000002048.
Re: Numeric Werte aus Datenbank auslesen
Das musst Du leider so hinnehmen, wenn Du mit Gleitkommazahlen arbeitest. Die sind einfach nicht 100% genau: http://de.wikipedia.org/wiki/Gleitkomma ... Grundlagen. Deshalb ist es meist auch relativ sinnfrei doubles (oder floats) auf Gleichheit zu testen, stattdessen wird idR ein Epsilontest gemacht (also if (fabs(a-b) < eps) statt if (a == b)).
Wenn Du wirklich genau rechnen willst, wirst Du eine Bibliothek für fixed-point Arithmetik benutzen müssen (z.B. http://code.google.com/p/libfixmath/). Die sind allerdings furchtbar langsam im Vergleich zu double bzw. float.
Wenn Du wirklich genau rechnen willst, wirst Du eine Bibliothek für fixed-point Arithmetik benutzen müssen (z.B. http://code.google.com/p/libfixmath/). Die sind allerdings furchtbar langsam im Vergleich zu double bzw. float.
Re: Numeric Werte aus Datenbank auslesen
Ich will mit den werten gar nicht rechnen
die werte sind schlüsselattribute in einer Datenbank.
Leider scheint die QT-Lib für ODBC treiber automatisch aus den numeric werten double werte zu machen bevor die möglichkeit steht diese abzugreifen.
Mein Problem ist, ist der schlüssel nicht der richtige kann ich keine weiterführende abfrage auf eine andere tabelle machen wo der schlüssel ebenfalls verwendet wird. Mir würd daher allgemein reichen wenn ich den entsprechenden wert als string auslesen könnte.
die werte sind schlüsselattribute in einer Datenbank.
Leider scheint die QT-Lib für ODBC treiber automatisch aus den numeric werten double werte zu machen bevor die möglichkeit steht diese abzugreifen.
Mein Problem ist, ist der schlüssel nicht der richtige kann ich keine weiterführende abfrage auf eine andere tabelle machen wo der schlüssel ebenfalls verwendet wird. Mir würd daher allgemein reichen wenn ich den entsprechenden wert als string auslesen könnte.
Re: Numeric Werte aus Datenbank auslesen
Hi habe nun die Lösung gefunden. Dabei hat folgender Bug report geholfen https://bugreports.qt-project.org/browse/QTBUG-10451
nach öffnen einer Datenbankverbindung muss noch die NumericalPrecisionPolicy gesetzt werden.
Nun gibt die Datenbank nicht mehr den zu ungenauen Datentyp double zurück sondern man erhält das Ergebniss als QString
nach öffnen einer Datenbankverbindung muss noch die NumericalPrecisionPolicy gesetzt werden.
Nun gibt die Datenbank nicht mehr den zu ungenauen Datentyp double zurück sondern man erhält das Ergebniss als QString
Code: Alles auswählen
QSqlDatabase db;
db.open()
db.setNumericalPrecisionPolicy(QSql::HighPrecision);