Compartilhar via


Como salvar as alterações no conjunto de dados em um banco de dados

Após os dados no seu DataSet terem sido modificados e validados, você provavelmente desejará enviar os dados atualizados de volta a um banco de dados. Para enviar os dados modificados a um banco de dados, você chama o método Update de um TableAdapter ou adaptador de dados. O método Update do adaptador atualiza uma única tabela de dados e executa o comando correto (INSERT, UPDATE ou DELETE) com base no RowState de cada linha de dados na tabela.

Quando você salva dados em tabelas relacionadas, o Visual Studio fornece um componente TableAdapterManager que auxilia a salvar na ordem correta com base nas restrições de chave externa definidas no base de dados. Para obter mais informações, consulte Visão geral de atualização hierárquica.

Dica

Como a tentativa de atualizar uma fonte de dados com o conteúdo de um dataset pode gerar erros, você deve colocar o código que chama o método Update do adaptador dentro de um bloco try/catch.

O procedimento exato para atualizar uma fonte de dados pode variar dependendo de suas necessidades comerciais, mas o aplicativo deve incluir as seguintes etapas:

  1. Executar o código que tenta enviar atualizações para o banco de dados dentro de um bloco try/catch.

  2. Se uma exceção é detectada, localize a linha de dados que causou o erro. Para obter mais informações, consulte Como localizar linhas com erros.

  3. Reconcilie o problema na linha de dados (programaticamente se você puder, ou apresentando a linha inválida para o usuário para modificação) e em seguida, tente novamente a atualização (propriedade HasErrors, método GetErrors).

Salvar dados em um banco de dados

Chame o método Update de um TableAdapter ou adaptador de dados, passando o nome da tabela de dados que contém os valores a serem gravados no banco de dados. Para obter mais informações sobre como salvar dados de uma única tabela de dados de volta para um banco de dados, consulte Instruções passo a passo: salvando dados em um banco de dados (tabela única).

Para atualizar um banco de dados com um DataSet usando um TableAdapter

  • Coloque o método TableAdapter.Update dentro de um bloco try/catch. O exemplo a seguir mostra como tentar uma atualização com o conteúdo da tabela Customers no 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");
    }
    

Para atualizar um banco de dados com um dataset usando um adaptador de dados

  • Coloque o método DataAdapter.Update dentro de um bloco try/catch. O exemplo a seguir mostra como tentar executar uma atualização para uma fonte de dados com o conteúdo da Table1 no DataSet1.

    Try
        SqlDataAdapter1.Update(Dataset1.Tables("Table1"))
    
    Catch x As Exception
        ' Error during Update, add code to locate error, reconcile  
        ' and try to update again. 
    End Try
    
    try
    {
        SqlDataAdapter1.Update(Dataset1.Tables["Table1"]);
    }
    catch (Exception e)
    {
        // Error during Update, add code to locate error, reconcile  
        // and try to update again.
    }
    

Atualizando duas tabelas relacionadas em um DataSet

Ao atualizar tabelas relacionadas em um dataset, é importante atualizar na seqüência apropriada a fim de reduzir a possibilidade de violar restrições de integridade referencial. A ordem de execução do comando também seguirão os índices de DataRowCollection no DataSet. Para evitar que erros de integridade de dados sejam aumentados, a prática recomendada é atualizar o banco de dados na seqüência a seguir:

  1. Tabela filho: excluir registros.

  2. Tabela pai: inserir, atualizar e excluir registros.

  3. Tabela filho: inserir e atualizar registros.

Para obter informações detalhadas sobre como salvar dados de várias tabelas, consulte Instruções passo a passo: salvando dados em um banco de dados (várias tabelas).

Se você estiver atualizando duas ou mais tabelas relacionadas, então você deve incluir toda a lógica de atualização dentro de uma transação. Uma transação é um processo que garante que todas as alterações relacionadas a um banco de dados terão êxito antes de confirmar as alterações. Para obter mais informações, consulte Transações e simultaneidade.

Para atualizar duas tabelas relacionadas utilizando um TableAdapter

  1. Crie três DataTables temporárias para conter os registros distintos.

  2. Chame o método Update para cada subconjunto de linhas de dentro de um bloco try/catch. Se ocorrerem erros de atualização, o curso de ação sugerido é desativar ramificação e resolvê-los.

  3. Confirmar as alterações do conjunto de dados para o banco de dados.

  4. Descarte as tabelas de dados temporários para liberar os recursos.

    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();
            }
        }
    }
    

Para atualizar duas tabelas relacionadas utilizando um Adaptador de Dados

  • Chame o método Update de cada adaptador de dados.

    O exemplo a seguir mostra como atualizar uma fonte de dados com um DataSet que contém tabelas relacionadas. Para seguir a seqüência acima, três DataTables temporárias serão criadas para armazenar os registros distintos. Em seguida, o método Update será chamado para cada subconjunto de linhas de dentro de um bloco try/catch. Se ocorrerem erros de atualização, o curso de ação sugerido é desativar ramificação e resolvê-los. Em seguida, o dataset confirma as alterações. Finalmente, descarte as tabelas de dados temporárias para liberar os recursos.

    Private Sub UpdateDB()
        Dim DeletedChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Deleted)
    
        Dim NewChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Added)
    
        Dim ModifiedChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Modified)
    
        Try 
            If Not DeletedChildRecords Is Nothing Then
                daOrders.Update(DeletedChildRecords)
            End If
    
            daCustomers.Update(dsNorthwind1, "Customers")
    
            If Not NewChildRecords Is Nothing Then
                daOrders.Update(NewChildRecords)
            End If 
    
            If Not ModifiedChildRecords Is Nothing Then
                daOrders.Update(ModifiedChildRecords)
            End If
    
            dsNorthwind1.AcceptChanges()
    
        Catch ex As Exception
            ' Update error, resolve and try again 
    
        Finally 
            If Not DeletedChildRecords Is Nothing Then
                DeletedChildRecords.Dispose()
            End If 
    
            If Not NewChildRecords Is Nothing Then
                NewChildRecords.Dispose()
            End If 
    
            If Not ModifiedChildRecords Is Nothing Then
                ModifiedChildRecords.Dispose()
            End If 
        End Try 
    End Sub
    
    void UpdateDB()
    {
        System.Data.DataTable DeletedChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Deleted);
    
        System.Data.DataTable NewChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Added);
    
        System.Data.DataTable ModifiedChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Modified);
    
        try
        {
            if (DeletedChildRecords != null)
            {
                daOrders.Update(DeletedChildRecords);
            }
            if (NewChildRecords != null)
            {
                daOrders.Update(NewChildRecords);
            }
            if (ModifiedChildRecords != null)
            {
                daOrders.Update(ModifiedChildRecords);
            }
    
            dsNorthwind1.AcceptChanges();
        }
    
        catch (Exception ex)
        {
            // Update error, resolve and try again
        }
    
        finally
        {
            if (DeletedChildRecords != null)
            {
                DeletedChildRecords.Dispose();
            }
            if (NewChildRecords != null)
            {
                NewChildRecords.Dispose();
            }
            if (ModifiedChildRecords != null)
            {
                ModifiedChildRecords.Dispose();
            }
        }
    }
    

Consulte também

Conceitos

Associando controles dos Windows Forms a dados no Visual Studio

Preparando o aplicativo para receber dados

Buscando dados no aplicativo

Associando controles a dados no Visual Studio

Editando dados no aplicativo

Validando dados

Salvando dados

Outros recursos

Instruções passo a passo de dados

Conectando a dados no Visual Studio