Fehler beim abspeichern von Double/Decimal in SQL Datenbank

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Ecki P..

    Fehler beim abspeichern von Double/Decimal in SQL Datenbank

    Verzweiflung pur... nach tagelanger Suche im Netz gebe ich auf und frage hier mal nach:

    In meiner SQL Datenbanktabelle habe ich einige Felder als decimal(x,y) definiert. Wenn ich nun eine ganze Zahl eingebe, wird diese ordentlich abgespeichert. Gebe ich eine Dezimalzahl ein, erhalte ich die Fehlermeldung:
    "System.Data.SqlClient.SqlException: "Fehler beim Konvertieren des varchar-Datentyps in numeric."

    Definition der Spalte in der SQL Datenbank:
    Spaltenname: Wert / Datentyp decimal(3, 1)

    VB.NET-Quellcode

    1. Private Sub SQL_UpdateRecord(strTable As String)
    2. Dim strComm As String
    3. myConn.Open()
    4. myCmd.Connection = myConn
    5. strComm = "UPDATE " & strTable & " SET "
    6. strComm &= "Datenfeld1 = '" & Text_Datenfeld1.Text
    7. ' Auflistung weiterer Felder
    8. strComm &= "'Wert = '" & CDbl(Text_Wert.Text)
    9. ' Auflistung weiterer Felder
    10. strComm &= " ' WHERE ID =" & CInt(Text_ID.Text) & ""
    11. myCmd.CommandText = strComm
    12. myCmd.ExecuteNonQuery()
    13. myConn.Close()
    14. End Sub


    Den zu übertragenden Wert lese ich aus einer TextBox aus, die im Laufe des Programms bereits als Zahl mit einer Nachkommastelle formatiert wird:

    VB.NET-Quellcode

    1. Text_Wert.Text = Format(CDbl(Text_Wert.Text), "#0.0")


    Was ich bisher herausfinden konnte, ist, dass es sich hier offensichtlich um einen Konflikt der Ländereinstellungen handelt - in der SQL Datenbank sind die Werte nach meinem deutschen Betriebssystem mit ',' dargestellt, VB.NET stellt die mit '.' dar. (Ich kann gar nicht glauben, dass das in der heutigen Zeit noch die Ursache sein kann... )

    Ich habe auch schon mal probiert, den Wert in einen String zu konvertieren und den Punkt durch das Komma zu ersetzen - führt zum gleichen Fehler. Wäre auch nur ein Fix und keine Lösung (soll im Zweifel ja auch auf einem englischen Betriebssystem laufen, wo die SQL Datenbank dann wohl auch wieder einen Dezimalpunkt verwendet)

    Das muss doch irgendwie einfach zu lösen sein - ich bin doch sicher nicht der Einzige, der versucht, eine Dezimalzahl in eine SQL Tabelle zu schreiben...

    Danke schon mal für eure Mühen und Hilfe!

    Gruß,
    Ecki

    Ecki P.

    Microsoft Windows Home 10
    Microsoft Visual Studio Community 2017 / Version 15.8.8
    Microsoft SQL Server Management Studio 14.0.17289.0
    .NET Framework 4.6.1
    Es hat gar keinen Sinn, sich mit dem Programm zu streiten... am Ende hat es einfach immer Recht!
    oh - in dem bischen Code zeigen sich schon viele schlechte Gewohnheiten, die du unbedingt abstellen solltest.
    Aber erstmal das Problem mittm Db-Zugriff: So wie du es versuchst, ist es zwar prinzipiell möglich, ist aber super-umständlich, und fehleranfällig (wie du siehst), und v.a. eine Riesen-Sicherheitslücke, siehe
    Must-Know: Sql-Injection (bitte folge dem Link).

    Du solltest es also unterfangen, den Umgang mit DbParametern zu erlernen.

    Besser wäre, du würdest gleich mit DataAdaptern rangehen, dassis deutlich einfacher, und auch performanter, weil damit stünde dir eine automatische Änderungsverfolgung zur Verfügung.

    Noch besser wäre, du würdest die typisierte Dataset-Technologie erlernen - dann könntest du Databinding verwenden - das allereinfachste, um Eingaben, die zu speichern sind, zu programmieren.

    Noch viel besser wäre, du würdest die DB erstmal weglassen, denn ein typisiertes Dataset kann man auch ohne eine solche laden und speichern.

    Wie dem auch sei - Hinweise zum ersteren findeste auch im verlinkten Tut.
    @ErfinderDesRades Wow - vielen Dank für diesen offenen Zerriss... und das meine ich wirklich! :thumbup:
    Von Gewohnheiten können wir noch gar nicht reden, da ich erst seit ca. 6 Wochen wieder programmiere... also eher wehret den Anfängen :D

    Das Beispiel in dem Link ist sehr eindrucksvoll und eigentlich auch ganz offensichtlich.
    Dann werde ich mich mal daran machen, mich ordentlich weiter zu bilden - wenn du noch Tipps hast, welche Tutorien oder Bücher zur typisierten Dataset-Technologie besonders hilfreich sind, wäre ich super dankbar (oder finde ich die schon unter dem Link?). Ansonsten finde ich mich sicher auch mit Freund Google durch.

    Eine Frage bleibt zum Grundsätzlichen - das Programm soll mehreren Usern erlauben, auf eine zentrale Datenbank mit mehreren Tabellen zuzugreifen. Das alles kann ich ohne die (SQL)DB schon mit dem typisierten Dataset machen?

    Gruß,
    Ecki

    Ecki P.

    Microsoft Windows Home 10
    Microsoft Visual Studio Community 2017 / Version 15.8.8
    Microsoft SQL Server Management Studio 14.0.17289.0
    .NET Framework 4.6.1
    Es hat gar keinen Sinn, sich mit dem Programm zu streiten... am Ende hat es einfach immer Recht!

    Ecki P. schrieb:

    Dann werde ich mich mal daran machen, mich ordentlich weiter zu bilden - wenn du noch Tipps hast, welche Tutorien oder Bücher zur typisierten Dataset-Technologie besonders hilfreich sind, wäre ich super dankbar (oder finde ich die schon unter dem Link?).



    Die vier Views von EDR.
    Die haben mir auch sehr geholfen und mir das Programmieren mit Datenbanken sehr vereinfacht. Kann man jedem nur ans Herz legen :)

    Ecki P. schrieb:

    eher wehret den Anfängen
    Jepp - das ist ein Punkt, der meist nicht in seiner Tragweite eingesehen wird - beim Programmieren ists so:
    Jede erfolgreiche Problemlösung wird sofort zur Gewohnheit, d.h. beim nächsten Mal macht mans natürlich wieder ebenso.
    Und jede schlechte Lösung - wenn sie denn trotzdem funktioniert - wird so automatisch zu einer schlechten Gewohnheit.



    Bei dir im Code taucht zB die olle Format()- Funktion auf, die ist noch aus vb6-Zeiten nach .Net rübergerettet.
    Es ist Grütze, den gesamten vb6-Kram sollte man in .Net nie nie mehr verwenden.
    Es gibt auch Wege, die vb6-Grütze zwar nicht zu entfernen, aber zumindest auszublenden, sodass man garnet mehr in Versuchung kommt, mit Format, Left, Mid, Len, FileOpen etc herumzuhampeln: Visual Studio - Empfohlene Einstellungen
    Es sind in vb.net 2 "Erbsünden" in den Projekteinstellungen voreingestellt:
    1. die Option Strict Off - General-CompilerDirektive
    2. der Microsoft.VisualBasic-Namespace - General-Import
    Beidem zu begegnen gibt der gegebene Link ausführliche Anleitung, weil ist für Anfänger erstmal nicht sonderlich intuitiv. Aber je früher man da durch ist (und durch muss jeder), desto besser.
    Nur mit den genannten modifizierten Grundeinstellungen ist Vb.Net überhaupt eine OOP-Sprache, und c# ebenbürtig.



    Ecki P. schrieb:

    wenn du noch Tipps hast, welche Tutorien oder Bücher zur typisierten Dataset-Technologie besonders hilfreich sind
    Hier habe ich eine Art "Lehrplan" verzapft, was man alles wissen muss, um tragfähige Datenverarbeitungen zu programmieren: Datenverarbeitungs-Vorraussetzungen
    Wennde dich daran orientierst, müssteste eiglich deutlich schneller Fortschritte machen, als wennde nur auf Buch, nur auf Tutorials, nur auf Forum, oder nur auf "LearningByDoing" setzst.



    Zu deim Db-Programm: Ja, eine Multi-User-Anwendung macht tatsächlich eine Datenbank-Anbindung erforderlich.
    Dennoch empfehle ich, die erstmal ohne Db zu entwickeln, weil das ist deutlich einfacher, und man muss nicht während des ganzen Entwicklungsprozesses (kann ja Jahre dauern), bei Änderungen am Datenmodell die Datenbank mit umbasteln.
    Tatsächlich kannst du deine Anwendung komplett ausprogrammieren, und erst wenn featurecomplete, dann noch nachträglich die Xml-Datei durch eine richtige Db ersetzen, und dann die Multi-User-Anpassungen vornehmen.
    Also nicht auf allen Baustellen gleichzeitig tanzen.
    Oha, da habe ich jetzt ja erstmal zu lesen - zum Glück haben wir ja jetzt ein paar ruhige Tage ;)

    ErfinderDesRades schrieb:


    Es sind in vb.net 2 "Erbsünden" in den Projekteinstellungen voreingestellt:
    1. die Option Strict Off - General-CompilerDirektive
    2. der Microsoft.VisualBasic-Namespace - General-Import


    Das hat mir nun auch schon ein paar Fehler erzeugt, gibt zu tun...

    Danke nochmal und schöne Feiertage!

    Ecki P.

    Microsoft Windows Home 10
    Microsoft Visual Studio Community 2017 / Version 15.8.8
    Microsoft SQL Server Management Studio 14.0.17289.0
    .NET Framework 4.6.1
    Es hat gar keinen Sinn, sich mit dem Programm zu streiten... am Ende hat es einfach immer Recht!