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
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.
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
Hast du denn auch den passenden Datentyp Decimal
als SQL-Parameter angegeben (und nicht String
)?
Ansonsten zeige mal deinen Code.
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
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.
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
Da sind drei Dinge falsch.
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'
Parameters.Add
verwendenStatt
command.Parameters.AddWithValue("GWu1", DbType.Decimal).Value = NudGw_Gwu1.Value;
so
command.Parameters.Add("GWu1", DbType.Decimal).Value = NudGw_Gwu1.Value;
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.
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.
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
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.