none
Einfügen eines Decimal-Wertes mit Insert Into RRS feed

  • 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

    Sonntag, 17. Mai 2009 13:15

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!

    Sonntag, 17. Mai 2009 21:25
  • Wenn ich die Hochkommas wegnehme und  den Decimalwert wie folgt schreibe: " & decBetrag & " kommt die Meldung:
    Ein erforderlicher Wert ist nicht angegeben.
    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.

    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
    Sonntag, 24. Mai 2009 14:27

Alle Antworten

  • Hallo Jochen,

    wann erscheint die Fehlermeldung? Welchen Datentyp hat denn die Spalte in Deiner Datenbank? Magst Du mal etwas Code zeigen, oder ein reproduzierbares Mini-Beispiel?
    Sonntag, 17. Mai 2009 14:46
  • 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
    Sonntag, 17. Mai 2009 19:19
  • 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!

    Sonntag, 17. Mai 2009 21:25
  • 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?
    Montag, 18. Mai 2009 06:33
  • Kannst Du mal posten, wie dein finaler INSERT INTO String aussieht?
    Warum nimmst du übrigens keine Gespeicherte Prozedur, um die Daten in die Datenbank zu schreiben?
    -- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org
    Montag, 18. Mai 2009 12:18
  • 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

    Donnerstag, 21. Mai 2009 03:33
  • Nein, DataAdapter und DataSet sind dazu nicht notwendig, siehe z.B.
    http://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqlcommand.parameters.aspx
    Freitag, 22. Mai 2009 15:08
  • Wenn ich die Hochkommas wegnehme und  den Decimalwert wie folgt schreibe: " & decBetrag & " kommt die Meldung:
    Ein erforderlicher Wert ist nicht angegeben.
    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.

    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
    Sonntag, 24. Mai 2009 14:27
  • Danke,

    es hat bereits mit der ersten Version geklappt.

    Jochen
    • Als Antwort markiert Joweka Donnerstag, 28. Mai 2009 04:38
    • Tag als Antwort aufgehoben Mathias Schiffer Freitag, 5. Juni 2009 17:24
    Donnerstag, 28. Mai 2009 04:38
  • Hallo Jochen,

    damit wir alle etwas davon haben: Was meinst Du mit "erste Version"? Das " & Str(decBetrag) & "? Oder einen anderen Beitrag?

    Viele Grüße
    Mathias
    Donnerstag, 28. Mai 2009 12:31
  • Hallo Mathias,

    es funktionierte: " & Str(decBetrag) & "

    Gruß
    Jochen
    Freitag, 5. Juni 2009 16:08