Rolf B: C# update database

Beitrag lesen

Hallo Henry,

man muss das SqlCommand-Objekt nicht für jeden Wert neu erzeugen. Es schadet vermutlich nichts, weil der Server identisches SQL erkennen und den generierten Plan wiederverwenden sollte, aber eigentlich programmiert man das so:

string sql = "UPDATE datapoints SET actvalue = @value WHERE plcvarname = @field";	
using (var cmd = new MySqlCommand(sql,connection) {
  cmd.Prepare();

  // Setze die Typen passend zu deiner DB
  cmd.Parameters.Add("@field", MySqlDbType.???);
  cmd.Parameters.Add("@value", MySqlDbType.???);


  foreach (var dic in plcactvalue)
  { 
    cmd.Parameters["@field"] = dic.Key;
    cmd.Parameters["@value"] = dic.Value;

    Console.WriteLine($"Schlüssel: {dic.Key}, Wert: {dic.Value}");
    cmd.ExecuteNonQuery();
  }
}

Hier sind die definierten Werte für MySqlDbType. Das ist ein enum, d.h. Du musst bspw. MySqlDbType.Int32 angeben wenn die DB-Column ein 32-bit Integer ist.

Ob cmd.Prepare() in .net nötig ist, darüber scheiden sich auch die Geister. In PHP ist der Prepare() nötig, weil Du sonst kein mysqli_stmt-Objekt hast. In .net sollte es der erste ExecuteNonQuery() implizit tun. Die Doku von .net Framework UND von MS SQL Server ist da sehr vage, sie sagt nur, dass es die Methode gibt, aber nicht, was sie genau tut und ob sie Nutzen hat.

Die Beschreibung von Prepare bei MySQL ist hingegen sehr klar: Unbedingt machen. Und zwar vor der Parameter-Deklaration.

Probiere aus, ob Prepare einen Performance-Effekt für Dich hat.

Rolf

--
sumpsi - posui - obstruxi