Laden...

SQLite - Select-Probleme bei Vergleich von Zahlen/Kommwerten

Erstellt von CHCodix vor 9 Jahren Letzter Beitrag vor 9 Jahren 4.661 Views
C
CHCodix Themenstarter:in
12 Beiträge seit 2014
vor 9 Jahren
SQLite - Select-Probleme bei Vergleich von Zahlen/Kommwerten

Hallo,

ich verwende das SQLite-Datenbanksystem und habe Probleme beim vergleichenden Auslesen von Kommawerten. Ich habe einiges bezüglich SQL-Parameter (auch bei mysharp) recherchiert, aber irgendwie ergeben sich immer falsche Ergebnisse.

Folgende Werte in der Tabelle "Haupt", Spalte "Zahlen": 1,51; 9,51; 26; 56

Gebe ich jetzt als Vergleichswert in die Textbox den Wert "20" ein, dann zeigt er mir folgende Werte an: 9,51; 26; 56. Das ist mir vollkommen unverständlich. Warum zeigt er den Wert 1,51 nicht an, den Wert 9,51 jedoch fälschlicherweise schon?

            
            string sql = "SELECT Zahlen FROM Haupt WHERE Zahlen > @Masse";
            SQLiteCommand cmd = new SQLiteCommand(sql, conn);
            cmd.Parameters.Add("@Molmasse", DbType.VarNumeric).Value = textBox1.Text;
            SQLiteDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
               .....
             }

Mein Grundproblem: Ich möchte Werte wie z. B. 20,5; 23,45; 24,365; 4,01; aus einer Spalte meiner SQLite-Datenbank vergleichend auslesen (größer/kleiner als, auch mit Kommwerten, z. B. > 2,15). Ich verstehe einfach nicht, wie ich das ordentlich hinbekommen kann.

Würde mich über einen Tipp freuen.

Gruß,
CHCodix

F
10.010 Beiträge seit 2004
vor 9 Jahren

Naja, da hast du aber den Artikel zu [Artikelserie] SQL: Parameter von Befehlen nicht so wirklich verstanden.

Du must als Parameter schon den richtigen Typ benutzten, du benutzt aber string.

Also erstmal das TextBox.Text per Double.Parse oder Convert.ToDouble in einen Double bringen und den dann übergeben.

C
CHCodix Themenstarter:in
12 Beiträge seit 2014
vor 9 Jahren

Hatte ich schon versucht, folgende Änderung:


cmd.Parameters.Add("@Molmasse", DbType.VarNumeric).Value = Convert.ToDouble(textBox1.Text);

macht jedoch keinerlei Unterschied am Ergebnis. Ich bekomme immer noch ein falsches Ergebnis.

Seltsamerweise, wenn ich in die Textbox den Wert 9 eingebe, so zeigt er mir als Ergebnis nur den Wert 9,51 an. Anweisung war: zeige alle Werte über 9. Wer soll das verstehen???

F
10.010 Beiträge seit 2004
vor 9 Jahren

Und Zahlen ist auch als Numerischer Wert in der Tabelle?

Sieht mir eher so aus als wenn du da Strings in der DB hast

C
CHCodix Themenstarter:in
12 Beiträge seit 2014
vor 9 Jahren

Die Zahlen können nicht als numerische Werte in der Tabelle sein, da sonst ihr Nachkommateil weggeschnitten wird bzw. man kann gar keine Kommawerte eingeben. Insofern kommt bei SQLite meines Wissens nur String in Frage.

F
10.010 Beiträge seit 2004
vor 9 Jahren

Das war bei SQLite in V2 so, ab 3 ist das schon lange nicht mehr so.

Wenn du also die Spalte als String angelegt hast, musst du dich auch nicht wundern wenn es als String verglichen wird.

H
523 Beiträge seit 2008
vor 9 Jahren

Würde mich über einen Tipp freuen.

Setz das Statement doch einfach mal manuell ab (beispielsweise via http://sqlitebrowser.org/) und schau was rauskommt.

C
CHCodix Themenstarter:in
12 Beiträge seit 2014
vor 9 Jahren

Ich habe nach langem Herumprobieren jetzt eine Lösung gefunden:

            
string sql = "SELECT Zahlen FROM Haupt WHERE Zahlen < @Masse";
SQLiteCommand cmd = new SQLiteCommand(sql, conn);
cmd.Parameters.Add("@Masse", DbType.Decimal).Value = Convert.ToDecimal(textBox1.Text);

Voraussetzung dafür ist, dass die Spalte 'Zahlen' in der DB deb Typ 'Numeric' bekommt und alle Zahlen-/Kommawerte, die dort eingetragen werden, als Dezimalzeichen den Punkt haben, nicht das Komma! Dann kann in der Textbox sogar eine Zahl mit Komma als Dezimalzeichen reingeschrieben werden, funktioniert trotzdem. Anscheinend gab es ein Problem mit der Art des Dezimalzeichens (Punkt/Komma).

Schade, dass es so kompliziert sein muss und dass ich meine Komma-Werte in der DB in Punkt-Werte umwandeln muss. Es sei denn, ihr habt noch einen Tip für mich, wie ich das vermeiden kann.

Danke für die Denkanstöße,
CHCodix

PS: Natürlich benutze ich eine 3er-Version von SQLite, genauer gesagt den System.Data.SQLite Wrapper, der die fast neueste Version von SQLite enthält.
PSPS: Das manuelle Ausführen im SQLiteBrowser ergab das selbe Problem, zumal ich da keine Parameter verwenden konnte.

1.696 Beiträge seit 2006
vor 9 Jahren

Ich vermute dass du/jemand die DB verhunzt hat. (Fast) alle DBMS legen Dezimalzahlen intern mit Punkt als Dezimaltrennzeichen ab, wenn Datentyp als REAL, FLOAT, DECIMAL, etc. für die Spalte deklariert ist. Das was du siehst, ist wiederum abhängig von dem System womit du die Daten anzeigst. In deinem Fall war die Spalte wahrscheinlich als String (VARCHAR, CHAR) deklariert (weil deine Zahlen mit Komma als Dezimaltrennzeichen behaftet sind), danach aber in Zahlentyp umgeändert, deshalb hast du so 'n Kauderwelsch in deiner DB und muss handanlegen.

Normalerweise, wenn man mit SQLCommandParameter Daten in die DB einfügt, sorgt ADO dafür dass die Daten auch richtig in die DB überführt werden, ohne dass man sich um Punkt oder Komma als Trennzeichen kümmern muss. Zur Anzeige der Daten ist der Programmierer wiederum dafür zuständig, das richtige Format für den User in die Datenansicht zu bringen.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

C
CHCodix Themenstarter:in
12 Beiträge seit 2014
vor 9 Jahren

Tatsächlich, das habe ich wohl verhunzt. Ich hatte mir das zu Beginn nicht richtig überlegt bzw. die SQLite Datentypen nicht richtig verstanden, die Spalte als String definiert. Werde das jetzt ordentlich implementieren, danke.