Antwort an „der Henry“ verfassen

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ß
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar

Ihre Identität in einem Cookie zu speichern erlaubt es Ihnen, Ihre Beiträge zu editieren. Außerdem müssen Sie dann bei neuen Beiträgen nicht mehr die Felder Name, E-Mail und Homepage ausfüllen.

abbrechen