2016-08-02 15 views
0

Ich versuche, eine foreach-Schleife zu verwenden, um jedes Kontrollkästchen in meiner MySQL-Datenbank zu aktualisieren. DieseC# Foreach-Schleife mit mySQL-Befehlsparameter

ist, was ich habe:

string Query = "update agenda.exercises set @checkboxname='1' where Date='" + currentDate + "';"; 

Mit cmd param: MyCommand2.Parameters.AddWithValue("@checkboxname", isTenured);

Wenn ich den Befehl param und es in normalen Text zu entfernen, es funktioniert. Wenn ich versuche, den Befehl param als Text zu verwenden, funktioniert es nicht.

Hier ist mein vollständiger Code:

foreach (DataColumn dc in allCheckboxes.Columns) 
{ 
    MessageBox.Show(dc.ToString()); 

    //var field1 = dtRow[dc].ToString(); 
    string Query = "update agenda.exercises set @checkboxname='1' where Date='" + currentDate + "';"; 

    MySqlConnection MyConn2 = new MySqlConnection(MyConnection2); 
    MySqlCommand MyCommand2 = new MySqlCommand(Query, MyConn2); 
    MyCommand2.Parameters.AddWithValue("@checkboxname", dc.ToString()); 

    MySqlDataReader MyReader2; 
    MyConn2.Open(); 
    MyReader2 = MyCommand2.ExecuteReader(); 

    while (MyReader2.Read()) 
    { 

    } 

    MyConn2.Close(); 
} 

Kann mir jemand sagen, was ich falsch mache?

+0

Sie können 'SqlParameter' nicht für Spaltennamen verwenden – Fabio

+0

Parameter sind für Werte, nicht für Spaltennamen. Deshalb funktioniert Ihr Klartext " – Takarii

Antwort

0

Sie haben Ihren Spaltennamen als Parameter, der nicht funktioniert, Sie müssen stattdessen die Werte in Ihre Parameter eingeben.

Etwas wie folgt aus:

foreach (DataColumn col in allCheckboxes.Columns) 
{ 
    string Query = "update agenda.exercises set " + col.ToString() + " = @value where Date = @CurrentDate;"; 
    using (MySqlConnection MyConn2 = new MySqlConnection(MyConnection2)) 
    { 
     using (MySqlCommand MyCommand2 = new MySqlCommand(Query, MyConn2)) 
     { 
      MyCommand2.Parameters.AddWithValue("@Value ", true); 
      MyCommand2.Parameters.AddWithValue("@CurrentDate", currentDate); 
      MyConn2.Open(); 
      MyCommand2.ExecuteNonQuery(); 
     } 
    } 
} 
+0

Warum der Downvote? – GuidoG

+0

OP müssen verschiedene Spalten aktualisieren (basierend auf dem "CheckBox" wurde überprüft). – Fabio

+0

@Fabio OK Ich habe verpasst, dass ich meine Antwort für diese – GuidoG

0

Sie nicht SqlParameter für Spaltennamen verwenden können.
Sie können den Spaltennamen ohne Parameter in die Abfrage einfügen. Aber auf jeden Fall verwenden SqlParameter für übergebenen Werte, auch für hartcodierte Werte (true zum Beispiel)

foreach (DataColumn dc in allCheckboxes.Columns) 
{ 
    string Query = $"UPDATE agenda.exercises SET {dc.ToString()} = @True 
        WHERE Date = @CurrentDate;"; 
    using (MySqlConnection MyConn2 = new MySqlConnection(MyConnection2)) 
    { 
     using (MySqlCommand MyCommand2 = new MySqlCommand(Query, MyConn2)) 
     { 
      MyCommand2.Parameters.AddWithValue("@True ", true); 
      MyCommand2.Parameters.AddWithValue("@CurrentDate", currentDate); 
      MyConn2.Open(); 
      MyCommand2.ExecuteNonQuery(); 
     } 
    } 
} 

Personaly mag ich nicht diesen Ansatz (dynamisch SQL-Abfragen erstellen), werde ich eine eigene Methode für jedes Kontrollkästchen erstellen.