oneitis - Fr 14.05.10 17:46
Titel: Von numericUpDown in Double nach SQL Float, Dezimaltrennzeic
Wie in der Überschrift schon erwähnt, ich habe ein NumericUpDown Feld in dem ich einen Wert eingetragen habe, danach wird dieser mit convert.todouble in double (kaleingabe, eweingabe und kheingabe) konvertiert und danach wird noch durch 100 dividiert...
Somit entstehen in den meisten fällen auch Kommazahlen.
Wenn ich diese dann mit
C#-Quelltext
1: 2:
| sqlprodukteingabe = "INSERT INTO produkte(produkt, kalorien, eiweiss, kohlehydrate)" + " Values('" + produkteingabe + "','" + kaleingabe + "','" + eweingabe + "','" + kheingabe + "')"; |
an meinen Sql Server übergeben will entsteht das problem, das in den Doublevariablen als Dezimaltrennzeichen "," verwendet wird und bei der Übergabe dann natürlich folgender Fehler auftritt:
Zitat: |
Fehler beim Konvertieren des varchar-Datentyps in float. |
Weil folgende Zeile übergeben wird:
INSERT INTO produkte(produkt, kalorien, eiweiss, kohlehydrate) Values('Steak','5','0,2','0,01')
Und damit natürlich die ganze Syntax versaut wird...
Jetzt hab ich schon versucht das ganze mit folgendem Code zu lösen... was aber keinen unterschied macht -.-
C#-Quelltext
1: 2: 3: 4: 5:
| NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat; nfi.NumberDecimalSeparator = "."; double kaleingabe = Convert.ToDouble(numericUpDown1.Value, nfi); double eweingabe = Convert.ToDouble(numericUpDown2.Value, nfi); double kheingabe = Convert.ToDouble(numericUpDown3.Value, nfi); |
JüTho - Fr 14.05.10 19:14
Dieses ständige Konvertieren ist weitgehend Quatsch und führt zu Fehlern. Decimal zu double zu string zu double. Lass das doch: Wenn du eine Zahl hast und als Zahl damit arbeiten willst, dann mach das einfach.
C#-Quelltext
1:
| double d = numericUpDown1.Value.ToDouble() / 100; |
Für SQL-Befehle sind
Parameter zu verwenden, dann gibt es keine Formatierungsprobleme.
C#-Quelltext
1: 2: 3: 4:
| string sql = "INSERT INTO produkte(produkt, kalorien, eiweiss, kohlehydrate)" + " Values(@produkt, @kal, @ew, @kh)"; SqlCommand cmd = new SqlCommand(sql, connectionstring); cmd.Parameters.AddWithValue("@produkt", produktValue); |
produktValue usw. sind dabei double-Werte. (Wenn die DB-Tabelle entsprechend definiert ist, kannst du auch direkt mit den decimal-Werten arbeiten.)
Du siehst: Ich muss nirgends auf den Dezimaltrenner achten. Mehr zu Sql-Parametern findest du unter
[Artikelserie] Parameter von SQL Befehlen [
http://www.mycsharp.de/wbb2/thread.php?threadid=66704]
Gruß Jürgen
Nebenbei: Bezeichner wie numericUpDown1 sollten verboten werden, siehe
.NET Richtlinien für Namen [
http://msdn.microsoft.com/de-de/library/ms229002.aspx] oder als Kurzfassung
Namenskonventionen [
http://de.wikibooks.org/wiki/Arbeiten_mit_.NET:_Allgemeines/_Namenskonventionen]