Практическое руководство. Обновление данных с помощью адаптера таблицы

После того, как данные в наборе данных были изменены и проверены, возможно, потребуется отправить обновленные данные обратно в базу данных.Для отправки измененных данных в базу данных вызовите метод Update объекта TableAdapter.Метод Update адаптера обновит одну таблицу с данными и выполнит корректную команду (INSERT, UPDATE или DELETE) в зависимости от свойства RowState каждой строки данных в таблице.При сохранении данных в связанных таблицах Visual Studio предоставляет новый компонент TableAdapterManager, который помогает выполнять сохранение в правильном порядке в зависимости от ограничений внешнего ключа, определенных в базе данных.Дополнительные сведения см. в разделе Общие сведения об иерархическом обновлении.

ПримечаниеПримечание

Так как попытка обновления источника данных содержимым набора данных может вызвать ошибки, следует вставлять код, который вызывает метод Update адаптера внутри блока try/catch.

Сама процедура обновления источника данных может варьироваться в зависимости от поставленных задач, но в любом случае приложение должно включать следующие этапы.

  1. Вызовите метод Update адаптера внутри блока try/catch.

  2. При возникновении исключения найдите строку данных, которая его вызвала.Дополнительные сведения см. в разделе Практическое руководство. Поиск строк с ошибками.

  3. Устраните ошибку в строке данных (по возможности программно, или путем предложения пользователю отредактировать ошибочную строку), затем повторите попытку обновления (HasErrors, GetErrors).

Сохранение данных в базе данных

Вызовите метод Update объекта TableAdapter, передав имя таблицы, которая содержит значения для записи в базу данных.

Чтобы обновить базу данных, которая содержит набор данных, с помощью TableAdapter

  • Заключите метод Update адаптера в блок try/catch.В следующем примере демонстрируется попытка обновления внутри блока try/catch содержимым таблицы Customers в NorthwindDataSet.

    Try
        Me.Validate()
        Me.CustomersBindingSource.EndEdit()
        Me.CustomersTableAdapter.Update(Me.NorthwindDataSet.Customers)
        MsgBox("Update successful")
    
    Catch ex As Exception
        MsgBox("Update failed")
    End Try
    
    try
    {
        this.Validate();
        this.customersBindingSource.EndEdit();
        this.customersTableAdapter.Update(this.northwindDataSet.Customers);
        MessageBox.Show("Update successful");
    }
    catch (System.Exception ex)
    {
        MessageBox.Show("Update failed");
    }
    

Обновление двух связанных таблиц в наборе данных с помощью TableAdapter

При обновлении связанных таблиц в наборе данных необходимо обновлять их в правильной последовательности, чтобы уменьшить вероятность нарушения ограничений целостности данных.Порядок выполнения команды будет также зависеть от индексов DataRowCollection в наборе данных.Чтобы предотвратить возникновение ошибок, связанных с целостностью данных, рекомендуется обновлять базу данных в следующей последовательности:

  1. Дочерняя таблица: удаление записей.

  2. Родительская таблица: вставка, обновление и удаление записей.

  3. Дочерняя таблица: вставка и обновление записей.

    ПримечаниеПримечание

    При обновлении двух или более связанных таблиц следует включить всю логику обновления в транзакцию.Транзакция — это процесс, гарантирующий, что все взаимосвязанные изменения в базе данных будут успешными вплоть до фиксации изменений.Дополнительные сведения см. в разделе Performing Transactions.

Для обновления двух связанных таблиц с помощью TableAdapter:

  1. Создайте три временных таблицы данных для хранения различных записей.

  2. Вызовите метод Update для каждого подмножества строк из блока try/catch.При возникновении ошибок обновления следует остановиться и устранить их.

  3. Зафиксируйте изменения в базе данных.

  4. Удалите временные таблицы данных для освобождения системных ресурсов.

    Следующий пример показывает, как обновить источник данных с помощью набора данных, содержащего связанные таблицы.

    Private Sub UpdateDB()
        Dim deletedChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable)
    
        Dim newChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable)
    
        Dim modifiedChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Modified), NorthwindDataSet.OrdersDataTable)
    
        Try
            If deletedChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(deletedChildRecords)
            End If
    
            CustomersTableAdapter.Update(NorthwindDataSet.Customers)
    
            If newChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(newChildRecords)
            End If
    
            If modifiedChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(modifiedChildRecords)
            End If
    
            NorthwindDataSet.AcceptChanges()
    
        Catch ex As Exception
            MessageBox.Show("An error occurred during the update process")
            ' Add code to handle error here.
    
        Finally
            If deletedChildRecords IsNot Nothing Then
                deletedChildRecords.Dispose()
            End If
    
            If newChildRecords IsNot Nothing Then
                newChildRecords.Dispose()
            End If
    
            If modifiedChildRecords IsNot Nothing Then
                modifiedChildRecords.Dispose()
            End If
    
        End Try
    End Sub
    
    void UpdateDB()
    {
        NorthwindDataSet.OrdersDataTable deletedChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
        NorthwindDataSet.OrdersDataTable newChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
        NorthwindDataSet.OrdersDataTable modifiedChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Modified);
    
        try
        {
            if (deletedChildRecords != null)
            {
                ordersTableAdapter.Update(deletedChildRecords);
            }
    
            customersTableAdapter.Update(northwindDataSet.Customers);
    
            if (newChildRecords != null)
            {
                ordersTableAdapter.Update(newChildRecords);
            }
    
            if (modifiedChildRecords != null)
            {
                ordersTableAdapter.Update(modifiedChildRecords);
            }
    
            northwindDataSet.AcceptChanges();
        }
    
        catch (Exception ex)
        {
            MessageBox.Show("An error occurred during the update process");
            // Add code to handle error here.
        }
    
        finally
        {
            if (deletedChildRecords != null)
            {
                deletedChildRecords.Dispose();
            }
            if (newChildRecords != null)
            {
                newChildRecords.Dispose();
            }
            if (modifiedChildRecords != null)
            {
                modifiedChildRecords.Dispose();
            }
        }
    }
    

См. также

Основные понятия

Общие сведения об адаптере таблиц

Привязка элементов управления Windows Forms к данным в Visual Studio

Подготовка приложения к получению данных

Выборка данных в приложение

Привязка элементов управления к данным в Visual Studio

Редактирование данных в приложении

Проверка данных

Сохранение данных

Другие ресурсы

Пошаговые руководства работы с данными

Подключение к данным в Visual Studio