Partilhar via


Passo a passo: criar um aplicativo de dados de n camadas com ADO.NET e o .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.

Os aplicativos de dados de N camadas são aplicativos que acessam dados e são separados em várias camadas lógicas. A separação de componentes de aplicativos em camadas discretas aumenta a capacidade de manutenção e a escalabilidade do aplicativo. Isso é feito pela adoção com mais facilidade de novas tecnologias que podem ser aplicadas a uma única camada, sem precisar reprojetar toda a solução. A arquitetura de N camadas inclui uma camada de apresentação, uma camada intermediária e uma camada de dados. A camada intermediária geralmente inclui uma camada de acesso a dados, uma camada lógica de negócios e componentes compartilhados, tais como autenticação e validação. A camada de dados inclui um banco de dados relacional. Os aplicativos de N camadas geralmente armazenam informações confidenciais na camada de acesso a dados da camada intermediária para manter o isolamento de usuários finais que acessam a camada de apresentação. Para obter mais informações, consulte Visão geral dos aplicativos de dados de N camadas.

Uma maneira de separar as várias camadas em um aplicativo de N camadas é criar projetos discretos para cada camada que você deseja incluir em seu aplicativo. Os conjuntos de dados digitados contêm uma propriedade DataSet Project que determina quais projetos o conjunto de dados gerado e o código TableAdapter devem acessar.

Esse passo a passo demonstra como separar o conjunto de dados e o código TableAdapter em projetos de biblioteca de classes discretas usando o Designer de Conjunto de Dados. Depois de separar o conjunto de dados e o código TableAdapter, você cria um serviço Windows Communication Foundation Services e WCF Data Services no Visual Studio para chamar a camada de acesso a dados. Finalmente, você cria um aplicativo do Windows Forms como a camada de apresentação. Essa camada acessa dados do serviço de dados.

Nestas instruções passo a passo, as seguintes etapas serão executadas:

  • Criar uma nova solução de N camadas que contenha vários projetos.

  • Adicionar dois projetos de bibliotecas de classes na solução de N camadas.

  • Criar um conjunto de dados tipado usando o Assistente de Configuração de Fonte de Dados.

  • Separar o TableAdapters gerado e o código do conjunto de dados em projetos discretos.

  • Criar um serviço do Windows Communication Foundation (WCF) a ser chamado na camada de acesso a dados.

  • Criar funções no serviço para recuperar dados da camada de acesso a dados.

  • Criar um aplicativo do Windows Forms para servir como a camada de apresentação.

  • Criar controles do Windows Forms associados à fonte de dados.

  • Gravar código para preencher as tabelas de dados.

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, você pode instalar o SQL Server Express LocalDB 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.

    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.

      Se você não vir a instância do LocalDB, use o botão de barra de ferramentas Adicionar SQL Server. A caixa de diálogo aparecerá. Na caixa de diálogo, expanda Local e escolha MSSQLLocalDB. Insira as credenciais apropriadas. Você pode deixar a opção padrão para o banco de dados.

      Captura de tela da caixa de diálogo Conectar-se ao Banco de Dados SQL

    2. Escolha Conectar. Um nó é adicionado para LocalDB no Pesquisador de Objetos do SQL Server.

    3. 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.

    4. 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.

    5. 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 a solução de N camadas e a biblioteca de classes para manter o conjunto de dados (DataEntityTier)

A primeira etapa deste passo a passo é criar uma solução e dois projetos de biblioteca de classes. A primeira biblioteca de classes mantém o conjunto de dados (a classe DataSet digitada gerada e DataTables, que mantém os dados do aplicativo). Este projeto é usado como a camada de entidade de dados do aplicativo e geralmente está localizada na camada intermediária. O conjunto de dados cria o conjunto de dados inicial e separa automaticamente o código nas duas bibliotecas de classes.

Observação

Dê o nome correto ao projeto e à solução antes de clicar em OK. Isso facilitará a conclusão deste passo a passo.

Para criar a solução de N camadas e a biblioteca de classes DataEntityTier

  1. No Visual Studio, crie um projeto usando o modelo de projeto do Windows Forms (.NET Framework) para C# ou Visual Basic. Não há suporte para .NET Core, .NET 5 e posterior.

  2. Nomeie o projeto como DataEntityTier.

  3. Nomeie a solução como NTierWalkthrough e escolha OK.

    Uma solução NTierWalkthrough que contém o projeto DataEntityTier é criada e adicionada ao Gerenciador de Soluções.

Criar a biblioteca de classes para manter os TableAdapters (DataAccessTier)

A próxima etapa após a criação do projeto DataEntityTier é criar outro projeto de biblioteca de classes. Esse projeto mantém os TableAdapters gerados e é chamado de camada de acesso a dados do aplicativo. A camada de acesso a dados contém as informações necessárias para se conectar ao banco de dados e geralmente está localizada na camada intermediária.

Para criar uma biblioteca de classes separada para os TableAdapters

  1. Clique com o botão direito do mouse na solução no Gerenciador de Soluções e escolha Adicionar>Novo Projeto.

  2. Escolha o modelo de projeto Biblioteca de Classes (.NET Framework).

  3. Nomeie o projeto como DataAccessTier e escolha OK.

    O projeto DataAccessTier é criado e adicionado à solução NTierWalkthrough.

Criar o Conjunto de Dados

A próxima etapa é criar um conjunto de dados tipado. Os conjuntos de dados tipado são criados com a classe do conjunto de dados (incluindo as classes DataTables) e as classes TableAdapter em um único projeto. (Todas as classes são geradas em um único arquivo.) Quando você separa o conjunto de dados e os TableAdapters em projetos diferentes, é a classe do conjunto de dados que é movida para o outro projeto, mantendo as classes TableAdapter no projeto original. Portanto, crie o conjunto de dados no projeto que conterá, por fim, os TableAdapters (o projeto DataAccessTier). Você crie o conjunto de dados executando o Assistente de Configuração de Fonte de Dados.

Observação

É preciso ter acesso ao banco de dados de exemplo Northwind para criar a conexão. Para obter informações sobre como configurar o banco de dados de exemplo da Northwind, consulte Como instalar bancos de dados de exemplo.

Para criar o conjunto de dados

  1. Selecione DataAccessTier em Gerenciador de Soluções.

  2. No menu Dados, selecione Mostrar Fontes de Dados.

    A janela Fontes de Dados é aberta.

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

  4. Na página Escolher um Tipo de Fonte de Dados, selecione Banco de Dados e selecione Avançar.

  5. Na página Escolha a Conexão de Dados, execute uma das seguintes ações:

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

    or

    Selecione Nova Conexão para abrir a caixa de diálogo Adicionar Conexão.

  6. Se o banco de dados exigir uma senha, selecione a opção para incluir dados confidenciais e, em seguida, escolha Próximo.

    Observação

    Se você escolheu um arquivo do banco de dados local (em vez de se conectar ao SQL Server), talvez seja perguntado se deseja adicionar o arquivo ao projeto. Escolha Sim para adicionar o arquivo do banco de dados ao projeto.

  7. Selecione Próximo na página Salvar a Cadeia de Conexão no Arquivo de Configuração do Aplicativo.

  8. Expanda o nó Tabelas na página Escolher Objetos do Banco de Dados.

  9. Selecione as caixas de seleção das tabelas Clientes e Pedidos e, em seguida, escolha Concluir.

    NorthwindDataSet é adicionado ao projeto DataAccessTier e aparece na janela Fontes de Dados.

Separar os TableAdapters do Conjunto de Dados

Depois de criar o conjunto de dados, separe a classe do conjunto de dados gerada a partir dos TableAdapters. Você faz isso ao configurar a propriedade Projeto do Conjunto de Dados para o nome do projeto que armazenará a classe do conjunto de dados separada.

Para separar os TableAdapters do Conjunto de Dados

  1. Clique duas vezes em NorthwindDataSet.xsd no Gerenciador de Soluções para abrir o conjunto de dados no Designer de Conjunto de Dados.

  2. Selecione uma área vazia no designer.

  3. Localize o nó Projeto do Conjunto de Dados na janela Propriedades.

  4. Na lista Projeto do Conjunto de Dados, selecione DataEntityTier.

  5. No menu Build, selecione Compilar Solução.

    O conjunto de dados e os TableAdapters são separados em dois projetos de biblioteca de classes. O projeto que continha originalmente todo o conjunto de dados (DataAccessTier) contém agora somente os TableAdapters. O projeto atribuído à propriedade Projeto do Conjunto de Dados (DataEntityTier) contém o conjunto de dados tipado: NorthwindDataSet.Dataset.Designer.vb (ou NorthwindDataSet.Dataset.Designer.cs).

Observação

Quando você separa os conjuntos de dados e os TableAdapters (configurando a propriedade Projeto de Conjunto de Dados), as classes dos conjuntos de dados parciais existentes no projeto não são movidas automaticamente. As classes parciais do conjunto de dados existentes devem ser movidas manualmente para o projeto do conjunto de dados.

Criar um novo aplicativo de serviço

Este passo a passo demonstra como acessar a camada de acesso a dados usando um serviço WCF. Vamos criar um novo aplicativo de serviço WCF.

Para criar um novo aplicativo de Serviço WCF

  1. Clique com o botão direito do mouse na solução no Gerenciador de Soluções e escolha Adicionar>Novo Projeto.

  2. Na caixa de diálogo Novo Projeto, no painel esquerdo, selecione WCF. No painel do meio, selecione Biblioteca de Serviços do WCF.

  3. Nomeie o projeto como DataService e selecione OK.

    O projeto DataService é criado e adicionado à solução NTierWalkthrough.

Criar métodos na camada de acesso a dados para retornar os dados de clientes e pedidos

O serviço de dados deve chamar dois métodos na camada de acesso a dados: GetCustomers e GetOrders. Esses métodos retornam as tabelas Customers e Orders Northwind. Crie os métodos GetCustomers e GetOrders no projeto DataAccessTier.

Para criar um método na camada de acesso a dados que retorna a tabela Clientes

  1. Em Gerenciador de Soluções, clique duas vezes em NorthwindDataset.xsd para abrir o conjunto de dados.

  2. Clique com o botão direito do mouse em CustomersTableAdapter e clique em Adicionar Consulta.

  3. Na página Escolher um Tipo de Comando, mantenha o valor padrão de Usar instruções SQL e clique em Próximo.

  4. Na página Escolher um Tipo de Consulta, mantenha o valor padrão de SELECT que retorna linhas e clique em Próximo.

  5. Na página Especificar uma instrução SQL SELECT, mantenha a consulta padrão e clique em Próximo.

  6. Na página Escolher Métodos a Serem Gerados, digite GetCustomers para o Nome do método na seção Retornar uma DataTable.

  7. Clique em Concluir.

Para criar um método na camada de acesso a dados que retorna a tabela Pedidos

  1. Clique com o botão direito do mouse em OrdersTableAdapter e clique em Adicionar Consulta.

  2. Na página Escolher um Tipo de Comando, mantenha o valor padrão de Usar instruções SQL e clique em Próximo.

  3. Na página Escolher um Tipo de Consulta, mantenha o valor padrão de SELECT que retorna linhas e clique em Próximo.

  4. Na página Especificar uma instrução SQL SELECT, mantenha a consulta padrão e clique em Próximo.

  5. Na página Escolher Métodos a Serem Gerados, digite GetOrders para o Nome do método na seção Retornar uma DataTable.

  6. Clique em Concluir.

  7. No menu Compilar, clique em Compilar Solução.

Adicionar uma referência à entidade de dados e às camadas de acesso a dados para o serviço de dados

Como o serviço de dados requer informações do conjunto de dados e dos TableAdapters, adicione referências aos projetos DataEntityTier e DataAccessTier.

Para adicionar referência aos serviço de dados

  1. Clique com o botão direito do mouse em DataService no Gerenciador de Soluções e clique em Adicionar Referência.

  2. Clique na guia Projetos na caixa de diálogo Adicionar Referência.

  3. Escolha os projetos DataAccessTier e DataEntityTier.

  4. Clique em OK.

Adicionar funções ao serviço para chamar os métodos GetCustomers e GetOrders na camada de acesso a dados

Agora que a camada de acesso a dados contém os métodos para retornar dados, crie métodos no serviço de dados para chamar os métodos na camada de acesso a dados.

Observação

Para projetos C#, adicione uma referência ao assembly System.Data.DataSetExtensions para que o código a seguir seja compilado.

Para criar as funções GetCustomers e GetOrders no serviço de dados

  1. No projeto DataService, clique duas vezes em IService1.vb ou IService1.cs.

  2. Adicione o seguinte código no comentário Adicionar suas operações de serviço aqui:

    [OperationContract]
    DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers();
    
    [OperationContract]
    DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders();
    

    Observação

    O código deste tutorial está disponível em C# e Visual Basic. Para alternar a linguagem de código nesta página entre C# e Visual Basic, use o comutador de linguagem de código na parte superior da página à direita.

  3. No projeto DataService, clique duas vezes em Service1.vb (ou Service1.cs).

  4. Adicione o seguinte código à classe Service1:

    public DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers()
    {
        DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter
             CustomersTableAdapter1
            = new DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter();
        return CustomersTableAdapter1.GetCustomers();
    }
    public DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders()
    {
        DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter
             OrdersTableAdapter1
            = new DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter();
        return OrdersTableAdapter1.GetOrders();
    }
    
  5. No menu Compilar, clique em Compilar Solução.

Criar uma camada de apresentação para exibir dados a partir do serviço de dados

Agora que a solução contém o serviço de dados que possui métodos chamados na camada de acesso a dados, crie outro projeto que será chamado no serviço de dados e apresente os dados aos usuários. Neste passo a passo, crie um aplicativo do Windows Forms, o qual será a camada de apresentação do aplicativo de N camadas.

Para criar o projeto da camada de apresentação

  1. Clique com o botão direito do mouse na solução no Gerenciador de Soluções e escolha Adicionar>Novo Projeto.

  2. Na caixa de diálogo Novo Projeto, no painel esquerdo, selecione Área de Trabalho do Windows. No painel do meio, escolha Aplicativo Windows Forms.

  3. Nomeie o projeto como PresentationTier e clique em OK.

    O projeto PresentationTier é criado e adicionado à solução NTierWalkthrough.

Configurar o projeto PresentationTier como o projeto de inicialização

Definiremos o projeto PresentationTier como o projeto de inicialização da solução, pois é o aplicativo cliente real que apresenta e interage com os dados.

Para configurar o novo projeto de camada de apresentação como o projeto de inicialização

  • Em Gerenciador de Soluções, clique com o botão direito do mouse em PresentationTier e clique em Definir como Projeto de Inicialização.

Adicionar referências à camada de apresentação

O aplicativo cliente PresentationTier requer uma referência de serviço para o serviço de dados para acessar os métodos no serviço. Além disso, uma referência ao conjunto de dados é necessária para permitir o compartilhamento de tipos pelo serviço WCF. O código adicionado à classe do conjunto de dados parcial estará disponível na camada de apresentação somente após você permitir o compartilhamento de tipos por meio do serviço de dados. Como você geralmente adiciona código como código de validação para os eventos de alteração de linha e coluna de uma tabela de dados, é provável que você queira acessar esse código a partir do cliente.

Para adicionar uma referência à camada de apresentação

  1. No Gerenciador de Soluções, clique com o botão direito do mouse em PresentationTier e selecione Adicionar Referência.

  2. Na caixa de diálogo Adicionar Referência, selecione a guia Projetos.

  3. Selecione DataEntityTier e escolha OK.

Para adicionar uma referência de serviço à camada de apresentação

  1. No Gerenciador de Soluções, clique com o botão direito do mouse em PresentationTier e selecione Adicionar Referência de Serviço.

  2. Na caixa de diálogo Adicionar Referência de Serviço, selecione Descobrir.

  3. Selecione Service1 e escolha OK.

    Observação

    Se você tiver vários serviços no computador atual, escolha o serviço criado anteriormente neste passo a passo (o serviço que contém os métodos GetCustomers e GetOrders).

Adicionar DataGridViews ao formulário para exibir os dados retornados pelo serviço de dados

Depois de adicionar a referência de serviço ao serviço de dados, a janela Fontes de Dados é preenchida automaticamente com os dados retornados pelo serviço.

Para adicionar duas associações de dados DataGridViews ao formulário

  1. No Gerenciador de Soluções, escolha o projeto PresentationTier.

  2. Na janela Fontes de Dados, expanda NorthwindDataSet e localize o nó Clientes.

  3. Arraste o nó Clientes para Form1.

  4. Na janela Fontes de Dados, expanda o nó Clientes e localize o nó Pedidos relacionado (o nó Pedidos aninhado no nó Clientes).

  5. Arraste o nó Pedidos relacionado para Form1.

  6. Crie um manipulador de eventos Form1_Load ao clicar duas vezes em uma área vazia do formulário.

  7. Adicione o seguinte código ao manipulador de eventos do Form1_Load.

    ServiceReference1.Service1Client DataSvc =
        new ServiceReference1.Service1Client();
    northwindDataSet.Customers.Merge(DataSvc.GetCustomers());
    northwindDataSet.Orders.Merge(DataSvc.GetOrders());
    

Aumentar o tamanho máximo da mensagem permitida pelo serviço

O valor padrão para maxReceivedMessageSize não é grande o suficiente para manter os dados recuperados das tabelas Customers e Orders. Nas etapas a seguir, você aumentará o valor para 6553600. Você altera o valor no cliente, que atualiza automaticamente a referência de serviço.

Observação

O menor tamanho padrão se destina a limitar a exposição para ataques de negação de serviço (DoS). Para obter mais informações, consulte MaxReceivedMessageSize.

Para aumentar o valor maxReceivedMessageSize

  1. No Gerenciador de Soluções, clique duas vezes no arquivo app.config no projeto PresentationTier.

  2. Encontre o atributo de tamanho maxReceivedMessageSize e altere o valor para 6553600. Se você não vir a entrada basicHttpBinding, adicione uma como no exemplo a seguir:

    <system.serviceModel>
     <bindings>
         <basicHttpBinding>
             <binding maxBufferSize="6553600" maxReceivedMessageSize="6553600" />
         </basicHttpBinding>
     </bindings>
    </system.serviceModel>
    

Testar o aplicativo

Execute o aplicativo pressionando F5. Os dados das tabelas Customers e Orders são recuperados a partir do serviço de dados e exibidos no formulário.

Próximas etapas

Dependendo dos requisitos do aplicativo, existem várias etapas que você talvez queira realizar após salvar os dados relacionados no aplicativo baseado em Windows. Por exemplo, você poderia fazer as seguintes melhorias a este aplicativo:

  • Adicionar validação ao conjunto de dados.

  • Adicionar métodos adicionais ao serviço para atualizar dados novamente no banco de dados.