C # – Der variablesname '@startdate' wurde bereits deklariert.Variable Namen müssen ein Abfrage-Batch oder eine gespeicherte Prozedur eindeutig sein

Ich brauche eine Möglichkeit, eine Zelle in meinem Datagridview zu aktualisieren und sie in database mit Abfragen zu speichern, aber ich bekomme diese exception:

Der variablesname '@startdate' wurde bereits deklariert.Variable Namen müssen ein Abfrage-Batch oder eine gespeicherte Prozedur eindeutig sein

Hier ist mein Code:

private void toolStripLabel1_Click(object sender, EventArgs e) { try { conn.Open(); string query2 = "UPDATE [Semester] SET [Start_Date]=@startdate, " + " [End_Date]=@enddate WHERE [Sem_Num]=@sem"; cmd = new SqlCommand(query2, conn); if (dataGridView1.Rows.Count > 0) { for (int i = 0; i < dataGridView1.Rows.Count; i++) { cmd.Parameters.AddWithValue("@startdate", dataGridView1.Rows[i].Cells[1].Value.ToString()); cmd.Parameters.AddWithValue("@enddate", dataGridView1.Rows[i].Cells[2].Value.ToString()); cmd.Parameters.AddWithValue("@sem", Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value)); this.dataGridView1.EndEdit(); cmd.ExecuteNonQuery(); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { conn.Close(); } } 

Löschen Sie die Parameter in jeder Iteration:

 for (int i = 0; i < dataGridView1.Rows.Count; i++) { cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@startdate", dataGridView1.Rows[i].Cells[1].Value.ToString()); cmd.Parameters.AddWithValue("@enddate", dataGridView1.Rows[i].Cells[2].Value.ToString()); cmd.Parameters.AddWithValue("@sem", Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value)); this.dataGridView1.EndEdit(); cmd.ExecuteNonQuery(); } 

Oder definieren Sie Parameter außerhalb der loop und legen Sie den Wert innerhalb davon fest:

 var startParam = cmd.Parameters.Add("@startdate", SqlDbType.DateTime2); var endParam = cmd.Parameters.Add("@enddate", SqlDbType.DateTime2); var semParam = cmd.Parameters.Add("@sem", SqlDbType.Int); for (int i = 0; i < dataGridView1.Rows.Count; i++) { startParam.Value = Convert.ToDateTime(dataGridView1.Rows[i].Cells[1].Value); endParam.Value = Convert.ToDateTime(dataGridView1.Rows[i].Cells[2].Value); semParam.Value = Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value); cmd.ExecuteNonQuery(); } 

Du fügst bei jedem Durchlaufen der loop neue Parameter zum gleichen Befehl hinzu.

Sie müssen entweder die Parameter löschen oder einen neuen Befehl machen.