Laden...

Datenbank einfügen, Konvertieren

Letzter Beitrag vor 18 Jahren 12 Posts 9.190 Views
Datenbank einfügen, Konvertieren

Hallo.
Ich habe folgendes Problem vielleicht hat jemand eine gute Idee.
code:


double f = Convert.ToDouble(data[s][z]); //string[][] data, string Werte werden in double konvertiert
string sql = "INSERT INTO Messwert(Messwertwert) VALUES ('" + f + "')"; //in datenbank einfügen, fehlermeldung
SqlCommand meinCommand = new SqlCommand(sql, meineConnection);
meineConnection.Open();
meinCommand.ExecuteNonQuery();
meineConnection.Close();

1.Ich habe eine Tabele Messwert, mir einer Spalte Messwertwert die den Datentyp "float" hat.
Da der SQLServer den Datentyp "double" nicht kennt, habe ich hier http://msdn2.microsoft.com/de-de/library/ms378715.aspx
gelesen das man float benutzten kann, deshalb habe ich die Tabellespalte auch als float definiert.
wenn ich jetzt Werte einfügen möchte dann kommt die Fehlermeldung "Fehler beim Konvertieren des varchar-Datentyps in float."
Es wird nur der erste Wert (0) in die Spalte eingefügt.Hat jemand eine Idee woran das liegen könnte?

  1. Die Werte die ich einlese, konvertiere und speichern möchte, sehe so "0,000 0,001121 5,15E-005 0,0006027 0,001153" aus.
    Die Zahlen in Exponentialdarstellung, z.B. 5,15E-004 werden korrekt bis "-004" in double konvertiert(0,000515), sieht die Zahl so aus 5,15E-005 also "-005"(5Stellen links) dann passiert nichts und die Zahl wird auch so ausgegeben (5,15E-005). Welchen Datentyp benutze ich da??

Gruß
niko8380

Hallo,

ich vermute Folgendes: Dein DbCommand übergibt einen String sql, der von der Datenbank aufgelöst werden muss. Dabei konvertiert NET die double-Variable mit f.ToString() automatisch, und die DB muss das wieder interpretieren.

Deshalb gilt die grundsätzliche Empfehlung, dass DbCommands mit Parametern erstellt werden sollen, siehe Beispiel unter :rtfm: SqlParameterCollection.Add-Methode (String, SqlDbType, Int32) und andere Überladungen.

Gruß Jürgen

Und man fragt sich ebenfalls, warum du einen String in einen float in einen String baust.. Der String enthaelt doch anscheinend die richtige Genauigkeit und einen exakten Wert. Wenn du das jetzt nicht zum rechnen brauchst, warum willst du das nicht so belassen?

Pound for pound, plutonium is about as toxic as caffeine when eaten.

hallo

Ich möchte mit den Zahlen später arbeiten, z.b. Visualisieren, deshalb brauche ich sie in double oder ein ähnlichem datentyp.
Ich schaue mir die SqlParameterCollection an, scheint interessant zu sein

Danke

Gruß
niko8380

string sql = "INSERT INTO Messwert(Messwertwert) VALUES (**:::

Hallo niko8380,
du könntest auch einfach die einfachen Hochkommas in deinem SQL-String weglassen.
Du mußt dabei aber auf die Tausendertrennung achten (Punkt -> Komma!)

Gruß
Jürgen

Hi primel,
wenn ich die Hochkommas weglasse kommt dann folgende Fehlermeldung:
"In der INSERT-Anweisung sind weniger Spalten angegeben als Werte in der VALUES-Klausel."
Der Ansatz von juetho scheint logisch zu sein. Ich habe mir die "SqlParameterCollection.Add-Methode (String, SqlDbType, Int32)" aber so richtig schlau bin ich daraus noch nicht geworden. Wer ein Beispiel hat, immer her damit.

Gruß
niko8380

Und mit **Parametern **gibt es solche Probleme nicht: einfache oder doppelte Hochkommata, Konvertierungen hin und zurück, unpassende Formatierungen usw. Also:

Original von niko8380
Ich schaue mir die SqlParameterCollection an, scheint interessant zu sein

Genau das, und jeder andere Versuch und jede andere Diskussion führt (in diesem Zusammenhang) nur zu anderen Krücken! Jürgen

Hi niko8380,

hast du mehrere Spalten in deiner DB?

Hast du die Werte, die du reinschreiben willst (f) überprüft, ob da die Dezimaltrennzeichen stimmen (Datenbanken speichern meist in amerikanischer Dezimaltrennung, also Punkt statt Komma).
Kommt da ein Komma, meint die DB-Engine beim speichern, du hast mehrere Felder im Values-Bereich und hat damit recht mit ihrer Fehlermeldung.

Wenn`s das nicht ist, kann ich dir leider nicht mehr weiterhelfen.

Gruß
primel

P.S. Hab mir gerade ein Beispiel-SQL gebastelt und da funktionierts!

@juetho

Ich geb dir mit den SQL-Parametern natürlich Recht, es funktioniert aber in "reinem" SQL auch.

Gruß
primel

Original von primel
@juetho

Ich geb dir mit den SQL-Parametern natürlich Recht, es funktioniert aber in "reinem" SQL auch.

Gruß
primel

Natürlich, aber eben nur dann, wenn alle Rahmenbedingungen (die Du ja auch nennst) exakt stimmen. Wenn auch nur eine davon nicht passt, dann knallt es; und viele Leute suchen nach den Fehlern. Jürgen

Hallo.
@Primel
wahscheinlich hast du recht.
Die Tabelle in der ich einfügen möchte hat mehrere Spalten.
Wenn ich die Werte die ich einfügen,zum Testen, verändere d.h. das Komma durch einen Punkt ersetze, dann klappt das einfügen ohne Hochkommas. Dabei wird aber anstatt von "0.01040" der Wert "1040" gespeichert.
Ich weiß aber nicht was ich machen soll, das Komma durch einen Punkt ersetzen, aber dann werden die Stellen vor dem Komma(wenn 0) wegelassen
und sieht so aus:
0.01040 --->1040
2.815-->2815

@juetho
Hast du vielleicht ein Beispiel oder weißt du wo ich eins finden um das mit SqlParameterCollection umzusetzten?

Gruß
Niko

Original von niko8380
Hast du vielleicht ein Beispiel oder weißt du wo ich eins finden um das mit SqlParameterCollection umzusetzten?

Ein Beispiel (hier für Update) findest Du unter anderem im Openbook C# im Abschnitt 26.7.3 Aktualisieren mit »ExecuteNonQuery« unter Bereitstellung der Command-Objekte, außerdem (allerdings sehr kurz) in meinem obigen Hinweis auf :rtfm:

Jürgen

PS. Ich bin sonst nicht so hart, dass ich ein bestimmtes Verfahren als das einzig richtige bevorzuge. Aber dieses Beispiel mit der Konvertierung spezieller Zahlen ist so eklatant, dass ich mich unbedingt festlegen wollte.