Добавлено несколько записей в DataSet, но только одна запись хранится в базе данных (C#)

Хорошо, это может быть немного длинным, но, пожалуйста, потерпите меня. Я искал высоко и низко, и я не могу найти четкого ответа по моей конкретной проблеме.

Как указано выше, я использую DataSets для извлечения, редактирования, вставки и обновления записей в базе данных. Однако все остальные функции работают как положено, кроме вставки. Что происходит, когда я вставляю новые записи в набор данных, все выглядит нормально, так как с помощью функции наблюдения я вижу новые записи в наборе данных. Но после того, как я закончу редактирование, приму изменения и выполню обновление, в базу данных отправляется только одна запись. Смотрите код ниже. Я также использовал некоторые привязки.

Там код разбит на разные функции следующим образом: 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 имеет запутанное имя, и многие люди думают, что этот вызов необходим перед отправкой обновления, но это совсем наоборот.

Другие вопросы по тегам