Hallo Rolf,
mea culpa ;-)
noch was anderes, so von C#+SQL Veteran zu C# Newbie. Die folgende Zeile kann man gar nicht rot genug machen…
cmd.CommandText = "SELECT * FROM writeplc WHERE LEFT(plcvarname," + plcname.Length + ") = " + "'" + plcname + "'";
SELECT *verwendet man bei interaktiven Abfragen, aber niemals in Programmcode. Gib die Spalten immer explizit an
Das "SELECT *" gibt mir ein Array von Datensätzen/Records zurück ... also nicht nur einen Datensatz ... das will ich auch.
Wie sollte ich das sonst machen ??
- Dein LEFT möchte vielleicht ein LIKE sein?
Ja, OK ... hatte schon davon gehört 😉, sicher die bessere Wahl
- Ohne Parameter muss plcname auf Kontextwechsel behandelt werden. Eigentlich sind Parameter die bessere Idee.
OK, da hatte ich mir gar keine Gedanken gemacht.
cmd.CommandText = string.Format( "SELECT plcvarname, mpi, setpoint FROM writeplc WHERE plcvarname LIKE '{0}%'", MySqlHelper.EscapeString(plcname));oder (beachte das $ vor den String-Teilen)
cmd.CommandText = $"SELECT plcvarname, mpi, setpoint FROM writeplc WHERE plcvarname LIKE '{MySqlHelper.EscapeString(plcname)}%'";Die langen Zeilen kannst Du mit "verbatim strings" auf mehrere Zeilen verteilen, ähnlich wie in Java-Script Template-Strings oder in PHP den Heredoc-Strings:
cmd.CommandText = string.Format( @"SELECT plcvarname, mpi, setpoint FROM writeplc WHERE plcvarname LIKE '{0}%'", MySqlHelper.EscapeString(plcname));@ und $ kann man auch kombinieren:
cmd.CommandText = $@"SELECT plcvarname, mpi, setpoint FROM writeplc WHERE plcvarname LIKE '{MySqlHelper.EscapeString(plcname)}%'";Und wo wir gerade von Heredoc-Syntax sprechen, die hat man C# ab .net 7 (Compilerversion C# 11) als "raw string literals" eingeführt. Zusammen mit einem $ vorneweg ist auch String-Interpolation möglich – für SQL einfach ideal.
cmd.CommandText = $""" SELECT plcvarname, mpi, setpoint FROM writeplc WHERE plcvarname LIKE '{MySqlHelper.EscapeString(plcname)}%' """;
Das sind wirklich sehr... sehr gute Tips, vielen Dank.
Gruß