Laden...

Datentyp Decimal NumericUpDown und Insert oder Update in SQL

Erstellt von RobertStahl vor 11 Monaten Letzter Beitrag vor 11 Monaten 486 Views
R
RobertStahl Themenstarter:in
5 Beiträge seit 2023
vor 11 Monaten
Datentyp Decimal NumericUpDown und Insert oder Update in SQL

Hallo an alle,

als kurzes Vorwort, ich bin ein totaler Neuling im Bereich C# Programmierung, mache gerade eine Ausbildung dazu und komme mit folgendem Problem nicht wirklich zurecht bzw. finde ich keine passende Lösung welche mir eine passende Lösung bringt.

und zwar geht es um folgendes:

ich habe in WindowsForms eine Oberfläche gebastelt mit diversen Controls usw. darunter befinden sich auch ein paar numericUpDown felder die von 0-100 mit einer Kommastelle editiert werden können, nun habe ich das Problem das der Insert oder Update in SQL einen Fehler ausgibt das, dass format nicht passt, auf der datenbank habe ich das format decimal und lt. meiner recherche sollte ja auch das NumUD decimal liefern, das scheint aber nit so zu sein bzw, hat das mit der ländereinstellung was zu tun, auf jeden fall kann ich ganze Zahlen inserten oder updaten aber sobald ein Komma kommt catch mit meldung vchar zu decimal

hab auch schon versucht statt numUD, textboxen mit replace von ',' zu '.' versucht dann wird plötzlich der Wert um das 10fache erhöht. vielleicht konzertiere ich mich auch mittlerweile auf die falschen Sachen, aber bin da nun schon seit einigen tagen dran irgendwie eine Lösung zu finden

für Unterstützung wäre ich sehr dankbar

lg

126 Beiträge seit 2023
vor 11 Monaten

Hallo, du hast den klassischen Anfängerfehler (nicht falsch verstehen, den macht gefühlt jeder Programmierer auf seiner Reise - ich auf jeden Fall auch) gemacht.

Wenn du ein SQL-Statement per string zusammenbaust, dann ist das ein grober Fehler - Grüße von Little Bobby Tables.

Sicherer und einfacher funktioniert das mit Parametern denn die Parameter sorgen dafür, dass die Werte beim SQL-Server auch korrekt ankommen.

Hat die Blume einen Knick, war der Schmetterling zu dick.

R
RobertStahl Themenstarter:in
5 Beiträge seit 2023
vor 11 Monaten

Hallo Zusammen, danke für die Tipps, da muss ich mich allerdings etwas einlesen, meine ersten Versuche sind gescheitert, weil das Format trotzdem nicht korrekt übergeben wird,

Aber ich werde hier schon eine passende Lösung finden um das Problem zu lösen, muss ja gehen, machen ja viele SQL Anbindungen ebenfalls so

lg

4.939 Beiträge seit 2008
vor 11 Monaten

Hast du denn auch den passenden Datentyp Decimal als SQL-Parameter angegeben (und nicht String)?

Ansonsten zeige mal deinen Code.

R
RobertStahl Themenstarter:in
5 Beiträge seit 2023
vor 11 Monaten

Hallo, wenn ich das alles korrekt gemacht habe bin mir da allerdings auch nicht ganz sicher (und wie schon gesagt ein totaler Neuling)

das wäre jetzt nur mal mit einem NumericUpDown, weil die anderen 15 baue ich dann erst Später dazu sobald das ganze irgendwie funktioniert

Button Grenzwerte Ändern

{
try
{
command.CommandText = $"UPDATE Grenzwerte SET GWu1 = '@GWu1'  WHERE REF_Produkt = 'Int aus einer Textbox'
 command.Parameters.AddWithValue("GWu1", DbType.Decimal).Value =  NudGw_Gwu1.Value;  // das wäre das NumericUpDown-Feld was nicht editierbar ist und vorher geladen wird
               connection.Open();
               //command.ExecuteNonQuery();
               int anz = command.ExecuteNonQuery();
               MessageBox.Show($"{anz} Die Grenzwerte für das Produkt/Artikel:{LblEr_Bezeichnung.Text} wurden aktualisiert", "Grenzwerte ändern");
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message);
           }
           connection.Close();
}

hab auch noch einen Button für den INSERT, aber wenn ich eine Lösung habe wird auch die Andere kein Problem sein

4.939 Beiträge seit 2008
vor 11 Monaten

Zum einen darfst du bei den Parametern im SQL-String keine Anführungsstriche verwenden und zum anderen: welchen Datentyp hat die Tabellenspalte GWu1?

PS: Es gibt im Foren-Editor einen Button, um Code einzutragen und formatieren zu lassen.

R
RobertStahl Themenstarter:in
5 Beiträge seit 2023
vor 11 Monaten

Hallo, ok das mit code-button hab ich nicht gesehen, danke für den tipp

Auf der datenbank sind die spalten als decimal angelegt und id und ref als int weil die werden als pk und fk automatisch angelegt mit startwert 10 und incremental +1

Bin leider im moment nur am mobiltelefon online, werde aber das ausbessern und nochmals veruschen

Danke

126 Beiträge seit 2023
vor 11 Monaten

Da sind drei Dinge falsch.

1. Anführungszeichen

command.CommandText = $"UPDATE Grenzwerte SET GWu1 = '@GWu1'  WHERE REF_Produkt = 'Int aus einer Textbox'

Die Parameter kümmrn sich von ganz alleine darum, dass die Werte korrekt übergeben werden. Jede weitere Bevormundung durch Anführungszeichen o.ä. empfinden diese als übergriffig.

So ist es korrekt

command.CommandText = $"UPDATE Grenzwerte SET GWu1 = @GWu1  WHERE REF_Produkt = 'Int aus einer Textbox'

2. Parameters.Add verwenden

Statt

command.Parameters.AddWithValue("GWu1", DbType.Decimal).Value =  NudGw_Gwu1.Value;

so

command.Parameters.Add("GWu1", DbType.Decimal).Value =  NudGw_Gwu1.Value;

3. Parameter-Name

Der Name des Parameters lautet exakt so wie er in dem Command-Text angegeben wurde - wirklich exakt und kein "so irgendwie in der Art evetuell"

Wenn dort der Parameter also als @GWu1 angegeben wurde, dann ist genau das auch der Name.

Also statt

command.Parameters.Add("GWu1", DbType.Decimal).Value =  NudGw_Gwu1.Value;

so

command.Parameters.Add("@GWu1", DbType.Decimal).Value =  NudGw_Gwu1.Value;

Hat die Blume einen Knick, war der Schmetterling zu dick.

126 Beiträge seit 2023
vor 11 Monaten

Wenn du es allerdings ganz bequem haben möchtest, dann kannst du auch Dapper verwenden. Dann würde das so aussehen:

class GrenzwerteDto
{
    public int ProductReference { get; set; }
    public decimal GWu1 { get; set; }
}

connection.Open();
var data = new GrenzwerteDto { ProductReference = 42, GWu1 = 12.45, };
connection.Execute( "UPDATE Grenzwerte SET GWu1 = @GWu1 WHERE REF_Produkt = @ProductReference", data );

oder mit noch weniger Boilerplate

connection.Open();
connection.Execute( "UPDATE Grenzwerte SET GWu1 = @GWu1 WHERE REF_Produkt = @ProductReference", 
    new { ProductReference = 42, GWu1 = 12.45, } );

Kann man sich überlegen

Hat die Blume einen Knick, war der Schmetterling zu dick.

R
RobertStahl Themenstarter:in
5 Beiträge seit 2023
vor 11 Monaten

Perfekt, danke, aber das @GWu1 wird anscheinend benötigt für die Zuweisung im Update-Befehl

ohne findet er den Namen nicht, läuft aber sauber ab, vielen Dank nochmals für die tolle Hilfe, und finde das mit den Parametern echt gut, da muss man sich nicht Gedanken machen ob das Format stimmt, eigentlich eine Geile Sache

lg

126 Beiträge seit 2023
vor 11 Monaten

Zitat von RobertStahl

Perfekt, danke, aber das @GWu1 wird anscheinend benötigt für die Zuweisung im Update-Befehl

Ja, ähm ... genau ... ich habe doch auch nicht gesagt "entferne das @ Zeichen" sondern du musst bei Parameters.Add den Parameter-Namen so verwenden wie du ihn im Statement geschrieben hast. Und zwar genau so.

Denn

Parameters can be prefixed with either :, @, or $.

aber für einen Präfix musst du dich zwingend entscheiden und der Parameter-Name ist immer mit Präfix anzugeben.

Hat die Blume einen Knick, war der Schmetterling zu dick.