Вызовите AddWithValue только один раз (или, что еще лучше, используйте что-то еще ) вне цикла, затем установите только значение внутри цикла:
cmd.Parameters.AddWithValue("id", -1); //dummy value of same type as ID is
foreach(var ro in table.Rows){
cmd.Parameters["id"].Value = (int)ro["PersonID"];
cmd.ExecuteNonQuery();
}
Это упрощенный пример для демонстрациисмысл.Я не рекомендую очищать параметры и повторно добавлять их каждый раз, как об этом говорится в ответе EzLo
На самом деле, вам следует рассмотреть возможность использования DataAdapter, поскольку он уже знает, как это сделать ..
.. и тогда вам, вероятно, следует на самом деле использовать строго типизированные наборы данных и табличные адаптеры для сохранения ваших изменений в базе данных.Когда вы генерируете DataTable строго типа, который связан с таблицей базы данных, он поставляется с выделенным адаптером таблиц, который отвечает за заполнение строк в базе данных и обновление изменений.Цикл чтения, обновления и записи может выглядеть следующим образом:
var ta = new PersonTableAdapter();
var dt = ta.GetDataById(123);
dt.Rows[0].Name = "John Smith";
ta.Update(dt); //it saves the changes to the db; new rows are Inserted, changed rows UPDATEd and removed rows are DELETEd