Hallo Henry,
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- Dein LEFT möchte vielleicht ein LIKE sein?
- Ohne Parameter muss plcname auf Kontextwechsel behandelt werden. Eigentlich sind Parameter die bessere Idee.
- Verwende keine Stringverkettung, sondern string.Format oder String-Interpolation (in JavaScript nennt man das Template-Strings):
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)}%'
""";
Wie in PHP bestimmt die Einrückung des abschließenden """, wieviele Leerstellen am Anfang der Zeilen des Raw String Literals entfernt werden.
Rolf
--
sumpsi - posui - obstruxi
sumpsi - posui - obstruxi