Compartilhar via


Passo a passo: salvar dados em uma transação em aplicativos do .NET Framework

Observação

Os conjuntos de dados e as classes relacionadas são tecnologias herdadas do .NET Framework do início dos anos 2000 que permitem que os aplicativos trabalhem com dados na memória enquanto os aplicativos estão desconectados do banco de dados. Eles são bastante úteis em aplicativos que permitem que os usuários modifiquem dados e persistam as alterações no banco de dados. Embora os conjuntos de dados tenham se mostrado uma tecnologia muito bem-sucedida, é recomendado que os novos aplicativos .NET usem o Entity Framework Core. O Entity Framework proporciona uma forma mais natural de trabalhar com dados tabulares como modelos de objeto e conta com uma interface de programação mais simples.

Este passo a passo demonstra como salvar dados em uma transação usando o namespace System.Transactions. Neste passo a passo, você criará um aplicativo Windows Forms. Você usará o Assistente de Configuração da Fonte de Dados para criar um conjunto de dados para duas tabelas no banco de dados de exemplo Northwind. Você adicionará controles associados a dados a um formulário do Windows e modificará o código do botão salvar do BindingNavigator para atualizar o banco de dados dentro de um TransactionScope.

Pré-requisitos

Para concluir este passo a passo, você precisa das cargas de trabalho de Desenvolvimento de área de trabalho do .NET e Armazenamento de dados e processamento instaladas no Visual Studio. Para instalá-las, abra Instalador do Visual Studio e escolha Modificar (ou Mais>Modificar) ao lado da versão do Visual Studio que você deseja modificar. Confira Modificar o Visual Studio.

Este passo a passo usa o SQL Server Express LocalDB e o banco de dados de exemplo da Northwind.

  1. Se você não tiver SQL Server Express LocalDB, instale-o por meio da página de download do SQL Server Express ou usando o Instalador do Visual Studio. No Instalador do Visual Studio, o SQL Server Express LocalDB pode ser instalado como parte da carga de trabalho do Desenvolvimento para desktop com .NET ou como um componente individual.

  2. Instale o banco de dados de exemplo da Northwind seguindo estas etapas:

    1. No Visual Studio, abra a janela Pesquisador de Objetos do SQL Server. (O Pesquisador de Objetos do SQL Server é instalado como parte da carga de trabalho Armazenamento e processamento de dados no Instalador do Visual Studio). Expanda o nó do SQL Server. Clique com o botão direito do mouse na instância do LocalDB e selecione Nova Consulta.

      Uma janela do editor de consultas vai se abrir.

    2. Copie o script Transact-SQL da Northwind para sua área de transferência. Esse script T-SQL cria o banco de dados da Northwind do zero e o preenche com alguns dados.

    3. Cole o script T-SQL no editor de consultas e, em seguida, escolha o botão Executar.

      Após um curto período, a consulta termina de ser executada e o banco de dados da Northwind é criado.

Criar um aplicativo do Windows Forms

A primeira etapa é criar um Aplicativo do Windows Forms (.NET Framework).

  1. No Visual Studio, no menu Arquivo, selecione Novo>Projeto.

  2. Expanda Visual C# ou Visual Basic no painel esquerdo e selecione Área de Trabalho do Windows.

  3. No painel central, selecione o tipo de projeto Aplicativo do Windows Forms.

  4. Nomeie o projeto como SavingDataInATransactionWalkthroughe escolha OK.

    O projeto SavingDataInATransactionWalkthrough é criado e adicionado ao Gerenciador de Soluções.

Criar uma fonte de dados do banco de dados

Esta etapa usa o Assistente de Configuração de Fonte de Dados para criar uma fonte de dados com base na tabela Customers e Orders no banco de dados de exemplo Northwind.

  1. Para abrir a janela Fontes de Dados, no menu Dados, selecione Mostrar Fontes de Dados.

  2. Na janela Fontes de Dados, selecione Adicionar Nova Fonte de Dados para iniciar o Assistente de Configuração de Fonte de Dados.

  3. Na tela Escolher um Tipo de Fonte de Dados, selecione Banco de Dados e, em seguida, Avançar.

  4. Na tela Escolha a Conexão de Dados, faça o seguinte:

    • Se uma conexão de dados com o banco de dados de exemplo Northwind estiver disponível na lista suspensa, selecione-a.

      -ou-

    • Selecione Nova Conexão para inicializar a caixa de diálogo Adicionar/Modificar Conexão e criar uma conexão com o banco de dados Northwind.

  5. Se o banco de dados exigir uma senha, selecione a opção para incluir dados confidenciais e, em seguida, selecione Avançar.

  6. Na tela Salvar cadeia de conexão no arquivo de Configuração de Aplicativo, selecione Avançar.

  7. Expanda o nó Tabelas na tela Escolher Objetos do Banco de Dados.

  8. Selecione as tabelas Customers e Orders, em seguida, selecione Concluir.

    O NorthwindDataSet é adicionado ao projeto e as tabelas Customers e Orders aparecem na janela Fontes de Dados.

Adicionar controles ao formulário

Você pode criar controles de associação de dados arrastando itens da janela Fontes de Dados para um formulário.

  1. Na janela Fontes de dados, expanda o nó Clientes.

  2. Arraste o nó principal Clientes da janela Fontes de Dados para Form1.

    Um controle DataGridView e uma faixa de ferramentas (BindingNavigator) para navegação em registros são exibidos no formulário. Um NorthwindDataSet, CustomersTableAdapter, BindingSource e BindingNavigator aparecem na bandeja do componente.

  3. Arraste o nó Pedidos relacionado (não o nó principal Pedidos, mas o nó da tabela filho relacionado abaixo da coluna Fax) para o formulário abaixo de ClientesDataGridView.

    Um DataGridView aparece no formulário. OrdersTableAdapter e BindingSource aparecem na bandeja de componentes.

Adicionar uma referência ao assembly System.Transactions

As transações usam o namespace System.Transactions. Uma referência do projeto ao assembly system.transactions não é adicionada por padrão, portanto, você precisa adicioná-la manualmente.

Para adicionar uma referência ao arquivo DLL System.Transactions

  1. No menu Projeto, selecione Adicionar Referência.

  2. Selecione System.Transactions (na guia .NET) e, em seguida, selecione OK.

    Uma referência a System.Transactions é adicionada ao projeto.

Modificar o código no botão SaveItem do BindingNavigator

Para a primeira tabela que entra em seu formulário como padrão, o código é adicionado ao evento click do botão salvar no BindingNavigator. É necessário adicionar manualmente o código para atualizar quaisquer tabelas adicionais. Para este passo a passo, refatoramos o código de salvamento existente do manipulador de eventos de clique do botão salvar. Também criamos mais alguns métodos para fornecer funcionalidade de atualização específica com base em se a linha precisa ser adicionada ou excluída.

Para modificar o código salvar gerado automaticamente

  1. Selecione o botão de Salvar no CustomersBindingNavigator (o botão com o ícone de disquete).

  2. Substitua o método CustomersBindingNavigatorSaveItem_Click pelo seguinte código:

    private void customersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
        UpdateData();
    }
    
    private void UpdateData()
    {
        this.Validate();
        this.customersBindingSource.EndEdit();
        this.ordersBindingSource.EndEdit();
    
        using (System.Transactions.TransactionScope updateTransaction = 
            new System.Transactions.TransactionScope())
        {
            DeleteOrders();
            DeleteCustomers();
            AddNewCustomers();
            AddNewOrders();
    
            updateTransaction.Complete();
            northwindDataSet.AcceptChanges();
        }
    }
    

A ordem para reconciliar as alterações aos dados relacionados é a seguinte:

  • Exclua registros filho. (Nesse caso, exclua registros da tabela Orders.)

  • Exclua registros pai. (Nesse caso, exclua registros da tabela Customers.)

  • Insira registros pai. (Nesse caso, insira registros na tabela Customers.)

  • Insira registros filho. (Nesse caso, insira registros na tabela Orders.)

Para excluir pedidos existentes

  • Adicione o seguinte método DeleteOrders a Form1:

    private void DeleteOrders()
    {
        NorthwindDataSet.OrdersDataTable deletedOrders;
        deletedOrders = (NorthwindDataSet.OrdersDataTable)
            northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
        if (deletedOrders != null)
        {
            try
            {
                ordersTableAdapter.Update(deletedOrders);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("DeleteOrders Failed");
            }
        }
    }
    

Para excluir clientes existentes

  • Adicione o seguinte método DeleteCustomers a Form1:

    private void DeleteCustomers()
    {
        NorthwindDataSet.CustomersDataTable deletedCustomers;
        deletedCustomers = (NorthwindDataSet.CustomersDataTable)
            northwindDataSet.Customers.GetChanges(DataRowState.Deleted);
    
        if (deletedCustomers != null)
        {
            try
            {
                customersTableAdapter.Update(deletedCustomers);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("DeleteCustomers Failed");
            }
        }
    }
    

Para adicionar novos clientes

  • Adicione o seguinte método AddNewCustomers a Form1:

    private void AddNewCustomers()
    {
        NorthwindDataSet.CustomersDataTable newCustomers;
        newCustomers = (NorthwindDataSet.CustomersDataTable)
            northwindDataSet.Customers.GetChanges(DataRowState.Added);
    
        if (newCustomers != null)
        {
            try
            {
                customersTableAdapter.Update(newCustomers);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("AddNewCustomers Failed");
            }
        }
    }
    

Para adicionar novos pedidos

  • Adicione o seguinte método AddNewOrders a Form1:

    private void AddNewOrders()
    {
        NorthwindDataSet.OrdersDataTable newOrders;
        newOrders = (NorthwindDataSet.OrdersDataTable)
            northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
        if (newOrders != null)
        {
            try
            {
                ordersTableAdapter.Update(newOrders);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("AddNewOrders Failed");
            }
        }
    }
    

Executar o aplicativo

Pressione F5 para executar o aplicativo.