#c# #record
#c# #запись
Вопрос:
Ниже приведен мой код для обновления записей в моей инвентарной таблице (ItemId задается как первичный ключ). Код работает правильно, однако он обновляет только первую строку в datagridview.
Теперь, когда я пытаюсь обновить другие записи (кроме 1-й строки), я получаю это сообщение об ошибке: «Столбец ‘ItemId’ ограничен уникальностью. Значение ‘2’ уже присутствует «. Но когда я обновляю первую строку, которая равна ‘1’, она успешно обновляется, даже если значение ‘1’ уже существует.
cb = new SqlCommandBuilder(da);
ds.Tables["Inventory"].Rows[0]["ItemID"] = txtID.Text;
ds.Tables["Inventory"].Rows[0]["ItemCode"] = txtCode.Text;
ds.Tables["Inventory"].Rows[0]["Description"] = txtDesc.Text;
da.Update(ds, "Inventory");
ds.Tables["Inventory"].AcceptChanges();
MessageBox.Show("Record updated successfully.");
Я думаю, что мне чего-то не хватает в моем коде, любая помощь будет оценена. Спасибо.
Комментарии:
1. Вы жестко кодируете номер строки, чтобы он был строкой 0 (первая строка). Вам нужно получить номер строки, который обновляется в данный момент. А еще лучше, пусть . Net сделает всю эту путаницу за вас, установив свойства источника данных и элемента данных вашей сетки данных
2. что такое ItemId? это первичный ключ?
3. Исключение @UnhandledException Да.
Ответ №1:
Вместо того, чтобы устанавливать ItemId первой строки из вашего DS в текстовое значение, разве вы не должны находить строку в DS, которая соответствует введенному идентификатору. Я предполагаю, что при обновлении любой другой строки, кроме первой, ваш DS дважды получает один и тот же идентификатор.
Перед обновлением:
Row ItemId
----- ------
0 1
1 2
2 3
После вашего обновления для itemid 3:
Row ItemId
----- ------
0 3 <-- row 0 now contains id 3 which is a duplicate of row 2
1 2
2 3
Я думаю, что код обновления строки будет выглядеть примерно так:
cb = new SqlCommandBuilder(da);
var itemId = int.Parse(txtID.Text);
var row = ds.Tables["Inventory"].Rows.Find(itemId);
row["ItemCode"] = txtId.Text;
row["Description"] = txtId.Text;
da.Update(ds, "Inventory");
ds.Tables["Inventory"].AcceptChanges();
MessageBox.Show("Record updated successfully.");
Комментарии:
1. Да, именно это и произошло, когда я попытался удалить эту строку: ds.Tables[«Inventory»].Rows[0][«ItemId»] = txtID.Text;
2. Попробовал. Работает правильно. Спасибо.