Benutzer mit den meisten Antworten
Einfügen eines Decimal-Wertes mit Insert Into

Frage
-
Hi,
ich möchte mit Insert Into eine Datatable mit einem Decimalwert aktualisieren. Ich habe den txtBox.Text in eine Variable mit Parse, convert.ToDecimal und auch unter Hinzuziehung von Culturinfo konvertiert. Es erscheint jedesmal die Fehlermeldung, dass der vchar-Datentyp nicht in einen numerischen umgewandelt werden kann.
Wer kann mir helfen?
Jochen
Antworten
-
Hallo Jochen,
Dein sqlcommand würde so gar nicht erst vom Parser angenommen. Aber wenn es zumindest ähnlich aussieht und ich den DB-Typen richtig hellsehe, solltest Du keine Hochkommata um decBetrag setzen. Wenn ich Deine Codefetzen richtig interpretiere, hast Du an die Punkt-statt-Komma-Problematik schon gedacht, dabei bleibt es auch.
Grundsätzlich wäre das Arbeiten mit Parametern natürlich insbesondere bei Benutzereingaben Pflicht, und würde Dich obendrein auch dieser beiden Probleme entledigen.
Viel Erfolg!- Als Antwort markiert Mathias Schiffer Freitag, 5. Juni 2009 17:29
-
Wenn ich die Hochkommas wegnehme und den Decimalwert wie folgt schreibe: " & decBetrag & " kommt die Meldung:
Mal davon abgesehen, dass Deine Datenbanktypen ja hoch geheimnisvoll sein müssen: Du denkst wahrscheinlich doch noch immer am falschen Ende über das Problem nach. In Deiner Variablen decBetrag wird der Wert wahrscheinlich prima und zufrieden drinstehen.
Ein erforderlicher Wert ist nicht angegeben.
Bei der Ausgabe aber, dem impliziten decBetrag.ToString also, werden die lokalen Einstellungen berücksichtigt. Da kommt also statt eines benötigten Punkts das problematische Komma zum Tragen. Vermutlich hast Du die Einstellung "en-US" nicht dem Thread aufgedrückt (System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("en-US")) oder als ToString-Culture verwendet (decBetrag.ToString(New System.Globalization.CultureInfo("en-US"))), sondern sonstwie und erfolglos zu verwenden versucht. Das geht aus Deinen Codefetzen leider nicht genauer hervor.
Ersetze doch probeweise mal das
'" & decbetrag & "'
durch
" & Str(decBetrag) & "
oder alternativ .NET-artiger, wie gehabt,
" & decBetrag.ToString(New System.Globalization.CultureInfo("en-US")) & "
und berichte, sofern Du noch interessiert bist, über das Ergebnis (und vielleicht rückst Du ja doch noch die DB-Typen heraus ;-).
Viel Erfolg!
Mathias- Als Antwort markiert Mathias Schiffer Freitag, 5. Juni 2009 17:24
Alle Antworten
-
Hier mein Code:
dim decBetrag as decimal = convert.ToDecimal(txtbetrag.text)
oder
dim decBetrag as Decimal = Decimal.Parse(txtBetrag.Text)
oder
Parse mit Globalization.CultureInfo(en-us)
dim cmd as new sqlcommand("Insert Into Table (Datum, Betrag) Values ( '" & datevalue(txtdatum.text) & "', '" decBetrag & "')", con)
cmd.executeNonQuery()
Meldung bei btnSave_Click:
Fehler beim Konvertieren des varchar-Datentyps in numeric.
Jochen -
Hallo Jochen,
Dein sqlcommand würde so gar nicht erst vom Parser angenommen. Aber wenn es zumindest ähnlich aussieht und ich den DB-Typen richtig hellsehe, solltest Du keine Hochkommata um decBetrag setzen. Wenn ich Deine Codefetzen richtig interpretiere, hast Du an die Punkt-statt-Komma-Problematik schon gedacht, dabei bleibt es auch.
Grundsätzlich wäre das Arbeiten mit Parametern natürlich insbesondere bei Benutzereingaben Pflicht, und würde Dich obendrein auch dieser beiden Probleme entledigen.
Viel Erfolg!- Als Antwort markiert Mathias Schiffer Freitag, 5. Juni 2009 17:29
-
Wenn ich die Hochkommas wegnehme und den Decimalwert wie folgt schreibe: " & decBetrag & " kommt die Meldung:
Ein erforderlicher Wert ist nicht angegeben. Der Datumswert alleine funktioniert, auch die Eingabe von Strings ist kein Problem. Wenn ich mit cultureInfo en-us arbeite, werden die Nachkommastellen nicht berücksichtigt, es wird ein Integer-Wert in der db gespeichert.
Es ist nur eine kleine Datenbank mit 4 Feldern, in die überwiegend Daten eingegeben werden und seltener Daten anzuzeigen sind. Deshalb wollte ich auf den Einsatz eines Datasets verzichten. Meines Wissens funktioniert eine Parametereingabe nur mit Dataadapter und Dataset? -
Ich mache gerade meine ersten Gehversuche mit VB2008 Express und SQL Server 2008 Express und bin noch nicht firm in der Erstellung von gespeicherten Proceduren. Da es aber offensichtlich bei der Konvertierung eines Decimal-Wertes Probleme gibt (beim Googeln habe ich drei Hilferufe von Anwendern gefunden, ohne dass eine Lösung gefunden wurde), werde ich bei meiner kleinen Anwendung zunächst auf den SQl Server verzichten und meine Daten in einer XML-Datei speichern.
Mein bisheriger Code-Versuch:
Dim dBetrag As Decimal = Decimal.Parse(txtBetrag.Text)
Dim cmd As New SqlCommand("Insert Into Test (Datum, Betrag) Values ('" & DateValue(txtDatum.Text) & "', '" & dBetrag & "' )", Conn)
TryConn.Open()
cmd.ExecuteNonQuery()
Conn.Close()
fillDG()Catch ex As Exception
MessageBox.Show(ex.Message)
Conn.Close()
End Try -
Nein, DataAdapter und DataSet sind dazu nicht notwendig, siehe z.B.
http://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqlcommand.parameters.aspx -
Wenn ich die Hochkommas wegnehme und den Decimalwert wie folgt schreibe: " & decBetrag & " kommt die Meldung:
Mal davon abgesehen, dass Deine Datenbanktypen ja hoch geheimnisvoll sein müssen: Du denkst wahrscheinlich doch noch immer am falschen Ende über das Problem nach. In Deiner Variablen decBetrag wird der Wert wahrscheinlich prima und zufrieden drinstehen.
Ein erforderlicher Wert ist nicht angegeben.
Bei der Ausgabe aber, dem impliziten decBetrag.ToString also, werden die lokalen Einstellungen berücksichtigt. Da kommt also statt eines benötigten Punkts das problematische Komma zum Tragen. Vermutlich hast Du die Einstellung "en-US" nicht dem Thread aufgedrückt (System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("en-US")) oder als ToString-Culture verwendet (decBetrag.ToString(New System.Globalization.CultureInfo("en-US"))), sondern sonstwie und erfolglos zu verwenden versucht. Das geht aus Deinen Codefetzen leider nicht genauer hervor.
Ersetze doch probeweise mal das
'" & decbetrag & "'
durch
" & Str(decBetrag) & "
oder alternativ .NET-artiger, wie gehabt,
" & decBetrag.ToString(New System.Globalization.CultureInfo("en-US")) & "
und berichte, sofern Du noch interessiert bist, über das Ergebnis (und vielleicht rückst Du ja doch noch die DB-Typen heraus ;-).
Viel Erfolg!
Mathias- Als Antwort markiert Mathias Schiffer Freitag, 5. Juni 2009 17:24