Numeric Werte aus Datenbank auslesen

Alles rund um die Programmierung mit Qt
Antworten
Schubi
Beiträge: 8
Registriert: 4. Juni 2012 15:13

Numeric Werte aus Datenbank auslesen

Beitrag von Schubi »

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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Numeric Werte aus Datenbank auslesen

Beitrag von franzf »

Das ist doch nur die Ausgabe. Mit std::cout + Manipulatoren kannst du die Ausgabegenauigkeit beliebig setzen.
Schubi
Beiträge: 8
Registriert: 4. Juni 2012 15:13

Re: Numeric Werte aus Datenbank auslesen

Beitrag von Schubi »

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?
Schubi
Beiträge: 8
Registriert: 4. Juni 2012 15:13

Re: Numeric Werte aus Datenbank auslesen

Beitrag von Schubi »

Danke noch mal für die Hilfe bin jetzt auf ne gute Lösung gekommen

QString formatierterWert=QString( "%1" ).arg( d, 0, 'f', 0);
Schubi
Beiträge: 8
Registriert: 4. Juni 2012 15:13

Re: Numeric Werte aus Datenbank auslesen

Beitrag von Schubi »

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.
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Numeric Werte aus Datenbank auslesen

Beitrag von brax »

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.
Schubi
Beiträge: 8
Registriert: 4. Juni 2012 15:13

Re: Numeric Werte aus Datenbank auslesen

Beitrag von Schubi »

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.
Schubi
Beiträge: 8
Registriert: 4. Juni 2012 15:13

Re: Numeric Werte aus Datenbank auslesen

Beitrag von Schubi »

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

Code: Alles auswählen

QSqlDatabase db;
db.open()
db.setNumericalPrecisionPolicy(QSql::HighPrecision);
Antworten