Compartilhar via


Passo a passo: criar um aplicativo de dados de n camadas com ADO.NET e o .NET Framework

Observação

A DataSet classe 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 são desconectados do banco de dados. As tecnologias são especialmente úteis para aplicativos que permitem que os usuários modifiquem dados e persistam as alterações no banco de dados. Embora os conjuntos de dados sejam uma tecnologia comprovadamente bem-sucedida, a abordagem recomendada para novos aplicativos .NET é usar o Entity Framework Core. O Entity Framework fornece uma maneira mais natural de trabalhar com dados tabulares como modelos de objeto e tem uma interface de programação mais simples.

Os aplicativos de dados de N-tier são aplicativos que acessam dados e são separados em várias camadas lógicas. Separar os componentes do aplicativo em camadas discretas aumenta a manutenção e a escalabilidade do aplicativo. Ele faz isso permitindo uma adoção mais fácil de novas tecnologias que podem ser aplicadas a uma única camada sem exigir que você reprojete 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 normalmente inclui uma camada de acesso a dados, uma camada lógica de negócios e componentes compartilhados, 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 a 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 tipados contêm uma DataSet Project propriedade que determina em quais projetos o conjunto de dados e TableAdapter o código gerados devem ser incluídos.

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. Por fim, você cria um aplicativo do Windows Forms como a camada de apresentação. Essa camada acessa dados do serviço de dados.

Durante este passo a passo, você executa as seguintes etapas:

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

  • Adicione dois projetos de biblioteca de classes à solução de n camadas.

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

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

  • Crie um serviço WCF (Windows Communication Foundation) para fazer chamadas para a camada de acesso a dados.

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

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

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

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

Pré-requisitos

Para concluir este tutorial, você precisa das cargas de trabalho de desenvolvimento e armazenamento e processamento de dados do .NET instaladas no Visual Studio. Para instalá-los, abra do 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 Northwind.

  1. Se você não tiver o SQL Server Express LocalDB, instale-o na página de download do SQL Server Express ou por meio do Instalador do Visual Studio. No Instalador do Visual Studio, você pode instalar o SQL Server Express LocalDB como parte do trabalho de desenvolvimento para a área de trabalho do .NET ou como um componente individual.

  2. Instale o banco de dados de exemplo 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 de 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 é exibida. 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 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 é aberta.

    4. Copie o script Transact-SQL da Northwind para sua área de transferência. Esse script T-SQL cria o banco de dados Northwind do zero e o preenche com 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 de tempo, a consulta termina de ser executada e o banco de dados Northwind é criado.

Criar a solução de n camadas e a biblioteca de classes para armazenar 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). Esse projeto é usado como a camada de entidade de dados do aplicativo e normalmente está localizado 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

Certifique-se de nomear o projeto e a solução corretamente 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 App (.NET Framework) para C# ou Visual Basic. Não há suporte para .NET Core, .NET 5 e posterior.

  2. Nomeie o projeto DataEntityTier.

  3. Nomeie a solução 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 armazenar o TableAdapters (DataAccessTier)

A próxima etapa depois de criar o 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 normalmente está localizada na camada intermediária.

Para criar uma biblioteca de classes separada para o 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 da Biblioteca de Classes (.NET Framework ).

  3. Nomeie o projeto 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 TableAdapters em projetos diferentes, é a classe de conjunto de dados que é movida para o outro projeto, deixando as TableAdapter classes no projeto original. Portanto, crie o conjunto de dados no projeto que, em última análise, conterá os TableAdapters (o projeto DataAccessTier). Você cria o conjunto de dados usando o Assistente de Configuração da Fonte de Dados.

Observação

Você deve 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 Northwind, consulte Como instalar bancos de dados de exemplo.

Para criar o conjunto de dados

  1. Selecione o DataAccessTier no 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 da Fonte de Dados.

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

  5. Na página Escolher Sua 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.

    ou

    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 escolha Avançar.

    Observação

    Se você selecionou um arquivo de 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 de banco de dados ao projeto.

  7. Selecione Avançar na página Salvar a Cadeia de Conexão na página 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 para as tabelas Clientes e Pedidos e escolha Concluir.

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

Separe os TableAdapters do conjunto de dados

Depois de criar o conjunto de dados, separe a classe de conjunto de dados gerada dos TableAdapters. Você faz isso definindo a propriedade Projeto Do Conjunto de Dados como o nome do projeto no qual armazenar a classe de 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 originalmente continha todo o conjunto de dados (DataAccessTier) agora contém apenas os TableAdapters. O projeto designado na 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 conjuntos de dados e TableAdapters (definindo a propriedade Projeto Do Conjunto de Dados ), as classes de conjunto de dados parciais existentes no projeto não serã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, portanto, vamos criar um novo aplicativo de serviço WCF.

Para criar um novo aplicativo do 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 DataService do projeto 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 pedidos e clientes

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

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

  1. No 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 , deixe o valor padrão de Usar instruções SQL e clique em Avançar.

  4. Na página Escolher um Tipo de Consulta , deixe o valor padrão de SELECT, que retorna linhas e clique em Avançar.

  5. Na página Especificar uma instrução SQL SELECT , deixe a consulta padrão e clique em Avançar.

  6. Na página Escolher Métodos para Gerar, 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 , deixe o valor padrão de Usar instruções SQL e clique em Avançar.

  3. Na página Escolher um Tipo de Consulta , deixe o valor padrão de SELECT, que retorna linhas e clique em Avançar.

  4. Na página Especificar uma instrução SQL SELECT , deixe a consulta padrão e clique em Avançar.

  5. Na página Escolher Métodos para Gerar, digite GetOrders para o nome do método na seção Retornar um 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 ao serviço de dados

Como o serviço de dados requer informações do dataset e 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. Selecione 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#, você deve adicionar uma referência ao System.Data.DataSetExtensions assembly 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 sob o comentário Adicione 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 no C# e no Visual Basic. Para alternar o idioma 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 no lado direito.

  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 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, selecione Aplicativo Windows Forms.

  3. Nomeie o projeto PresentationTier e clique em OK.

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

Definir 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

  • No 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 ao serviço de dados para acessar os métodos disponíveis nele. Além disso, uma referência ao conjunto de dados é necessária para habilitar o compartilhamento de tipos pelo serviço WCF. Até habilitar o compartilhamento de tipos por meio do serviço de dados, o código adicionado à classe de conjunto de dados parcial não estará disponível para a camada de apresentação. Como você normalmente adiciona código, como código de validação aos eventos de alteração de linha e coluna de uma tabela de dados, é provável que você queira acessar esse código 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, selecione o serviço que você criou 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 dois DataGridViews associados a dados ao formulário

  1. No Gerenciador de Soluções, selecione 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 Form1_Load manipulador de eventos clicando duas vezes em uma área vazia do formulário.

  7. Adicione o código a seguir ao manipulador de eventos Form1_Load.

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

Aumentar o tamanho máximo de mensagem permitido 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 destina-se a limitar a exposição a ataques de DoS (negação de serviço). Para obter mais informações, consulte MaxReceivedMessageSize.

Para aumentar o valor do parâmetro maxReceivedMessageSize

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

  2. Localize o atributo maxReceivedMessageSize e altere o valor para 6553600. Se você não vir a basicHttpBinding entrada, adicione uma como o seguinte exemplo:

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

Testar o aplicativo

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

Próximas etapas

Dependendo dos requisitos do aplicativo, há várias etapas que talvez você queira executar depois de salvar dados relacionados no aplicativo baseado no Windows. Por exemplo, você pode fazer os seguintes aprimoramentos neste aplicativo:

  • Adicione validação ao conjunto de dados.

  • Adicione métodos adicionais ao serviço para atualizar dados de volta para o banco de dados.