Добавлено несколько записей в 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");

person Andrew Titus    schedule 01.07.2016    source источник


Ответы (1)


Это распространенная ошибка. Набор данных.Принять изменения изменяет RowState каждого DataRow в каждой DataTable вашего DataSet на значение DataRowState.Unchanged.

Поэтому, если вы вызываете AcceptChanges, следующий вызов Update не находит ни одной строки для обновления, удаления или вставки.

Вы должны просто удалить вызов AcceptChanges.

Немного предыстории. Когда вы редактируете строку, ее RowState изменяется на DataRowState.Modified (для вставок у нас есть DataRowState.Added, а для удаленных строк у нас есть DataRowState.Deleted)

Вызов Update DataAdapter ищет строки в этих состояниях, чтобы подготовить и отправить относительное UPDATE/INSERT/DELETE в хранилище данных.

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

person Steve    schedule 01.07.2016
comment
Спасибо, Стив! Это решило мою проблему. Я использовал AcceptChanges, поскольку использовал пример кода из двух разных источников для решения разных проблем при разработке кода. - person Andrew Titus; 01.07.2016