Добавлено несколько записей в DataSet, но только одна запись хранится в базе данных (C#)
Хорошо, это может быть немного длинным, но, пожалуйста, потерпите меня. Я искал высоко и низко, и я не могу найти четкого ответа по моей конкретной проблеме.
Как указано выше, я использую DataSet
s для извлечения, редактирования, вставки и обновления записей в базе данных. Однако все остальные функции работают как положено, кроме вставки. Что происходит, когда я вставляю новые записи в набор данных, все выглядит нормально, так как с помощью функции наблюдения я вижу новые записи в наборе данных. Но после того, как я закончу редактирование, приму изменения и выполню обновление, в базу данных отправляется только одна запись. Смотрите код ниже. Я также использовал некоторые привязки.
Там код разбит на разные функции следующим образом: SetAdapaterCommands
, FillDataSets
, SendToDatabase
а также BindToUI
, Кто-нибудь может увидеть что-то не так?
Или я что-то упустил из-за того, как работают команды вставки и обновления набора данных?
Возможно, я должен также сказать, что я обновляю другую родительскую таблицу перед этой. Не уверен, что это как-то связано с этим.
Запустите набор команд адаптера
Выберите команду
#region Select Task Command
queryString = "SELECT value1, value2, value3 FROM Table1;";
taskCommand = new SqlCommand(queryString, connection);
#endregion Select Task Command
Обновить команду
#region Update Task Command
queryString = "UPDATE Table1 SET value1 = @value1, value2 = @value2, value3 = @value3" +
"WHERE value1 = @value1;";
taskUpdateCommand = new SqlCommand(queryString, connection);
taskUpdateCommand.Parameters.Add("@value1", SqlDbType.Char, 10, "value1");
taskUpdateCommand.Parameters.Add("@value2", SqlDbType.Char, 10, "value2");
taskUpdateCommand.Parameters.Add("@value3", SqlDbType.VarChar, 50, "value3");
taskAdapter.UpdateCommand = taskUpdateCommand;
SqlParameter taskParameter = taskUpdateCommand.Parameters.Add("@oldValue1", SqlDbType.Char, 10, "value1");
taskParameter.SourceVersion = DataRowVersion.Original;
#endregion Update Task Command
Вставить команду
#region Insert Task Command
queryString = "INSERT INTO Table1 (value1, value2, value3) " +
"VALUES (@value1, @value2, @value3);";
taskInsertCommand = new SqlCommand(queryString, connection);
taskInsertCommand.Parameters.Add("@value1", SqlDbType.Char, 10, "value1");
taskInsertCommand.Parameters.Add("@value2", SqlDbType.Char, 10, "value2");
taskInsertCommand.Parameters.Add("@value3", SqlDbType.VarChar, 50, "value3");
taskAdapter.InsertCommand = taskInsertCommand;
#endregion Insert Task Command
Завершить набор команд адаптера
Заполнить набор данных
private void loadFromDatabase()
{
#region Load Data and From Database
SetAdapterCommands();
#region Load Tasks
try
{
connection.Open();
taskAdapter.SelectCommand = taskCommand;
taskAdapter.Fill(Table1DataSet);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
#endregion Load Tasks
}
Отправить изменения в базу данных
private void updateDatabase()
{
try
{
Table1BindingSource.EndEdit();
Table1DataSet.AcceptChanges();
taskAdapter.Update(Table1DataSet);
}
catch(System.Exception ex)
{
MessageBox.Show("Update Failed");
}
}
Привязать к пользовательскому интерфейсу
textBoxValue1.DataBindings.Add("Text", Table1BindingSource, "value1");
textBoxValue2.DataBindings.Add("Text", Table1BindingSource, "value2");
textBoxValue3.DataBindings.Add("Text", Table1BindingSource, "value3");
1 ответ
Это распространенная ошибка. DataSet. AcceptChanges изменяет RowState каждого DataRow в каждом DataTable вашего DataSet на значение DataRowState.Unchanged.
Так что если вы позвоните AcceptChanges
следующий звонок Update
не находит ни одной строки для обновления, удаления или вставки.
Вы должны просто удалить звонок AcceptChanges
,
Немного предыстории. Когда вы редактируете строку, ее RowState
изменено на DataRowState.Modified
(для вкладышей у нас есть DataRowState.Added
и для удаленных строк мы имеем DataRowState.Deleted
)
Вызов Update DataAdapter ищет строки в этих состояниях, чтобы подготовить и отправить относительную UPDATE/INSERT/DELETE в хранилище данных.
Я думаю, что AcceptChanges имеет запутанное имя, и многие люди думают, что этот вызов необходим перед отправкой обновления, но это совсем наоборот.