Buscar

PIMVIII - ANÁLISE E DESENVOLVIMENTO DE SISTEMAS (NOTA 10.0) 2021

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 65 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 65 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 65 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

6
UNIVERSIDADE PAULISTA
ANÁLISE E DESENVOLVIMENTO DE SISTEMA
SEU NOME
PROJETO INTEGRADO MULTIDISCIPLINAR VIII
Desenvolvimento de protótipo em ASP.Net e Android
SÃO PAULO – SP
2021
UNIVERSIDADE PAULISTA
ANÁLISE E DESENVOLVIMENTO DE SISTEMA
PROJETO INTEGRADO MULTIDISCIPLINAR VIII
Desenvolvimento de protótipo em ASP.Net e Android
Nome: SEU NOME 
RA: XXXXX
Curso: Análise e Desenvolvimento de Sistema
Semestre: 04/2021
SÃO PAULO – SP
2021
RESUMO
O presente Projeto Integrado Multidisciplinar, proposto pela universidade UNIP Interativa, visa aplicar o conhecimento adquirido no bimestre pelas aulas de Programação Orientada a Objetos II, Desenvolvimento de Software para Internet e Tópicos Especiais de Programação Orientada a Objetos. Este trabalho propõe a realizar o desenvolvimento de protótipos em ASP.Net que permita ao usuário efetuar a interação com tal trecho do banco de dados para realização de operações (CRUD), deverá ser desenvolvido em C# o mecanismo de acesso e comunicação a um trecho do banco de dados de um sistema, deverá ser desenvolvido interface gráfica para interação do usuário ao sistema em ASP.Net e Android que permita as operações (CRUD), neste trecho do banco de dados escolhido.
Palavras-chave: ASP.Net, CRUD, Android, Protótipo.
ABSTRACT
This Integrated Multidisciplinary Project, proposed by the UNIP Interativa university, aims to apply the knowledge acquired in the two-month period through the Object Oriented Programming II classes, Internet Software Development and Special Topics in Object Oriented Programming. This work proposes to carry out the development of prototypes in ASP.Net that allows the user to interact with such a part of the database for performing operations (CRUD), the access and communication mechanism to a part of the database must be developed in C#. database of a system, a graphical interface must be developed for user interaction with the system in ASP.Net and Android that allows operations (CRUD) in this excerpt of the chosen database.
Key words: ASP.Net, CRUD, Android, Prototype.
LISTA DE ILUSTRAÇÕES
Figura 1 - Tela Web - ASP.Net	8
Figura 2 - Organização do Projeto - Tela Web	14
Figura 3 - Teste Consulta - ASP.Net	18
Figura 4 - Interface Menu – Windows Forms	20
Figura 5 - Interface Consulta - Windows Forms	21
Figura 6 - Interface Cadastro de Pessoas – Windows Forms	22
Figura 7 - Diagrama do Cadastro de Pessoas – SQL Server	23
Figura 8 - Interface Principal - Android	35
Figura 9 - Interface Cadastro de Pessoa - Android	36
Figura 10 - Interface Menu - Cadastrar Pessoa	41
Figura 11 - Interface Menu - Consulta Pessoa	42
Figura 12 - Cadastro de Pessoa	44
Figura 13 - Cadastrar Novo	45
Figura 14 - Cadastro Salvar	46
Figura 15 - Cadastrar Mensagem	47
Figura 16 - Atualização Grid	48
Figura 17 - Edição Cadastro	49
Figura 18 - Edição Campos	50
Figura 19 - Edição Concluir	51
Figura 20 - Edição Mensagem	52
Figura 21 - Cancelar Cadastro	53
Figura 22 - Excluir Cadastro	54
Figura 23 - Excluir Mensagem Confirmação	55
Figura 24 - Excluir com Sucesso	56
Figura 25 - Excluir Atualização	57
Figura 26 - Consulta Menu	58
Figura 27 - Consultar Todos	59
Figura 28 - Consulta CPF Dois Número	59
Figura 29 - Consulta CPF Cadastro	60
Sumário
1.	INTRODUÇÃO	6
2.	PROTÓTIPO TELA ASP.NET	6
2.1.	Código Aspx do Layout – Tela Web	9
3.	Código C# - Tela Web ASP.Net	12
3.1.	Código C# - Classe Pessoa	12
3.2.	Código C# - Interface PessoaDao	13
3.3.	Código C# - Classe SimuladorDAO	14
4.	CÓDIGO C# - PERSISTÊNCIA DE DADOS – TELA WEB	15
4.1.	Código C# - Classe Gerenciador – Banco de Dados	16
4.2.	Código C# - Classe SqlServerDao – Conexão e Script	17
4.3.	Teste Aplicação ASP.Net – Tela Web	19
5.	PROJETO APLICATIVO WINDOWS FORMS	20
5.1.	Interface Gráficas do Sistema de Cadastro	21
6.	BANCO DE DADOS – CADASTRO DE PESSOA	23
6.1.	Código C# - Conexão e Persistência de Dados	24
6.1.1.	Script - Conexão de Dados	24
6.1.2.	Classe C# - Conexão com o LINQ	25
6.1.3.	Código C# - Trecho de Incluir e Salvar Dados	25
6.1.4.	Código C# - Trecho de Excluir Dados	28
6.1.5.	Código C# - Trecho de Cancelar Edição de Dados	30
6.2.	Formulário de Consulta – Código C#	31
6.2.1.	Código C# - Consulta de Todos os Cadastros	31
6.2.2.	Código C# - Consulta de Cadastro pelo CPF	32
7.	CONTROLE DE FORMULÁRIO	33
7.1.	Classe C# - Meu formulário	34
7.2.	Classe C# - Formulário Principal	34
8.	PROTÓTIPO - INTERFACE GRÁFICA ANDROID	35
8.1.	Código XML Activities – Layout Interface Principal	37
8.2.	Código XML Activities – Layout Interface Cadastro de Pessoa	38
9.	ROTEIRO DE TESTE – CRUD	41
9.1.	Menu Principal	41
9.2.	Cadastro de Pessoa	43
9.2.1.	Cadastrar Nova Pessoa	45
9.2.2.	Edição da Pessoa Cadastrada	49
9.2.3.	Cancelar – Edição ou Novo Cadastramento	53
9.2.4.	Excluir Cadastro Selecionado	54
9.3.	Consulta de Cadastro da Pessoa	58
10.	CONCLUSÃO	62
	REFERÊNCIAS	63
INTRODUÇÃO
Conforme a proposta do PIM, foi realizado a criação dos protótipos de interface gráfica com as respectivas operações CRUD, que deve fornecer ao usuário interagir com o trecho de cadastro do banco de dados, e possa realizar a persistência de dados deste banco permitindo a inclusão, edição, salvar e deletar, conforme a necessidade exigente de manter o cadastro de pessoas no sistema. 
Para que o usuário possa ter este relacionamento com o cadastro da pessoa foi realizada a criação da interface gráfica em ASP.Net para que possa ser acessado este trecho de banco de dados e dar usabilidade ao usuário e facilidade da transmissão dos dados cadastrados ao sistema e também criado um protótipo na Aplicação Windows Forms assim disponibilizado duas formas de representação da aplicação para escolha do cliente, foi representado o modelo de diagrama deste trecho do cadastro do banco de dados pelo DER (Diagrama Entidade Relacionamento), conforme veremos a figura em um trecho deste trabalho adiante. O trecho do banco de dados representado neste trabalho consiste em quatro entidades: PESSOA, ENDERECO, TELEFONE, TELEFONE_TIPO que serão a principais tabelas desta persistência de dados do cadastro e uma tabela PESSOA_TELEFONE, que fará o papel de tabela associativa (ou junção), que irá mapear duas tabelas no banco de dados referenciando as respectivas chaves primárias de cada tabela de dados PESSOA e TELEFONE.
Foi realizado a inclusão das imagens de captura de tela das interfaces dos Formulários e Tela de teste Android, cópia dos trechos de códigos relevantes na proposta e representação direto pelo Visual Studio.
Adicionado o teste do protótipo em ASP.Net e Windows Forms para ter uma visualização das funcionalidades do sistema.
PROTÓTIPO TELA ASP.NET
O projeto definido foi efetuado o desenvolvimento das telas do protótipo ASP.Net que permita ao usuário a interação com o trecho do banco de dados a efetuar as operações CRUD, a tela contém um formulário para entrada de dados e conforme o preenchimento e interação com os botões “CONSULTAR”, “INCLUIR”, “ALTERAR”,” EXCLUIR”. Usando o código C# faz comunicação com o banco e o gerenciamento das entidades do cadastramento da pessoa. Abaixo a descrição e a Figura 1 do teste efetuado da tela do formulário no Browser Mozilla Firefox e abaixo o arquivo de estilo.css externo usado no projeto.
· Campo Nome – para dados tipo string.
· Campo CPF – para dados numéricos.
· Campo Tipo Telefone - que é um DropDownList com tipos de telefone padrões cadastrados para seleção.
· Campo DDD – para informar o ddd do telefone cadastrado.
· Campo número do Telefone – para dados numéricos.
· Campo Logradouro – para dados tipo string.
· Campo Número do Logradouro – para dados numéricos.
· Campo Cep – para dados numéricos.
· Campo Bairro – para dados tipo string.
· Campo Cidade – para dados tipo string.
· Campo Estado – que é um DropDownList com estado do Brasil para ser selecionados já cadastrados dentro do campo.
· Botão Consultar – para consultar os dados cadastrados e serve para efetuar consulta através do CPF da pessoa cadastrada.
· Botão Incluir – para salvar os dadospreenchidos de um novo cadastrado.
· Botão Alterar – para a edição de um cadastro de dados.
· Botão Excluir – para efetuar a exclusão do cadastro selecionado.
· ListBox – que mostra todos os cadastros consultado pelo banco de dados ao selecionar o botão Consultar ou ao consultar pelo CPF.
Figura 1 - Tela Web - ASP.Net
Fonte: O autor, 2021.
* {
 margin: 0;
 padding: 0;
}
#titulo {
 font-family: sans-serif;
 color: #380b61;
 margin-left:7%;
}
#subtitulo {
 font-family: sans-serif;
 color: #380b61;
 margin-left: 10%;
}
fieldset {
 border: 0;
}
body {
 background-color: #F0F8FF;
 font-family: sans-serif;
 font-size: 1em;
 color: #59429D;
 margin-left: 36%;
 margin-top: 2%;
 justify-content: center;
}
.caixa {
 border-radius: 5px;
 padding:0.2em;
 border: 1px solid #59429D; 
 box-shadow: 2px 2px 2px rgb(0,0,0,0,0.2);
 display:block;
}
.campo {
 margin-bottom: 1em;
}
.campo label{
 margin-bottom: 0.2em;
 color: #59429D;
 display: block;
}
fieldset.grupo .campo{
 float: left;
 margin-right: 1em;
}
.container{
 width:500px;
 display: flex;
 flex-direction: row;
 flex-wrap: nowrap;
}
.botao {
 font-size: 1.2em;
 background: #59429d;
 border: 0;
 margin-bottom: 0.5em;
 color: #ffffff;
 padding: 0.2em 0.6em;
 box-shadow: 2px 2px 2px rgba(0,0,0,0.2);
 text-shadow: 1px 1px 1px rgba(0,0,0,0.5);
 transform: translate(-50%, -50%);
 margin-left: 15%;
 margin-top: 5%;
}
.botao:hover {
 background: #CCBBFF;
 box-shadow: inset 2px 2px 2px rgba(0,0,0,0.2);
 text-shadow: none;
 }
Código Aspx do Layout – Tela Web
Conforme definido no projeto PIM estabelecido, veremos abaixo o código aspx do layout do formulário criado contendo a estrutura da imagem anterior da Tela Web.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Tela.aspx.cs" Inherits="Tela_web.Tela" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 <title>Cadastro de Pessoas</title>
 <link rel="stylesheet" type="text/css" href="estilo.css">
</head>
<body>
 <form id="formCadastro" runat="server">
 <div>
 <h1 id="titulo">Cadastro de Pessoas</h1>
 <p id="subtitulo">Prrencha o formulário de cadastro</p>
 <br />
 </div> 
 
 <fieldset class="grupo">
 <div classe="campo">
 <asp:Label ID="lblNome" runat="server" Text="Nome: " class= "etiqueta"></asp:Label>
 <asp:TextBox class="caixa" ID="txtNome" runat="server" Width="320px" required></asp:TextBox>
 </div>
 <div classe="campo">
 <asp:Label ID="lblCpf" runat="server" Text="CPF: " class= "etiqueta"></asp:Label>
 <asp:TextBox class="caixa" ID="txtCpf" runat="server" Width="190px" required></asp:TextBox>
 </div>
 </fieldset>
 <div classe="campo">
 <asp:Label ID="lblTipo" runat="server" Text="Tipo: " class= "etiqueta"></asp:Label>
 <asp:DropDownList class="caixa" ID="ddlTipo" runat="server" Width="51px">
 <asp:ListItem Value="TEL"></asp:ListItem>
 <asp:ListItem Value="CEL"></asp:ListItem>
 <asp:ListItem Value="TEL COM."></asp:ListItem>
 </asp:DropDownList>
 </div>
 <div classe="campo">
 <asp:Label ID="lblDdd" runat="server" Text="DDD: " class= "etiqueta"></asp:Label>
 <asp:TextBox class="caixa" ID="txtDdd" runat="server" Width="30px" required></asp:TextBox>
 <asp:Label ID="lblNumTel" runat="server" Text="Num. Tel/Cel: "></asp:Label>
 <asp:TextBox class="caixa" ID="txtNumTel" runat="server" Width="112px" required></asp:TextBox>
 </div>
 <div classe="campo">
 <asp:Label ID="lblLogradouro" runat="server" Text="Logradouro: " class= "etiqueta"></asp:Label>
 <asp:TextBox class="caixa" ID="txtLogradouro" runat="server" required></asp:TextBox>
 <asp:Label ID="lblNumero" runat="server" Text="Número: " class= "etiqueta"></asp:Label>
 <asp:TextBox class="caixa" ID="txtNumero" runat="server" required></asp:TextBox>
 </div>
 
 <div classe="campo">
 <asp:Label ID="lblCep" runat="server" Text="Cep: " class= "etiqueta"></asp:Label>
 <asp:TextBox class="caixa" ID="txtCep" runat="server" required></asp:TextBox>
 </div>
 <div classe="campo">
 <asp:Label ID="lblBairro" runat="server" Text="Bairro: " class= "etiqueta"></asp:Label>
 <asp:TextBox class="caixa" ID="txtBairro" runat="server" required></asp:TextBox>
 <asp:Label ID="lblCidade" runat="server" Text="Cidade: " class= "etiqueta"></asp:Label>
 <asp:TextBox class="caixa" ID="txtCidade" runat="server" required></asp:TextBox>
 </div>
 
 <div classe="campo">
 <asp:Label ID="lblEstado" runat="server" Text="Estado: " class= "etiqueta"></asp:Label>
 <asp:DropDownList class="caixa" ID="ddlEstado" runat="server">
 <asp:ListItem Value="Acre - AC"></asp:ListItem>
 <asp:ListItem Value="Alagoas - AL"></asp:ListItem>
 <asp:ListItem Value="Amapá - AP"></asp:ListItem>
 <asp:ListItem Value="Amazonas - AM"></asp:ListItem>
 <asp:ListItem Value="Bahia - BA"></asp:ListItem>
 <asp:ListItem Value="Ceará - CE"></asp:ListItem>
 <asp:ListItem Value="Distrito Federal - DF"></asp:ListItem>
 <asp:ListItem Value="Espírito Santo - ES"></asp:ListItem>
 <asp:ListItem Value="Goiás - GO"></asp:ListItem>
 <asp:ListItem Value="Maranhão - MA"></asp:ListItem>
 <asp:ListItem Value="Mato Grosso - MT"></asp:ListItem>
 <asp:ListItem Value="Mato Grosso do Sul - MS"></asp:ListItem>
 <asp:ListItem Value="Minas Gerais - MG"></asp:ListItem>
 <asp:ListItem Value="Pará - PA"></asp:ListItem>
 <asp:ListItem Value="Paraíba - PB"></asp:ListItem>
 <asp:ListItem Value="Paraná - PR"></asp:ListItem>
 <asp:ListItem Value="Pernambuco - PE"></asp:ListItem>
 <asp:ListItem Value="Piauí - PI"></asp:ListItem>
 <asp:ListItem Value="Rio de Janeiro - RJ"></asp:ListItem>
 <asp:ListItem Value="Rio Grande do Norte - RN"></asp:ListItem>
 <asp:ListItem Value="Rio Grande do Sul - RS"></asp:ListItem>
 <asp:ListItem Value="Rondônia - RO"></asp:ListItem>
 <asp:ListItem Value="Roraima - RR"></asp:ListItem>
 <asp:ListItem Value="Santa Catarina - SC"></asp:ListItem>
 <asp:ListItem Value="São Paulo - SP"></asp:ListItem>
 <asp:ListItem Value="Sergipe - SE"></asp:ListItem>
 <asp:ListItem Value="Tocantins - TO"></asp:ListItem>
 </asp:DropDownList>
 </div>
 <div class="container" >
 <asp:Button class="botao" ID="btnConsultar" runat="server" Text="Consultar" OnClick="btnConsultar_Click" />
 <asp:Button class="botao" ID="btnIncluir" runat="server" Text="Incluir" OnClick="btnIncluir_Click" />
 <asp:Button class="botao" ID="btnAlterar" runat="server" Text="Alterar" OnClick="btnAlterar_Click" />
 <asp:Button class="botao" ID="btnExcluir" runat="server" Text="Excluir" OnClick="btnExcluir_Click" />
 </div
 <br />
 <asp:ListBox ID="lbListagem"runat="server" Height="300px" Width="744px"></asp:ListBox>
 
 </form>
</body>
</html>
Código C# - Tela Web ASP.Net
Nas sessões seguintes veremos as Classes criadas do projeto da aplicação desenvolvida de operações CRUD e suas importâncias. 
Código C# - Classe Pessoa
O código abaixo contém os métodos da classe Pessoa e propriedades usando a subscrita do método Equals() herdado da classe Object. O método retorna true se o parâmetro obj for da classe Pessoa e seus atributos nome, cpf, tipo, ddd, telefone, logradouro, número, cep, bairro, cidade e estado forem iguais a nome, cpf, tipo, ddd, telefone, logradouro, número, cep, bairro, cidade e estado da instância atual.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Back_Office
{
 public class Pessoa
 {
 public string nome { get; set; }
 public int cpf { get; set; }
 public string tipo { get; set; }
 public int ddd { get; set; }
 public int telefone { get; set; }
 public string logradouro { get; set; }
 public int numero { get; set; }
 public int cep { get; set; }
 public string bairro { get; set; }
 public string cidade { get; set; }
 public string estado { get; set; }
 public override bool Equals(object obj)
 {
 bool saida = false;
 if (typeof(Pessoa) == obj.GetType())
 {
 Pessoa pessoa = (Pessoa)obj;
 if (this.nome.Equals(pessoa.nome) && this.cpf.Equals(pessoa.cpf) && this.tipo.Equals(pessoa.tipo) && this.ddd.Equals(pessoa.ddd) && this.telefone.Equals(pessoa.telefone) && this.ddd.Equals(pessoa.ddd) &&
 this.logradouro.Equals(pessoa.logradouro) && this.numero.Equals(pessoa.numero) && this.cep.Equals(pessoa.cep) && this.bairro.Equals(pessoa.bairro) && this.cidade.Equals(pessoa.cidade) && this.estado.Equals(pessoa.estado))
 {
 saida = true;
 }
 }
 return saida;
 }
 public override string ToString()
 {
 return nome + " - " + cpf + " - " + tipo + " - " + ddd + " - " + telefone + " - " + logradouro + " - " + numero + " - " + cep + " - " + bairro + " - " + cidade + " - " + estado;
 }
 }
}
Código C# - Interface PessoaDao
Definida uma interface de pessoa que será herdada pela Classe SimuladorDao que irá conter assinaturas dos métodos do CRUD.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Back_Office
{
 public interface PessoaDao
 {
 void incluir(Pessoa p);
 List<Pessoa> consultar();
 List<Pessoa> consultar(int cpf);
 void alterar(Pessoa p);
 void excluir(Pessoa p);
 }
}
Código C# - Classe SimuladorDAO
Classe SimuladorDao que terá uma classe List que funciona parecido como um array que pode ser alterado o tamanho de acordo com os valores contidos ou removidos dela e só irá armazenar objetos da classe Pessoa e será devolvido objetos da mesma classe e fará a implementação dos métodos CRUD.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Back_Office
{
 class SimuladorDao : PessoaDao
 {
 private static List<Pessoa> bd = new List<Pessoa>();
 void PessoaDao.alterar(Pessoa p)
 {
 foreach (Pessoa pessoa in bd)
 {
 if (pessoa.nome.Equals(p.nome))
 {
 pessoa.cpf = p.cpf;
 pessoa.tipo = p.tipo;
 pessoa.ddd = p.ddd;
 pessoa.telefone = p.telefone;
 pessoa.logradouro = p.logradouro;
 pessoa.numero = p.numero;
 pessoa.cep = p.cep;
 pessoa.bairro = p.bairro;
 pessoa.cidade = p.cidade;
 pessoa.estado = p.estado;
 }
 }
 }
 List<Pessoa> PessoaDao.consultar()
 {
 return bd;
 }
 List<Pessoa> PessoaDao.consultar(int cpf)
 {
 List<Pessoa> saida = new List<Pessoa>();
 foreach (Pessoa pessoa in bd)
 {
 if (pessoa.nome.Equals(cpf))
 {
 saida.Add(pessoa);
 }
 }
 return saida;
 }
 void PessoaDao.excluir(Pessoa p)
 {
 bd.Remove(p);
 }
 void PessoaDao.incluir(Pessoa p)
 {
 bd.Add(p);
 }
 }
}
CÓDIGO C# - PERSISTÊNCIA DE DADOS – TELA WEB
Nas sessões abaixo será visto as classes contendo os códigos responsáveis pela persistência de dados, para melhor entendimento da organização do projeto na Figura 2 logo abaixo a organização da biblioteca de classes e classe da estrutura do projeto da Tela Web e nas sessões posteriores as classes e suas importâncias com a persistências de dados.
Figura 2 - Organização do Projeto - Tela Web
Fonte: O autor, 2021.
Código C# - Classe Gerenciador – Banco de Dados
Código da Classe abaixo responsável pelo Banco de Dados utilizado e pode ser modificado de acordo com a precisão do projeto, que faz o gerenciamento do banco atual da aplicação no caso atual está sendo utilizado SQL Server.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Back_Office
{
 public class Gerenciador
 {
 public PessoaDao dao;
 public Gerenciador(BancoDeDados bd)
 {
 switch (bd)
 {
 case BancoDeDados.Simulador:
 dao = new SimuladorDao();
 break;
 case BancoDeDados.MySql:
 throw new NotImplementedException("DAO para MySql não implementado");
 case BancoDeDados.SqlServer:
 dao = new SqlServerDao();
 break;
 }
 }
 }
}
Código C# - Classe SqlServerDao – Conexão e Script
Código da Classe abaixo responsável pela conexão com o banco de dados e a implementação dos scripts das operações CRUD. Que será utilizado nos botões da Tela Web do ASP.Net.
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
namespace Back_Office
{
 public class SqlServerDao : PessoaDao
 {
 private static SqlConnection con;
 public SqlServerDao()
 {
 if (con == null)
 {
 try
 {
 string connetionString;
 SqlConnection con;
 connetionString = @"Data Source=.\SQLEXPRESS;Integrated Security=true;Initial Catalog=PIM;User ID=;Password=";
 con = new SqlConnection(connetionString);
 con.Open();
 Console.WriteLine("Connection Open !");
 
 }
 catch (SqlException e)
 {
 Console.Error.WriteLine("Ocorreu uma exceção de BD: " + e.Message);
 throw new ApplicationException("Ocorreu uma exceção de BD: " + e.Message);
 }
 }
 }
 void PessoaDao.alterar(Pessoa p)
 {
 SqlCommand cmd = con.CreateCommand();
 cmd.CommandText = "UPDATE pessoa INNER JOIN endereco INNER JOIN telefone INNER JOIN telefone_tipo ON pessoa.id = endereco.id ON telefone.id = telefone_tipo.id" +
 "SET pessoa.nome = " + p.nome + " pessoa.cpf = " + p.cpf + "endereco.logradouro = " + p.logradouro + "endereco.numero = " + p.numero + "endereco.cep = " + p.cep + "endereco.bairro = " + p.bairro +
 "endereco.cidade = " + p.cidade + "endereco.estado = " + p.estado + "telefone.numero = " + p.telefone + "telefone.ddd = " + p.ddd + " telefone_tipo.tipo = " + p.tipo + "WHERE pessoa.id = endereco.id and telefone.id = telefone_tipo.id";}
 List<Pessoa> PessoaDao.consultar()
 {
 List<Pessoa> pessoas = new List<Pessoa>();
 SqlCommand cmd = con.CreateCommand();
 cmd.CommandText = "SELECT pessoa.nome, pessoa.cpf, endereco.logradouro, endereco.numero, endereco.cep, endereco.bairro, endereco.cidade, endereco.estado, telefone.ddd, telefone.numero, telefone_tipo.tipo FROM pessoa INNER JOIN endereco ON pessoa.id = endereco.id " +
 "INNER JOIN telefone ON pessoa.id = telefone.id INNER JOIN telefone_tipo ON pessoa.id = telefone_tipo.id";
 SqlDataReader reader = cmd.ExecuteReader();
 while (reader.Read())
 {
 Pessoa pessoa = new Pessoa();
 pessoa.nome = reader.GetString(0);
 pessoa.cpf = (int)reader.GetInt64(1);
 pessoa.tipo = reader.GetString(2);
 pessoa.ddd = reader.GetInt32(3);
 pessoa.telefone = reader.GetInt32(4);
 pessoa.logradouro = reader.GetString(5);
 pessoa.numero = reader.GetInt32(6);
 pessoa.cep = (int)reader.GetInt64(7);
 pessoa.bairro = reader.GetString(8);
 pessoa.cidade = reader.GetString(9);
 pessoa.estado = reader.GetString(10);
 pessoas.Add(pessoa);
 }
 reader.Close();
 return pessoas;
 }
 List<Pessoa> PessoaDao.consultar(int cpf)
 {
 List<Pessoa> pessoas = new List<Pessoa>();
 SqlCommand cmd = con.CreateCommand();
 cmd.CommandText = "SELECT pessoa.nome, pessoa.cpf, endereco.logradouro, endereco.numero, endereco.cep, endereco.bairro, endereco.cidade, endereco.estado, telefone.ddd, telefone.numero, telefone_tipo.tipo FROM pessoa INNER JOIN endereco ON pessoa.id = endereco.id " +
 "INNER JOIN telefone ON pessoa.id = telefone.id INNER JOIN telefone_tipo ON pessoa.id = telefone_tipo.id WHERE pessoa.cpf= '" + cpf +"';";
 SqlDataReader reader = cmd.ExecuteReader();
 while (reader.Read())
 {
 Pessoa pessoa = new Pessoa();
 pessoa.nome = reader.GetString(0);
 pessoa.cpf = (int)reader.GetInt64(1);
 pessoa.tipo = reader.GetString(2);
 pessoa.ddd = reader.GetInt32(3);
 pessoa.telefone = reader.GetInt32(4);
 pessoa.logradouro = reader.GetString(5);
 pessoa.numero = reader.GetInt32(6);
 pessoa.cep = (int)reader.GetInt64(7);
 pessoa.bairro = reader.GetString(8);
 pessoa.cidade = reader.GetString(9);
 pessoa.estado = reader.GetString(10);
 pessoas.Add(pessoa);
 }
 reader.Close();
 return pessoas;
 }
 void PessoaDao.excluir(Pessoa p)
 {
 SqlCommand cmd = con.CreateCommand();
 cmd.CommandText = "DELETE FROM pessoa, endereco, telefone, telefone_tipo INNER JOIN endereco ON pessoa.id = endereco.id " +
 "INNER JOIN telefone ON pessoa.id = telefone.id INNER JOIN telefone_tipo ON pessoa.id = telefone_tipo.id WHERE nome = '" +p.nome + "' AND pessoa.cpf = " + p.cpf + "' AND endereco.logradouro = " + p.logradouro + "' AND endereco.numero = " + p.numero + "' AND endereco.cep = " + p.cep + "' AND endereco.bairro = " + p.bairro +
 "' AND endereco.cidade = " + p.cidade + "' AND endereco.estado = " + p.estado + "' AND telefone.numero = " + p.telefone + "' AND telefone.ddd = " + p.ddd + "' AND telefone_tipo.tipo = " + p.tipo + "' AND pessoa.id = endereco.id AND telefone.id = telefone_tipo.id";
 }
 void PessoaDao.incluir(Pessoa p)
 {
 SqlCommand cmd = con.CreateCommand();
 cmd.CommandText = "INSERT INTO pessoa (nome, cpf), endereco (logradouro, numero, cep, bairro, cidade, estado), telefone (numero, ddd), telefone_tipo (tipo)" +
 " VALUES ('" + p.nome + "', " + p.cpf + "', " + p.logradouro + "', " + p.numero + "', " + p.cep + "', " + p.bairro + "', " + p.cidade + "', " + p.estado + "', " + p.telefone + "', " + p.ddd + "', " + p.tipo + ");";
 cmd.ExecuteNonQuery();
 }
 }
}
Teste Aplicação ASP.Net – Tela Web
Na Figura 3 a seguir será visto o teste de consulta de dados do formulário ASP.Net desenvolvido, com o retorno dos dados dos cadastros no ListBox.
Figura 3 - Teste Consulta - ASP.Net
Fonte: O autor, 2021.
PROJETO APLICATIVO WINDOWS FORMS 
O projeto referido foi desenvolvido o protótipo pela criação do projeto no Aplicativo Windows Forms, a criação de formulários para ter uma interface gráfica simples e objetiva ao usuário, foram desenvolvidos 3 Telas de formulário um de Menu com seu “menustrip” que dar uma extensão para ser adicionado outras opções conforme necessidade do cliente e crescimento do sistema por novas funcionalidades, com duas opções que levam ao Cadastro e outra que leva a Consulta dos cadastros, a tela de consulta que tem três componentes um DataGridView que informa todos cadastros ou o consultado pelo CPF, um campo de texto para a consulta de dados com o CPF que informa o cadastro consultado pelo CPF e um botão que mostra todos os cadastro que tem no banco de dados com as colunas que compõem a persistência de dados o ultimo formulário é o de cadastro de pessoas, conforme abaixo tem campos de texto, botões com suas respectivas interações com o banco, visibilidade dos dados e também tem um DataGridView, que mostra os dados para ser selecionados e alterados se assim o usuário desejar, veremos abaixo quais componentes fazem parte da interface de cadastros de pessoas:
· Campo Código – para dados numéricos, porém o banco gera automaticamente os dados através do autoincremento.
· Campo Nome – para dados tipo string.
· Campo CPF – para dados numéricos.
· Campo Tipo Telefone - que é um ComboBox com tipos de telefone padrões cadastrados para seleção.
· Campo DDD – para informar o ddd do telefone cadastrado.
· Campo número do Telefone – para dados numéricos.
· Campo Logradouro – para dados tipo string.
· Campo Número do Logradouro – para dados numéricos.
· Campo Cep – para dados numéricos.
· Campo Bairro – para dados tipo string.
· Campo Cidade – para dados tipo string.
· Campo Estado – que é um ComboBox com estado do Brasil para ser selecionados já cadastrados dentro do campo.
· Botão Novo – para criar um cadastro.
· Botão Gravar – para salvar os dados cadastrados ou editados selecionados no dataGridView.
· Botão Cancelar – para cancelar a edição ou novo cadastro de dados.
· Botão Excluir – para efetuar a exclusão do cadastro selecionado.
· DataGridView – que mostra todos os cadastros consultado pelo banco de dados ao carregamento do formulário ou ao efetuar edição e gravação de dados e para seleção do cadastro para ser editado.
Interface Gráficas do Sistema de Cadastro
Abaixo veremos as Figuras com as interfaces do sistema mencionados anteriormente, dando uma breve ideia da usabilidade do usuário e acesso do trecho com o banco de dados do cadastro da pessoa com as operações CRUD.
Figura 4 - Interface Menu – Windows Forms
Fonte: O autor, 2021.
Figura 5 - Interface Consulta - Windows Forms
Fonte: O autor, 2021.
Figura 6 - Interface Cadastro de Pessoas – Windows Forms
Fonte: O autor, 2021.
BANCO DE DADOS – CADASTRO DE PESSOA
O banco de dados SQL Server foi usado para criação da estrutura do banco de dados que foi utilizado no projeto CRUD proposto, será responsável pela persistência dos dados e aberto para fazer parte da integração de um banco de dados maior ao decorrer do crescimento do projeto, o sistema Aplicativo Windows Forms e ASP.Net, irá efetuar a comunicação com este banco e suas tabelas e transmitirá os dados com as operações CRUD, como será visto na Figura 4 – Diagrama do Cadastro de Pessoas contendo seus relacionamento com as tabelas pessoa, endereço, pessoa_telefone, telefone, telefone_tipo,retirado do SQL Server Management Studio, que foi criado:
Figura 7 - Diagrama do Cadastro de Pessoas – SQL Server
Fonte: O autor, 2021.
Código C# - Conexão e Persistência de Dados
Script - Conexão de Dados
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Pessoa.DAO
{
 // Classe usada para Conexão com banco de dados usado para o Consulta
 public class Conn
 {
 private static string server = @".\SQLEXPRESS";
 private static string dataBase = "PIM";
 private static string user = "";
 private static string password = "";
 public static string StrCon
 {
 get { return $"Data Source= {server}; Integrated Security=true ; Initial Catalog= {dataBase}; User ID= {user}; Password= {password }"; }
 }
 }
}
Classe C# - Conexão com o LINQ
 Foi realizado também a criação de uma classe responsável com a conexão com o LINQ do SQL Server a classe foi dada o nome de DataContextFactory, como o nome já diz se houver a necessidade de chamar a fábrica de conexão ao projeto junto com o SQL Server, como veremos no código abaixo:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Pessoa.DAO
{
 public class DataContextFactory
 {
 //Metódo responsável por efetuar a conexão com o banco de dados
 private static DAODataContext dataContext;
 public static DAODataContext DataContext
 {
 get
 {
 if (dataContext == null)
 {
 dataContext = new DAODataContext();
 }
 return dataContext;
 }
 }
 }
}
Código C# - Trecho de Incluir e Salvar Dados
 
Os trechos dos códigos abaixo da Aplicação Windows Forms, estão no botão “Novo” e “Gravar”, botão Novo responsável pela criação de um novo cadastro e botão Gravar responsável por salvar os dados do novo cadastro e da edição do cadastro selecionado dentro do DataGridView escolhido, foi criado métodos que são chamados dentro dos botões referidos, que será visto abaixo.
 // Método de pesquisa no banco de dados
 private void carregaDados() 
 {
 try
 {
 // Carregamento da consulta de cadastro de pessoas juntando todas as tabelas dentro do DataGridView
 using (SqlConnection cn = new SqlConnection(Conn.StrCon))
 {
 cn.Open();
 var sqlQuery = "SELECT pessoa.id AS Código, pessoa.nome AS Nome, pessoa.cpf AS CPF, endereco.logradouro AS Logradouro, endereco.numero AS Número, endereco.cep AS CEP, endereco.bairro AS Bairro, endereco.cidade AS Cidade, endereco.estado AS Estado, telefone.ddd AS DDD, telefone.numero AS NúmeroTelefone, telefone_tipo.tipo AS Tipo FROM pessoa INNER JOIN endereco ON pessoa.id = endereco.id " +
 "INNER JOIN telefone ON pessoa.id = telefone.id INNER JOIN telefone_tipo ON pessoa.id = telefone_tipo.id";
 using (SqlDataAdapter da = new SqlDataAdapter(sqlQuery, cn))
 {
 using (DataTable dt = new DataTable())
 {
 da.Fill(dt);
 dgvPessoa.DataSource = dt;
 }
 }
 }
 }
 catch (Exception ex)
 {
 MessageBox.Show("Falha ao tentar conectar \n\n" + ex.Message);
 }
 }
 private void habilitaCampos()
 {
 // Habilita os campos para preenchimento
 txtNome.Enabled = true;
 txtCpf.Enabled = true;
 txtLogradouro.Enabled = true;
 txtNumTel.Enabled = true;
 cboTipo.Enabled = true;
 txtDdd.Enabled = true;
 txtNumeroEnd.Enabled = true;
 txtCep.Enabled = true;
 txtBairro.Enabled = true;
 txtCidade.Enabled = true;
 cboEstado.Enabled = true;
 }
 // Método resposável por adicionar um novo cadastro
 private void btnNovo_Click(object sender, EventArgs e)
 {
 habilitaCampos();
 this.pessoaBindingSource.AddNew();
 this.enderecoBindingSource.AddNew();
 this.telefoneBindingSource.AddNew();
 this.telefone_tipoBindingSource.AddNew();
 }
 // Método resposável pela gravação do cadastro e atualização do banco de dados
 private void btnGravar_Click(object sender, EventArgs e)
 {
 
 try
 {
 if (txtNome.Text != "" && txtCpf.Text != "")
 {
 
 this.Validate();
 this.pessoaBindingSource.EndEdit();
 this.enderecoBindingSource.EndEdit();
 this.telefoneBindingSource.EndEdit();
 this.telefone_tipoBindingSource.EndEdit();
 this.tableAdapterManager.UpdateAll(this.pIMDataSet);
 
 DataContextFactory.DataContext.SubmitChanges();
 MessageBox.Show("Pessoa cadastrada com sucesso!");
 // Após a gravação o Formulário carrega novamente os dados do Dataset
 // TODO: esta linha de código carrega dados na tabela 'pIMDataSet.endereco'. 
 this.enderecoTableAdapter.Fill(this.pIMDataSet.endereco);
 // TODO: esta linha de código carrega dados na tabela 'pIMDataSet.telefone_tipo'. 
 this.telefone_tipoTableAdapter.Fill(this.pIMDataSet.telefone_tipo);
 // TODO: esta linha de código carrega dados na tabela 'pIMDataSet.telefone'. 
 this.telefoneTableAdapter.Fill(this.pIMDataSet.telefone);
 // TODO: esta linha de código carrega dados na tabela 'pIMDataSet.pessoa'. 
 this.pessoaTableAdapter.Fill(this.pIMDataSet.pessoa);
 }
 else
 {
 MessageBox.Show("Não Foi possível armazenar a pessoa informada!");
 }
 }
 catch (Exception erro)
 {
 MessageBox.Show("Atenção: " + erro.Message, "Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
 }
 carregaDados();
 }
Código C# - Trecho de Excluir Dados
Os trechos do código abaixo estão no botão “Excluir”, responsável pela exclusão do cadastro selecionado no DataGridView que foi dado SELECT nas tabelas do banco e mostrado os dados no DataGridView, dentro do botão a métodos que é chamado para efetuar a exclusão dos dados, como será visto no trecho abaixo:
 //Metódo criado para exlusão de registros
 private void excluirTelefoneTipoDados()
 {
 try
 {
 using (SqlConnection cn = new SqlConnection(Conn.StrCon))
 {
 int cd = Convert.ToInt32(txtId.Text);
 cn.Open();
 SqlCommand cm = new SqlCommand();
 string strSql = "DELETE FROM telefone_tipo WHERE id = @id";
 cm.CommandText = strSql;
 cm.Connection = cn;
 cm.Parameters.AddWithValue("@id", txtId.Text);
 cm.ExecuteNonQuery();
 }
 }
 catch (Exception erro)
 {
 MessageBox.Show("Falha ao tentar conectar \n\n" + erro.Message);
 }
 }
 //Metódo criado para exlusão de registros
 private void excluirTelefoneDados()
 {
 try
 {
 using (SqlConnection cn = new SqlConnection(Conn.StrCon))
 {
 int cd = Convert.ToInt32(txtId.Text);
 cn.Open();
 SqlCommand cm = new SqlCommand();
 string strSql = "DELETE FROM telefone WHEREid = @id";
 cm.CommandText = strSql;
 cm.Connection = cn;
 cm.Parameters.AddWithValue("@id", txtId.Text);
 cm.ExecuteNonQuery();
 }
 }
 catch (Exception erro)
 {
 MessageBox.Show("Falha ao tentar conectar \n\n" + erro.Message);
 }
 }
 //Metódo criado para exlusão de registros
 private void excluirEnderecoDados()
 {
 try
 {
 using (SqlConnection cn = new SqlConnection(Conn.StrCon))
 {
 int cd = Convert.ToInt32(txtId.Text);
 cn.Open();
 SqlCommand cm = new SqlCommand();
 string strSql = "DELETE FROM endereco WHERE id = @id";
 cm.CommandText = strSql;
 cm.Connection = cn;
 cm.Parameters.AddWithValue("@id", txtId.Text);
 cm.ExecuteNonQuery();
 }
 }
 catch (Exception erro)
 {
 MessageBox.Show("Falha ao tentar conectar \n\n" + erro.Message);
 }
 }
 //Metódo criado para exlusão de registros
 private void excluirPessoaDados()
 {
 try
 {
 using(SqlConnection cn = new SqlConnection(Conn.StrCon))
 {
 int cd = Convert.ToInt32(txtId.Text);
 cn.Open();
 SqlCommand cm = new SqlCommand();
 string strSql = "DELETE FROM pessoa WHERE id = @id";
 
 cm.CommandText = strSql;
 cm.Connection = cn;
 cm.Parameters.AddWithValue("@id", txtId.Text);
 cm.ExecuteNonQuery();
 
 }
 }catch(Exception erro)
 {
 MessageBox.Show("Falha ao tentar conectar \n\n" + erro.Message);
 }
 }
 // Método resposável pela exclusão do cadastro e atualização do banco de dados
 private void btnExcluir_Click(object sender, EventArgs e)
 {
 try
 {
 if (MessageBox.Show("Tem certeza da exclusão do cadastro?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
 {
 //Chamando método para exclusão dos dados
 excluirPessoaDados();
 excluirEnderecoDados();
 excluirTelefoneDados();
 excluirTelefoneTipoDados();
 MessageBox.Show("Pessoa excluida com sucesso!");
 }
 }
 // Tratamento de erro e solicitação de preenchimento dos dados novamente
 catch(Exception erro)
 {
 MessageBox.Show("O registro não pode ser excluído" + erro.Message, "Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
 pessoaTableAdapter.Fill(pIMDataSet.pessoa);
 }
 carregaDados();
 }
Código C# - Trecho de Cancelar Edição de Dados
O trecho abaixo está no botão de “Cancelar”, que também chama métodos para efetuar o cancelamento de edição e desabilitar os campos do formulário. 
 private void desabilitaCampos()
 {
 // Desabilita os campos para preenchimento
 txtNome.Enabled = false;
 txtCpf.Enabled = false;
 txtLogradouro.Enabled = false;
 txtNumTel.Enabled = false;
 cboTipo.Enabled = false;
 txtDdd.Enabled = false;
 txtNumeroEnd.Enabled = false;
 txtCep.Enabled = false;
 txtBairro.Enabled = false;
 txtCidade.Enabled = false;
 cboEstado.Enabled = false;
 }
 // Método resposável pelo cancelamento da edição do cadastro
 private void btnCancelar_Click(object sender, EventArgs e)
 {
 // Desabilita os campos para preenchimento
 desabilitaCampos();
 this.pessoaBindingSource.CancelEdit();
 this.enderecoBindingSource.CancelEdit();
 this.telefoneBindingSource.CancelEdit();
 this.telefone_tipoBindingSource.CancelEdit();
 carregaDados();
 }
Formulário de Consulta – Código C#
Será visto abaixo os métodos usados para consulta de cadastros de pessoas, dentro do formulário de consulta, foi criado duas formas de consulta, um botão de “Consultar Todos Cadastros” e o campo de texto com o label de identificação “Digite o CPF”, que traz o cadastro que é igual ao CPF que está sendo digitado, quando o usuário está digitando o CPF ele vai fazendo a consulta no banco de dados e mostrando as informações coletadas a partir do primeiro número digitado, então ele vai mostrando os cadastros no DatagridView do formulário de consulta que é próximo ao digitado até o usuário digitar o CPF desejado completo e o sistema traz o cadastro igual ao CPF digitado na consulta, será visto o teste do sistema em uma sessão posterior, que terá um entendimento mais claro.
Código C# - Consulta de Todos os Cadastros
Abaixo será visto o código que está no botão de “Consultar Todos os Cadastros””, que exibi no DataGridView dentro do Formulário de Consulta todos os dados retirados das tabelas do banco de dados de cadastros de pessoas do projeto proposto e exibi em suas respectivas colunas.
 private void button1_Click(object sender, EventArgs e)
 {
 toolStripStatusLabel1.Text = "Conectando, aguarde.";
 statusStrip1.Refresh();
 try
 {
 using (SqlConnection cn = new SqlConnection(Conn.StrCon))
 {
 cn.Open();
 var sqlQuery = "SELECT pessoa.id AS Código, pessoa.nome AS Nome, pessoa.cpf AS CPF, endereco.logradouro AS Logradouro, endereco.numero AS Número, endereco.cep AS CEP, endereco.bairro AS Bairro, endereco.cidade AS Cidade, endereco.estado AS Estado, telefone.ddd AS DDD, telefone.numero AS NúmeroTelefone, telefone_tipo.tipo AS Tipo FROM pessoa INNER JOIN endereco ON pessoa.id = endereco.id " +
 "INNER JOIN telefone ON pessoa.id = telefone.id INNER JOIN telefone_tipo ON pessoa.id = telefone_tipo.id";
 // recebe os dados das tabelas após a execução de um Select
 using (SqlDataAdapter da = new SqlDataAdapter(sqlQuery, cn))
 {
 // objeto DataTable pode representar uma ou mais tabelas de dados
 using (DataTable dt = new DataTable())
 {
 //recebendo os dados da instrução select
 da.Fill(dt);
 dgvConsultaPessoa.DataSource = dt;
 }
 }
 toolStripStatusLabel1.Text = "Pronto.";
 statusStrip1.Refresh();
 }
 }
 catch (Exception ex)
 {
 toolStripStatusLabel1.Text = "Falha.";
 statusStrip1.Refresh();
 MessageBox.Show("Falha ao tentar conectar \n\n" + ex.Message);
 }
 }
Código C# - Consulta de Cadastro pelo CPF
Abaixo será visto o código que está no campo de texto com o label de identificação “Digite o CPF”, como explicado anteriormente busca o CPF digitado pelo usuário no campo de texto a partir do primeiro número digitado e vai comparando com os cadastros extraído no banco de dados, a cada número incluído vai comparando com o valor do CPF extraído do cadastro do banco de dados da tabela pessoa, que será visto no teste posterior.
private void FrmConsultaPessoa_Load(object sender, EventArgs e)
 {
 toolStripStatusLabel1.Text = "";
 }
 private void txtBuscaCpf_TextChanged(objectsender, EventArgs e)
 {
 if (txtBuscaCpf.Text != "")
 {
 toolStripStatusLabel1.Text = "Conectando, aguarde.";
 statusStrip1.Refresh();
 try
 {
 using (SqlConnection cn = new SqlConnection(Conn.StrCon))
 {
 using (SqlCommand cm = new SqlCommand()) {
 cn.Open();
 cm.CommandText = "SELECT pessoa.id AS Código, pessoa.nome AS Nome, pessoa.cpf AS CPF, endereco.logradouro AS Logradouro, endereco.numero AS Número, endereco.cep AS CEP, endereco.bairro AS Bairro, endereco.cidade AS Cidade, endereco.estado AS Estado, telefone.ddd AS DDD, telefone.numero AS NúmeroTelefone, telefone_tipo.tipo AS Tipo FROM pessoa INNER JOIN endereco ON pessoa.id = endereco.id " +
 "INNER JOIN telefone ON pessoa.id = telefone.id INNER JOIN telefone_tipo ON pessoa.id = telefone_tipo.id WHERE pessoa.cpf like ('" + txtBuscaCpf.Text + "%')";
 cm.Connection = cn;
 // recebe os dados das tabelas após a execução de um Select
 using (SqlDataAdapter da = new SqlDataAdapter(cm.CommandText, cn))
 {
 // objeto DataTable pode representar uma ou mais tabelas de dados
 using (DataTable dt = new DataTable())
 {
 //recebendo os dados da instrução select
 da.Fill(dt); // Preenche o datatable
 dgvConsultaPessoa.DataSource = dt;
 cn.Close();
 }
 }
 toolStripStatusLabel1.Text = "Pronto.";
 statusStrip1.Refresh();
 }
 }
 }
 catch (Exception ex)
 {
 toolStripStatusLabel1.Text = "Falha.";
 statusStrip1.Refresh();
 MessageBox.Show("Falha ao tentar conectar \n\n" + ex.Message);
 }
 }else
 {
 dgvConsultaPessoa.DataSource = null;
 }
 }
CONTROLE DE FORMULÁRIO
Foi criado uma Classe para manter o controle dos formulários e pensando na expansão de criação de outros formulários na integração de outras funcionalidades para o projeto, está classe foi criada a manter as propriedades de “Get” e “Set” do formulário e assim recebendo o valor “null” quando o formulário for aberto e criado a condição dentro dos botões para que tenha somente um formulário quando o botão for clicado de Cadastro de Pessoa e Consulta de Pessoa e criados métodos nos botões do “menuStrip” no Formulário Principal, como veremos nos códigos C# abaixo:
Classe C# - Meu formulário
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ProjetoPimVIII
{
 // Classe para controlar a criação de Formulario para se ter somente um na abertura
 class MeuFormulario
 {
 public static FrmCadastroPessoas FormCadastro { get; set; }
 public static FrmConsultaPessoa FormConsulta { get; set; }
 }
}
Classe C# - Formulário Principal
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ProjetoPimVIII
{
 public partial class FrmPrincipal : Form
 {
 public FrmPrincipal()
 {
 InitializeComponent();
 }
 // Método para verificar se o formulário existe, caso não existir ele criará um novo formulário
 // Se existir ele mostrará o formulário criado
 private void cadastrarPessoaToolStripMenuItem_Click(object sender, EventArgs e)
 {
 if (MeuFormulario.FormCadastro == null)
 {
 MeuFormulario.FormCadastro = new FrmCadastroPessoas();
 }
 MeuFormulario.FormCadastro.Show();
 MeuFormulario.FormCadastro.Focus();
 }
 private void consultaDePessoasToolStripMenuItem_Click(object sender, EventArgs e)
 {
 if (MeuFormulario.FormConsulta == null)
 {
 MeuFormulario.FormConsulta = new FrmConsultaPessoa();
 }
 MeuFormulario.FormConsulta.Show();
 MeuFormulario.FormConsulta.Focus();
 }
 private void cadastroToolStripMenuItem_Click(object sender, EventArgs e)
 {
 }
 }
}
PROTÓTIPO - INTERFACE GRÁFICA ANDROID
Foi realizado a criação do protótipo da interface gráfica Android no software Android Studio, para ser fornecido ao usuário as operações CRUD conforme a proposta deste trabalho, a interface foi criada para ser simples e que o usuário tenha um bom entendimento da usabilidade com o sistema e que seja agradável o uso.
A interface foi testada em dois modelos emulados de versões diferentes para ter uma noção de desempenho entre eles melhor, na tela principal terá a lista de cadastros que foi consultado o usuário vai ter um botão na tela principal para ser selecionado de “Cadastrar Pessoa” e será direcionado a tela de cadastro, para efetuar o preenchimento dos dados da pessoa a cadastrar contendo os campos de preenchimento dos dados a ser cadastrado, editado, ou deletado com seus respectivos botões na interface de cadastro e o botão salvar para concluir essas alterações, conforme será visto na Figura 4 e Figura 5 abaixo:
Figura 8 - Interface Principal - Android
Fonte: O autor, 2021.
Figura 9 - Interface Cadastro de Pessoa - Android
Fonte: O autor, 2021.
Código XML Activities – Layout Interface Principal 
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".MainActivity">
 <LinearLayout
 android:layout_width="409dp"
 android:layout_height="729dp"
 android:orientation="vertical"
 app:layout_constraintBottom_toBottomOf="parent"
 app:layout_constraintStart_toStartOf="parent">
 <ListView
 android:id="@+id/lsvCadastro"
 style="@style/Widget.AppCompat.Light.ListView.DropDown"
 android:layout_width="wrap_content"
 android:layout_height="605dp">
 </ListView>
 <Button
 android:id="@+id/btnCadastrar"
 style="@style/Widget.AppCompat.Button"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="Cadastrar Pessoa"
 tools:ignore="TextContrastCheck" />
 </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Código XML Activities – Layout Interface Cadastro de Pessoa
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 tools:context=".FormCadastro">
 <LinearLayout
 android:layout_width="409dp"
 android:layout_height="729dp"
 android:orientation="vertical"
 tools:layout_editor_absoluteX="1dp"
 tools:layout_editor_absoluteY="1dp">
 <EditText
 android:id="@+id/EditTextNome"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:hint="Digite o Nome"
 android:inputType="textPersonName"android:textSize="20sp" />
 <EditText
 android:id="@+id/EditTextCpf"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:hint="Digite o CPF"
 android:inputType="textPersonName"
 android:textSize="20sp" />
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal">
 <EditText
 android:id="@+id/EditTextDdd"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_weight="0"
 android:hint="DDD"
 android:inputType="textPersonName"
 android:textSize="20sp" />
 <EditText
 android:id="@+id/EditTextTelefone"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_weight="1"
 android:hint="Telefone"
 android:inputType="textPersonName"
 android:textSize="20sp" />
 </LinearLayout>
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="vertical">
 <EditText
 android:id="@+id/EditTextCep"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:hint="CEP"
 android:inputType="textPersonName" />
 </LinearLayout>
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal">
 <EditText
 android:id="@+id/EditTextEndereco"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_weight="4"
 android:hint="Logradouro"
 android:inputType="textPersonName"
 android:textSize="20sp" />
 <EditText
 android:id="@+id/EditTextNumEndereco"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_weight="1"
 android:hint="N°"
 android:inputType="textPersonName"
 android:textSize="20sp" />
 </LinearLayout>
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="vertical">
 <EditText
 android:id="@+id/EditTextBairro"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:hint="Bairro"
 android:inputType="textPersonName"
 android:textSize="20sp" />
 </LinearLayout>
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal">
 <EditText
 android:id="@+id/EditTextCidade"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_weight="1"
 android:hint="Cidade"
 android:inputType="textPersonName"
 android:textSize="20sp" />
 <EditText
 android:id="@+id/EditTextEstado"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_weight="0"
 android:hint="Estado"
 android:inputType="textPersonName"
 android:textSize="20sp" />
 </LinearLayout>
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal">
 <Button
 android:id="@+id/btnNovo"
 style="@android:style/Widget.DeviceDefault.Button.Toggle"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:layout_margin="15px"
 android:layout_weight="1"
 android:background="#66B3BA"
 android:text="Novo"
 android:textSize="16sp" />
 <Button
 android:id="@+id/btnEditar"
 style="@android:style/Widget.DeviceDefault.Button.Toggle"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:layout_margin="15px"
 android:layout_weight="1"
 android:background="#66B3BA"
 android:text="Editar"
 android:textSize="16sp" />
 <Button
 android:id="@+id/btnDeletar"
 style="@android:style/Widget.DeviceDefault.Button.Toggle"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_margin="15px"
 android:layout_weight="1"
 android:background="#66B3BA"
 android:text="Deletar"
 android:textSize="16sp" />
 </LinearLayout>
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal">
 <Button
 android:id="@+id/btnSalvar"
 style="@android:style/Widget.DeviceDefault.Button.Toggle"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_margin="15px"
 android:layout_weight="1"
 android:background="#66B3BA"
 android:text="Salvar"
 android:textSize="16sp" />
 </LinearLayout>
 </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
ROTEIRO DE TESTE – CRUD
Para ter um entendimento melhor das funcionalidades do sistema de operações CRUD, desenvolvi um pequeno roteiro de teste da interface criada no projeto Aplicativo Windows Forms, que será visto nas sessões posteriores como efetuar os testes do projeto e testar a usabilidade do sistema e ter um entendimento da comunicação com o banco de dados pelo usuário a manipular os cadastros do banco.
Menu Principal
No menu principal existe um menu de opções superior com dois botões “Cadastro” e” Consulta”, ao clicar no botão CADASTRO abrirá uma opção CADASTRAR PESSOA, que veremos as funcionalidades na sessão posterior e ao clicar na opção CONSULTA abrirá uma opção CONSULTA DE PESSOA que ao clicar levará ao usuário a interface de consulta dos cadastros de pessoas que tem cadastradas nas tabelas no banco de dados, abaixo as Figuras de interações do Menu Principal do sistema proposto:
Figura 10 - Interface Menu - Cadastrar Pessoa
Fonte: O autor, 2021.
Figura 11 - Interface Menu - Consulta Pessoa
Fonte: O autor, 2021.
Cadastro de Pessoa
Ao clicar no CADASTRAR PESSOA como foi citado na sessão anterior o usuário será levado a tela de cadastro do sistema sendo uma das mais importantes do sistema CRUD desenvolvido, nesta sessão será estabelecido como testar o sistema e a interface desenvolvida, a tela conta com os campos de preenchimento de dados que veremos as funcionalidades de preenchimento sendo:
· Código – gerado automaticamente ao cadastrar um novo usuário, não sendo possível usuário alterar este campo (nem na edição do cadastro), campo fica desabilitado para clicar mais ainda é visível no cadastro.
· Nome – para ser preenchido com o nome completo da pessoa a ser cadastrada.
· CPF – para ser preenchido com o número do CPF da pessoa a ser cadastrada usar somente números, exemplo:“12345678912”.
· Tipo – caixa de seleção de tipo do telefone a ser cadastrado contendo três opções pré-definidas (TEL, CEL, TEL COM.), sendo abreviações de telefone, celular e telefone comercial da pessoa a ser cadastrada.
· DDD – para ser digitado o ddd do telefone da pessoa a ser cadastrada, digitar somente números exemplo: “11”, “15”, “61”.
· Num. Tel/Cel – para ser digitado o número de telefone da pessoa a ser cadastrada, digitar somente números exemplo: “959836242” ou “39536271”.
· Logradouro – digitar a Rua/Avenida/Travessa da Pessoa a ser cadastrada, exemplo: “Rua Roteiro de Teste”.
· Número – digitar o número do Logradouro da pessoa a ser cadastrada.
· CEP – digitar o número do Cep do endereço da pessoa a ser cadastrada, usar somente números, exemplo: 02463120.
· Bairro – digitar o bairro do endereço da pessoa a ser cadastrada, exemplo: Vila Teste.
· Cidade – digitar a cidade do endereço da pessoa a ser cadastrada, exemplo: São Paulo.
· Estado – caixa de seleção dos estados do Brasil pré-definidos no campo para ser selecionados, exemplo: “Alagoas - AL”, “Maranhão - MA” e “São Paulo - SP”.
Na tela de Cadastro de Pessoa, também tem quatro botões, sendo eles: “Novo”, “Gravar”, “Cancelar” e “Excluir”, que veremos as funcionalidades nas sessões posteriores.
Figura 12 - Cadastro de Pessoa
Fonte: O autor, 2021.
Cadastrar Nova Pessoa
Para ser cadastrado uma nova pessoa clique no botão NOVO, conforme a Figura 10:
Figura 13 - Cadastrar Novo
Fonte: O autor, 2021.
Preencha os dados conforme explicado o preenchimento dos campos na sessão anterior, e clique em GRAVAR, conforme exemplo da Figura 11 abaixo:
Figura 14 - Cadastro Salvar
Fonte: O autor, 2021.
O sistema mostrará a mensagem “Pessoa cadastrada com sucesso”, conforme a Figura 12 abaixo:
Figura 15 - Cadastrar Mensagem
Fonte: O autor, 2021.
Após a mensagem a pessoa cadastrada aparecerá os dados no DataGridView, conforme exemplo da Figura 13 abaixo:
Figura 16 - Atualização Grid
Fonte: O autor, 2021.
Edição da Pessoa Cadastrada
Para efetuar o teste de edição será usado de exemplo a pessoa cadastrada anteriormente no DataGridView e editar o Nome e Cidade.
Selecionado no DataGridView o cadastro com o mouse, conforme exemplo da Figura 14 abaixo:
Figura 17 - Edição Cadastro
Fonte: O autor, 2021.
Será aberto as informações do cadastro nos seus campos conforme a Figura 15 abaixo:
Figura 18 - Edição Campos
 
Fonte: O autor, 2021.
Edite os campos que precisam ser alterados e clique no GRAVAR para concluir a edição, conforme exemplo da Figura 16 abaixo:
Figura 19 - Edição Concluir
Fonte: O autor, 2021.
Após clicar no botão GRAVAR, será mostrado ao usuário a mensagem de “Pessoa cadastrada com sucesso” concluindo a alteração e serão atualizado o DatagridView e o Banco de Dados, conforme exemplo da Figura 17 abaixo:
Figura 20 - Edição Mensagem
Fonte: O autor, 2021.
Cancelar – Edição ou Novo Cadastramento
Se a caso precisar cancelar a edição ou novo cadastramento clique no botão CANCELAR, que o sistema desabilitará os campos editáveis e não concluirá nenhuma edição e nenhum cadastramento, conforme exemplo da Figura 18 abaixo:
Figura 21 - Cancelar Cadastro
Fonte: O autor, 2021.
Excluir Cadastro Selecionado
Para efetuar a exclusão do cadastro será selecionado o cadastro no DataGridView da pessoa a ser excluída e clique no botão EXCLUIR da interface, conforme exemplo da Figura 19 abaixo:
Figura 22 - Excluir Cadastro
Fonte: O autor, 2021.
Após ser selecionado o botão EXCLUIR, será mostrado uma caixa de seleção de “Confirmação” de exclusão, ao escolher SIM para concluir a exclusão e NÃO para cancelar a exclusão, conforme exemplo da Figura 20 abaixo:
Figura 23 - Excluir Mensagem Confirmação
Fonte: O autor, 2021.
Para este exemplo vamos clicar SIM, para concluir a exclusão e aparecerá a mensagem “Pessoa excluída com sucesso” e como veremos na Figura 21 e Figura 22 abaixo o cadastro código 11 não aparece no DataGridView que foi atualizado e excluído do banco de dados.
Figura 24 - Excluir com Sucesso
Fonte: O autor, 2021.
Figura 25 - Excluir Atualização
Fonte: O autor, 2021.
Consulta de Cadastro da Pessoa
Como informado em sessões anteriores ao clicar na opção de CONSULTA, do Menu Principal abre um submenu com a opção CONSULTA DE PESSOA, conforme exemplo da Figura 23 abaixo:
Figura 26 - Consulta Menu
Fonte: O autor, 2021.
Após clicar na opção de CONSULTA DE PESSOA, o sistema mostrará outra interface de consulta de dados com um DataGridView, ao clicar no botão “Consultar todos os Cadastros”, aparecerá todos os cadastros de pessoas do banco de dados no DataGridView, conforme exemplo da Figura 24 abaixo:
Figura 27 - Consultar Todos
Fonte: O autor, 2021.
No campo de texto “Digite o CPF”, ao ser digitado o CPF, no caso do nosso exemplo vamos começar digitando dois números para consulta e ele trará dois cadastros que se igualam ao nosso digitado, conforme exemplo da Figura 25 abaixo:
Figura 28 - Consulta CPF Dois Número
Fonte: O autor, 2021.
Ao ser digitado mais números do CPF a ser consultado ele traz os dados atualizado do cadastro com maior precisão, conforme exemplo da Figura 26 abaixo:
Figura 29 - Consulta CPF Cadastro
Fonte: O autor, 2021.
CONCLUSÃO
A proposta do projeto é o desenvolvimento do mecanismo de acesso a um trecho do banco de dados de um sistema C# em ASP.Net que permita que ao usuário interagir com tal trecho do banco de dados para efetuar operações CRUD contendo as interfaces usada no mecanismo de operações CRUD foi também realizado a criação de uma interface Windows Forms com a mesma proposta. A segunda etapa do projeto era o desenvolvimento da interface Android de um protótipo que permita ao usuário interação com tal trecho do banco de dados de cadastro de pessoa. 
Neste projeto foi criado a base de dados com a estrutura do SQL Server com o software SQL Server Management Studio estruturando as respectivas tabelas proposto pelo PIM_VIII, foi possível criar a base de dados usada no software criado. 
Para mim foi um desafio, fazer o projeto individualmente e também gratificante pois tive muitos desafios e frustrações no meio do caminho para conclusão do sistema, sei que posso melhorar muito o sistema, através de aprendizado e conhecimento do front-end e do back-end da linguagem C# que existe um leque de possibilidades de efetuar as mesmas conclusões isso é surpreendente e efetuar a melhoraria das validações do projeto, o ASP.Net e Windows Forms tem muitas funcionalidades e opções dentro da plataforma do Visual Studio e sei que vou evoluir muito estudando as documentações tanto do C# e do ASP.Net, existem muitos bancos de dados e escolhi o SQL Server por ser um banco consistente e de fácil aprendizado (se você se dedicar), o Android Studio tem muitas possibilidades de desenvolvimento de aplicativo e como deixar um visual atraente ao usuário para ter um destaque neste imenso mercado de softwares, a comunidade de desenvolvimento é muito ativa e compartilha muito o conhecimento o que ajudou muito nas dúvidas que tive no desenvolvimento, a documentação ajudou muito na conclusão e entendimento das funcionalidades e propriedades das linguagens. 
Concluo que o projeto deste PIM me mostrou que ainda tenho muito aprender e me dedicar em minha jornada e tenho um mundo de possibilidades que me espera através de vontade de aprender e conhecimento. 
REFERÊNCIAS
DEVELOPERS. Guias do Desenvolvedor. Disponível em: https://developer.android.com/guide?hl=pt-br. Acesso em 27/10/2021.
GAMMA, E.; HELM, R.; JOHNSON, R.; VLISSIDES, J. Padrões de Projetos. Porto Alegre: Grupo A, 2011. 9788577800469. Disponível em: https://integrada.minhabiblioteca.com.br/#/books/9788577800469/. Acesso em: 05/10/2021.
MICROSOFT. Documentação C#. Disponível em: https://docs.microsoft.com/pt-br/dotnet/csharp/. Acesso em 16/10/2021.
MICROSOFT. Documentação do Microsoft SQL. Disponível em: https://docs.microsoft.com/pt-br/sql/?view=sql-server-ver15. Acesso em 10/10/2021.
MICROSOFT. Documentação do Visual Studio. Disponível em:https://docs.microsoft.com/pt-br/visualstudio/windows/?view=vs-2022&preserve-view=true. Acesso em 20/10/2021.

Outros materiais