k19 k32 Desenvolvimento Web Com Aspnet Mvc

206
TREINAMENTOS Desenvolvimento Web com ASP.NET MVC 4

Transcript of k19 k32 Desenvolvimento Web Com Aspnet Mvc

TRE INAME NTO S

Desenvolvimento Web com ASP.NET MVC 4

Desenvolvimento Web com ASP .NET MVC 4

25 de junho de 2012

Sumrio Sobre a K19 Seguro Treinamento Termo de Uso Cursos 1 Banco de Dados 1.1 Sistemas Gerenciadores de Banco de Dados . 1.2 SQL Server . . . . . . . . . . . . . . . . . . . . 1.3 Bases de Dados (Databases) . . . . . . . . . . 1.4 Tabelas . . . . . . . . . . . . . . . . . . . . . . 1.5 CRUD . . . . . . . . . . . . . . . . . . . . . . . 1.6 Chaves Primria e Estrangeira . . . . . . . . . 1.7 Exerccios de Fixao . . . . . . . . . . . . . . ADO.NET 2.1 Driver . . . . . . . . . . . . . 2.2 ODBC . . . . . . . . . . . . . 2.3 ODBC Manager . . . . . . . 2.4 Criando uma conexo . . . . 2.5 Inserindo registros . . . . . . 2.6 Exerccios de Fixao . . . . 2.7 Exerccios Complementares 2.8 SQL Injection . . . . . . . . . 2.9 Exerccios de Fixao . . . . 2.10 Exerccios Complementares 2.11 Listando registros . . . . . . 2.12 Exerccios de Fixao . . . . 2.13 Exerccios Complementares 2.14 Connection Factory . . . . .www.k19.com.br

i 1 2 3 4 1 1 2 2 4 6 9 10 23 24 25 25 26 26 27 28 28 29 30 30 31 32 32i

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

2

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

S UMRIO

ii

2.15 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.16 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.17 Desaos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Entity Framework 3.1 Mltiplas sintaxes da linguagem SQL . . . . 3.2 Orientao a Objetos VS Modelo Relacional 3.3 Ferramentas ORM . . . . . . . . . . . . . . . 3.4 Congurao . . . . . . . . . . . . . . . . . . 3.5 Mapeamento . . . . . . . . . . . . . . . . . . 3.6 Manipulando entidades . . . . . . . . . . . 3.7 Exerccios de Fixao . . . . . . . . . . . . . 3.8 Repositrios . . . . . . . . . . . . . . . . . . 3.9 Exerccios de Fixao . . . . . . . . . . . . . Viso Geral do ASP .NET MVC 4.1 Necessidades de uma aplicao web 4.2 ASP .NET MVC . . . . . . . . . . . . . 4.3 MVC e Front Controller . . . . . . . . 4.4 Visual Web Developer . . . . . . . . . 4.5 Exemplo de uma Aplicao Web . . . 4.6 Exerccios de Fixao . . . . . . . . . 4.7 Integrao com Entity Framework . 4.8 Scaffold . . . . . . . . . . . . . . . . . 4.9 Exerccios de Fixao . . . . . . . . . Camada de Apresentao 5.1 Razor e ASPX . . . . . . . . . . . 5.2 Exerccios de Fixao . . . . . . 5.3 Exerccios Complementares . . 5.4 ViewBag e Strogly Typed Views 5.5 Exerccios de Fixao . . . . . . 5.6 HTML Helpers . . . . . . . . . . 5.7 Exerccios de Fixao . . . . . . 5.8 Layouts . . . . . . . . . . . . . . 5.9 Exerccios de Fixao . . . . . . 5.10 Partial views . . . . . . . . . . . 5.11 Exerccios de Fixao . . . . . . Camada de Controle 6.1 Actions . . . . . . . . 6.2 ActionResult . . . . . 6.3 Parmetros . . . . . . 6.4 Exerccios de Fixao 6.5 TempData . . . . . . . 6.6 Exerccios de Fixao

33 34 35 37 37 37 38 39 40 44 47 50 51 53 53 54 54 55 56 57 62 62 63 67 67 70 70 71 73 74 85 87 90 94 96 99 99 100 101 102 104 104

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

4

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

5

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

6

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

7

Rotas 107 7.1 Adicionando uma rota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 7.2 Adicionando Parmetros nas Rotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108www.k19.com.br

ii

iii

S UMRIO

7.3 8

Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 111 111 112 113 114 115 116 119 119 119 120 121

Validao 8.1 Controller . . . . . . . . . . . 8.2 View . . . . . . . . . . . . . . 8.3 Exerccios de Fixao . . . . 8.4 Anotaes . . . . . . . . . . . 8.5 Validao no lado do Cliente 8.6 Exerccios de Fixao . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

9

Sesso 9.1 Identicando os navegadores 9.2 Sesses no ASP .NET MVC . . . 9.3 Session Mode . . . . . . . . . . 9.4 Exerccios de Fixao . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

10 Autenticao 125 10.1 Filtro de Autenticao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 10.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 11 Tratamento de Erros 11.1 Try-Catch . . . . . . . 11.2 Custom Errors . . . . 11.3 Http Errors . . . . . . 11.4 Exerccios de Fixao A ASP.NET Web API A.1 REST . . . . . . . . . . A.2 Resources . . . . . . . A.3 URIs . . . . . . . . . . A.4 Operaes . . . . . . A.5 Media Type . . . . . . A.6 Exerccios de Fixao 131 132 133 133 134 139 139 140 140 141 142 142

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

B Migrations 147 B.1 Passo a Passo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 B.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 C Projeto C.1 Modelo . . . . . . . . . . . . . . . C.2 Exerccios de Fixao . . . . . . . C.3 Persistncia - Mapeamento . . . C.4 Exerccios de Fixao . . . . . . . C.5 Persistncia - Congurao . . . C.6 Exerccios de Fixao . . . . . . . C.7 Persistncia - Repositrios . . . . C.8 Exerccios de Fixao . . . . . . . C.9 Exerccios de Fixao . . . . . . . C.10 Apresentao - Template . . . . . C.11 Exerccios de Fixao . . . . . . . C.12 Cadastrando e Listando Seleeswww.k19.com.br

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

161 161 161 162 162 163 163 163 163 165 166 166 169iii

S UMRIO

iv

C.13 C.14 C.15 C.16 C.17 C.18 C.19 C.20 C.21 C.22 C.23 C.24 C.25 C.26 C.27

Exerccios de Fixao . . . . . . . . . . . . . . . . Removendo Selees . . . . . . . . . . . . . . . . Exerccios de Fixao . . . . . . . . . . . . . . . . Cadastrando, Listando e Removendo Jogadores Exerccios de Fixao . . . . . . . . . . . . . . . . Removendo Jogadores . . . . . . . . . . . . . . . Exerccios de Fixao . . . . . . . . . . . . . . . . Membership e Autorizao . . . . . . . . . . . . . Exerccios de Fixao . . . . . . . . . . . . . . . . Exerccios de Fixao . . . . . . . . . . . . . . . . Exerccios de Fixao . . . . . . . . . . . . . . . . Controle de Erro . . . . . . . . . . . . . . . . . . . Exerccios de Fixao . . . . . . . . . . . . . . . . Enviando email . . . . . . . . . . . . . . . . . . . Exerccios de Fixao . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

169 172 172 174 174 177 177 180 180 188 188 189 189 190 190 193

D Respostas

iv

www.k19.com.br

1

S UMRIO

Sobre a K19A K19 uma empresa especializada na capacitao de desenvolvedores de software. Sua equipe composta por prossionais formados em Cincia da Computao pela Universidade de So Paulo (USP) e que possuem vasta experincia em treinamento de prossionais para rea de TI. O principal objetivo da K19 oferecer treinamentos de mxima qualidade e relacionados s principais tecnologias utilizadas pelas empresas. Atravs desses treinamentos, seus alunos se tornam capacitados para atuar no mercado de trabalho. Visando a mxima qualidade, a K19 mantm as suas apostilas em constante renovao e melhoria, oferece instalaes fsicas apropriadas para o ensino e seus instrutores esto sempre atualizados didtica e tecnicamente.

www.k19.com.br

1

S UMRIO

2

Seguro TreinamentoNa K19 o aluno faz o curso quantas vezes quiser! Comprometida com o aprendizado e com a satisfao dos seus alunos, a K19 a nica que possui o Seguro Treinamento. Ao contratar um curso, o aluno poder refaz-lo quantas vezes desejar mediante a disponibilidade de vagas e pagamento da franquia do Seguro Treinamento. As vagas no preenchidas at um dia antes do incio de uma turma da K19 sero destinadas ao alunos que desejam utilizar o Seguro Treinamento. O valor da franquia para utilizar o Seguro Treinamento 10% do valor total do curso.

2

www.k19.com.br

3

S UMRIO

Termo de UsoTermo de UsoTodo o contedo desta apostila propriedade da K19 Treinamentos. A apostila pode ser utilizada livremente para estudo pessoal . Alm disso, este material didtico pode ser utilizado como material de apoio em cursos de ensino superior desde que a instituio correspondente seja reconhecida pelo MEC (Ministrio da Educao) e que a K19 seja citada explicitamente como proprietria do material. proibida qualquer utilizao desse material que no se enquadre nas condies acima sem o prvio consentimento formal, por escrito, da K19 Treinamentos. O uso indevido est sujeito s medidas legais cabveis.

www.k19.com.br

3

S UMRIO

4

TR

S TO EN AM EIN TREINAMENTOS TR EIN AM EN TO S

Conhea os nossos cursosK01- Lgica de Programao

K11 - Orientao a Objetos em Java

K12 - Desenvolvimento Web com JSF2 e JPA2

K21 - Persistncia com JPA2 e Hibernate

K22 - Desenvolvimento Web Avanado com JFS2, EJB3.1 e CDI

K23 - Integrao de Sistemas com Webservices, JMS e EJB

K31 - C# e Orientao a Objetos

K32 - Desenvolvimento Web com ASP.NET MVC

www.k19.com.br/cursos

4

www.k19.com.br

CAPTULO

B ANCO DE D ADOS

1

Em geral, as aplicaes necessitam armazenar dados de forma persistente para consult-los posteriormente. Por exemplo, a aplicao de uma livraria precisa armazenar os dados dos livros e dos autores de forma persistente. Suponha que esses dados sejam armazenados em arquivos do sistema operacional. Vrios fatores importantes nos levam a descartar tal opo. A seguir, apresentamos as principais diculdades a serem consideradas na persistncia de dados.

Segurana: O acesso s informaes potencialmente condenciais deve ser controlado de forma que apenas usurios e sistemas autorizados possam manipul-las. Integridade: Restries relacionadas aos dados armazenados devem ser respeitadas para que as informaes estejam sempre consistentes. Consulta: O tempo gasto para realizar as consultas aos dados armazenados deve ser o menor possvel. Concorrncia: Em geral, diversos sistemas e usurios acessaro concorrentemente as informaes armazenadas. Apesar disso, a integridade dos dados deve ser preservada.

Considerando todos esses aspectos, conclumos que um sistema complexo seria necessrio para persistir as informaes de uma aplicao de maneira adequada. Felizmente, tal tipo de sistema j existe e conhecido como Sistema Gerenciador de Banco de Dados (SGBD).

Figura 1.1: Sistema Gerenciador de Banco de Dados

Sistemas Gerenciadores de Banco de DadosNo mercado, h diversas opes de sistemas gerenciadores de banco de dados. Os mais populares so: Oracle Database SQL Serverwww.k19.com.br

1

B ANCO DE D ADOS

2

MySQL Server

PostgreSQL

SQL ServerNeste treinamento, utilizaremos o SQL Server Express, que mantido pela Microsoft. O SQL Server Express pode ser obtido a partir do site:

http://www.microsoft.com/express/Database/.

Microsoft SQL Server Management Studio Express

Para interagir com o SQL Server Express, utilizaremos um cliente com interface grca chamado de Microsoft SQL Server Management Studio Express.

Bases de Dados (Databases)Um sistema gerenciador de banco de dados capaz de gerenciar informaes de diversos sistemas ao mesmo tempo. Por exemplo, as informaes dos clientes de um banco, alm dos produtos de uma loja virtual ou dos livros de uma livraria. Suponha que os dados fossem mantidos sem nenhuma separao lgica. Implementar regras de segurana especcas seria extremamente complexo. Tais regras criam restries quanto ao contedo que pode ser acessado por cada usurio. Por exemplo, determinado usurio poderia ter permisso de acesso aos dados dos clientes do banco, mas no s informaes dos produtos da loja virtual, ou dos livros da livraria. Para obter uma organizao melhor, os dados so armazenados separadamente em um SGDB. Da surge o conceito de base de dados (database). Uma base de dados um agrupamento lgico das informaes de um determinado domnio.

Criando uma base de dados no SQL Server Express

Para criar uma base de dados no SQL Server Express, utilizamos o comando CREATE DATABASE.2www.k19.com.br

3

B ANCO DE D ADOS

www.k19.com.br

3

B ANCO DE D ADOS

4

Repare que alm da base de dados livraria h outras bases. Essas bases foram criadas automaticamente pelo prprio SQL Server Express para teste ou para guardar algumas conguraes. Quando uma base de dados no mais necessria, ela pode ser removida atravs do comando DROP DATABASE.

TabelasUm servidor de banco de dados dividido em bases de dados com o intuito de separar as informaes de domnios diferentes. Nessa mesma linha de raciocnio, podemos dividir os dados de uma base a m de agrup-los segundo as suas correlaes. Essa separao feita atravs de tabelas. Por exemplo, no sistema de um banco, interessante separar o saldo e o limite de uma conta, do nome e CPF de um cliente. Ento, poderamos criar uma tabela para os dados relacionados s contas e outra para os dados relacionados aos clientes. Cliente idade cpf 27 31875638735 32 30045667856 Conta saldo 1000 2000

nome Jos Maria

numero 1 2

limite 500 700

Tabela 1.1: Tabelas para armazenar os dados relacionados aos clientes e s contas

Uma tabela formada por registros (linhas) e os registros so formados por campos (colunas). Por exemplo, considere uma tabela para armazenar as informaes dos clientes de um banco. Cada registro dessa tabela armazena em seus campos os dados de um determinado cliente.

Criando tabelas no SQL Server ExpressAs tabelas no SQL Server Express so criadas atravs do comando CREATE TABLE. Na criao de uma tabela necessrio denir quais so os nomes e os tipos das colunas.

4

www.k19.com.br

5

B ANCO DE D ADOS

www.k19.com.br

5

B ANCO DE D ADOS

6

No SQL Server os nomes das tabelas so precedidas pelo ID do usurio que possui a tabela. No caso do usurio sa, o ID dbo. Portanto o nome da tabela Livros ca dbo.Livros. Se uma tabela no for mais desejada ela pode ser removida atravs do comando DROP TABLE.

CRUDAs operaes bsicas para manipular os dados persistidos so: inserir, ler, alterar e remover. Essas operaes so realizadas atravs de uma linguagem de consulta denominada SQL (Structured Query Language). Essa linguagem oferece quatro comandos bsicos: INSERT, SELECT, UPDATE6www.k19.com.br

7

B ANCO DE D ADOS

e DELETE. Esses comandos so utilizados para inserir, ler, alterar e remover registros, respectivamente.

www.k19.com.br

7

B ANCO DE D ADOS

8

8

www.k19.com.br

9

B ANCO DE D ADOS

Chaves Primria e EstrangeiraSuponha que os livros da nossa livraria sejam classicados por editoras. As editoras possuem nome e telefone. Para armazenar esses dados, uma nova tabela deveria ser criada. Nesse momento, teramos duas tabelas (Livro e Editora). Constantemente, a aplicao da livraria dever descobrir qual a editora de um determinado livro ou quais so os livros de uma determinada editora. Para isso, os registros da tabela Editora devem estar relacionados aos da tabela Livro. Na tabela Livro, poderamos adicionar uma coluna para armazenar o nome da editora dos livros. Dessa forma, se algum quiser recuperar as informaes da editora de um determinado livro, devewww.k19.com.br

9

B ANCO DE D ADOS

10

consultar a tabela Livro para obter o nome da editora correspondente. Depois, com esse nome, deve consultar a tabela Editora para obter as informaes da editora. Porm, h um problema nessa abordagem. A tabela Editora aceita duas editoras com o mesmo nome. Dessa forma, eventualmente, no conseguiramos descobrir os dados corretos da editora de um determinado livro. Para resolver esse problema, deveramos criar uma restrio na tabela Editora que proba a insero de editoras com o mesmo nome. Para resolver esse problema no SQL Server Express, poderamos adicionar a propriedade UNIQUE no campo nome da tabela Editora. Porm, ainda teramos mais um problema. Na tabela Livro, poderamos adicionar registros vinculados a editoras inexistentes, pois no h nenhuma relao explcita entre as tabelas. Para solucionar esses problemas, devemos utilizar o conceito de chave primria e chave estrangeira. Toda tabela pode ter uma chave primria, que um conjunto de um ou mais campos que devem ser nicos para cada registro. Normalmente, um campo numrico escolhido para ser a chave primria de uma tabela, pois as consultas podem ser realizadas com melhor desempenho. Ento, poderamos adicionar um campo numrico na tabela Editora e torn-lo chave primria. Vamos chamar esse campo de id. Na tabela Livro, podemos adicionar um campo numrico chamado editora_id que deve ser utilizado para guardar o valor da chave primria da editora correspondente ao livro. Alm disso, o campo editora_id deve estar explicitamente vinculado com o campo id da tabela Editora. Para estabelecer esse vnculo, o campo editora_id da tabela Livro deve ser uma chave estrangeira associada chave primria da tabela Editora. Uma chave estrangeira um conjunto de uma ou mais colunas de uma tabela que possuem valores iguais aos da chave primria de outra tabela. Com a denio da chave estrangeira, um livro no pode ser inserido com o valor do campo editora_id invlido. Caso tentssemos fazer isso, obteramos uma mensagem de erro.

Exerccios de FixaoAbra o Microsoft SQL Server Management Studio Express utilizando NOME_DA_MAQUINA SQLEXPRESS como Server Name, SQL Server Authentication como Authentication, sa como Login e sa como Password.1

10

www.k19.com.br

112

B ANCO DE D ADOS

Caso exista uma base de dados chamada Livraria, remova-a conforme a gura abaixo:

Crie uma nova base de dados chamada livraria, conforme mostrado na gura abaixo. Voc vai utilizar esta base nos exerccios seguintes.3

www.k19.com.br

11

B ANCO DE D ADOS

12

4

Crie uma tabela chamada Editoras conforme as guras abaixo.www.k19.com.br

12

13

B ANCO DE D ADOS

Altere os campos para torn-los obrigatrios, NO permitindo que eles quem em branco NU LL.

Alm disso o campo Id deve ser uma chave primria.www.k19.com.br

13

B ANCO DE D ADOS

14

O campo Id dever ser incrementado automaticamente. Dena ele com a propriedade Identity segundo a gura abaixo:

14

www.k19.com.br

155

B ANCO DE D ADOS

Crie uma tabela chamada Livros conforme as guras abaixo:

Lembrando de NO marcar a opo ALLOW NULL. Alm disso o campo Id deve ser uma chave primria e automaticamente incrementada. Voc precisa tornar o campo EditoraId uma chave estrangeira. Clique com o boto direito sobre a coluna EditoraId e selecione a opo Relantioships..., conforme a gura abaixo:www.k19.com.br

15

B ANCO DE D ADOS

16

Devemos acrescentar o relacionamento entre livro e editora. Clique em Add e posteriormente no boto direita na linha Tables and Columns Specication.

Devemos informar qual a chave primria que a coluna EditoraId da tabela Livros faz referncia.16www.k19.com.br

17

B ANCO DE D ADOS

Para isto, informe a tabela Editoras como Primary Key Table e indique a coluna Id como a chave primria referenciada. Selecione a coluna EditoraId como a coluna que ir fazer referncia a chave primria da tabela Editoras.

6

Adicione alguns registros na tabela Editoras. Veja exemplos na gura abaixo:

Adicione alguns registros na tabela Livros. Veja exemplos na gura abaixo:www.k19.com.br

17

B ANCO DE D ADOS

18

Consulte os registros da tabela Editoras, e em seguida consulte a tabela Livros. Veja exemplos logo abaixo:7

18

www.k19.com.br

19

B ANCO DE D ADOS

8

Altere alguns dos registros da tabela Livros. Veja o exemplo abaixo:

9

Altere alguns dos registros da tabela Editoras. Veja o exemplo abaixo:www.k19.com.br

19

B ANCO DE D ADOS

20

10

Remova alguns registros da tabela Livros. Veja o exemplo abaixo:

Remova alguns registros da tabela Editoras. Preste ateno para no remover uma editora que tenha algum livro relacionado j adicionado no banco. Veja o exemplo abaixo:11

20

www.k19.com.br

21

B ANCO DE D ADOS

12 Faa uma consulta para buscar todos os livros de uma determinada editora. Veja um exemplo na gura abaixo:

www.k19.com.br

21

B ANCO DE D ADOS

22

22

www.k19.com.br

CAPTULOSELECT * FROM tbl_funcionarios WHERE nome LIKE %jonas%; INSERT INTO tbl_funcionarios (nome, codigo, salario) VALUES (Rafael, 1234, 1000);www.k19.com.br

ADO.NET

2

No captulo anterior, aprendemos que utilizar bancos de dados uma tima alternativa para armazenar os dados de uma aplicao. Entretanto, voc deve ter percebido que as interfaces disponveis para interagir com o SQL Server Express no podem ser utilizadas por qualquer pessoa. Para utiliz-las, necessrio conhecer a linguagem SQL e os conceitos do modelo relacional. Em geral, as interfaces dos outros SGDBs exigem os mesmos conhecimentos.

Figura 2.1: Usurios comuns no possuem conhecimento sobre SQL ou sobre o modelo relacional

Para resolver esse problema, podemos desenvolver aplicaes com interfaces que no exijam conhecimentos tcnicos de SQL ou do modelo relacional para serem utilizadas. Dessa forma, usurios comuns poderiam manipular as informaes do banco de dados atravs dessas aplicaes. Nessa abordagem, os usurios interagem com as aplicaes e as aplicaes interagem com os SGDBs.

Cadastro de Funcionrios Nome: Cdigo: Salrio:

Figura 2.2: Usurios comuns devem utilizar interfaces simples

www.k19.com.br

23

ADO.NET

24

DriverAs aplicaes interagem com os SGDBs atravs de troca de mensagens. Os SGDBs denem o formato das mensagens. Para no sobrecarregar o canal de comunicao entre as aplicaes e os SGDBs, as mensagens trocadas devem ocupar o menor espao possvel. Geralmente, protocolos binrios so mais apropriados para reduzir o tamanho das mensagens e consequentemente diminuir a carga do canal de comunicao. Por isso, os SGDBs utilizam protocolos binrios.rollback

getReference persist begin getTransaction commit

nd

10110 111000 10010

Figura 2.3: Diminuindo o tamanho das mensagens para no sobrecarregar o meio de comunicao

Mensagens binrias so facilmente interpretadas por computadores. Por outro lado, so complexas para um ser humano compreender. Dessa forma, o trabalho dos desenvolvedores seria muito complexo, aumentando o custo para o desenvolvimento e manuteno das aplicaes.

11 01 01 01 00 01 11 11 11 0 10 010 11 110 01 0 10 01 10 1 10 111 10 110 11 0 01 01 00 01 101 11 1 010 0

Figura 2.4: Mensagens binrias so altamente complexas para os seres humanos

Para resolver esse problema e facilitar o desenvolvimento das aplicaes, as empresas propriet24www.k19.com.br

1011010111 0010110001 1010111101 0111011100 0101101001 1101011101 0010110011

1011010111 0010110001 1010111101 0111011100 0101101001 1101011101 0010110011

25

ADO.NET

rias dos SGDBs, normalmente, desenvolvem e distribuem drivers de conexo. Um driver de conexo atua como um intermedirio entre as aplicaes e os SGDBs. Os drivers de conexo so tradutores de comandos escritos em uma determinada linguagem de programao para comandos denidos de acordo com o protocolo de um SGDB. Utilizando um driver de conexo, os desenvolvedores das aplicaes no manipulam diretamente as mensagens binrias trocadas entre as aplicaes e os SGDBs.

Mais SobreEm alguns casos, o protocolo binrio de um determinado SGDB fechado. Consequentemente, a nica maneira de se comunicar com ele atravs de um driver de conexo oferecido pelo fabricante desse SGDB.

ODBCSuponha que os proprietrios dos bancos de dados desenvolvessem os drivers de maneira totalmente independente. Consequentemente, cada driver teria sua prpria interface, ou seja, seu prprio conjunto de instrues. Dessa maneira, o desenvolvedor da aplicao precisa conhecer as instrues de cada um dos drivers dos respectivos bancos que ele for utilizar. Para facilitar o trabalho do desenvolvedor da aplicao, a Microsoft deniu uma especicao chamada ODBC (Open Database Connectivity) para padronizar a interface dos drivers de conexo. Assim, quando uma empresa proprietria de um banco de dados pretende desenvolver um driver, ela segue essa especicao com o intuito de populariz-lo. Os drivers de conexo que respeitam a especicao ODBC, ou seja, possuem um conjunto de comandos padronizados, so chamados de drivers de conexo ODBC.

ODBC ManagerPara que drivers ODBC possam ser instalados em uma mquina e as aplicaes consigam utiliz-los necessrio ter o ODBC Manager, que j vem instalado no Windows. O driver de conexo ODBC j est disponvel para utilizao, podemos consultar o ODBC Manager do Windows. O ODBC Manager pode ser executado atravs do item Ferramentas Administrativas do Painel de Controle.www.k19.com.br

25

ADO.NET

26

Criando uma conexoCom o driver de conexo ODBC instalado na mquina j possvel criar uma conexo com o banco de dados correspondente. O que necessrio para estabelecer uma conexo com o banco de dados? Escolher o driver de conexo; Denir a localizao do banco de dados; Informar o nome da base de dados; Ter um usurio e senha cadastrados no banco de dados. Todas essas informaes so denidas na chamada string de conexo.1 2 string stringDeConexao = @ " driver ={ SQL Server }; server = MARCELO - PC \ SQLEXPRESS ; database = livraria ; uid = sa ; pwd = sa ; " ;Cdigo C# 2.1: Denindo a string de conexo

Aps a denio da string de conexo, podemos utilizar a classe System.Data.Odbc.OdbcConnection do .NET Framework. Essa classe responsvel por criar conexes ODBC.1 OdbcConnection conexao = new OdbcConnection ( stringDeConexao ) ;Cdigo C# 2.2: Criando uma conexo ODBC

Inserindo registrosEstabelecida a conexo com o banco de dados, j podemos executar comandos. Por exemplo, possvel inserir registros nas tabelas. O primeiro passo para executar um comando deni-lo em linguagem SQL de acordo com a sintaxe do SGDB utilizado.26www.k19.com.br

271 2 string textoDoComando = @ " INSERT INTO Editoras ( Nome , Email ) VALUES ( Abril , abril@email . com ) ; " ;

ADO.NET

Mais SobreO caractere @ antes de um valor literal do tipo string indica que os caracteres dentro da string no devem ser processados como caracteres especiais.

Em seguida, devemos criar um objeto da classe System. Data.Odbc.OdbcCommand a partir do cdigo sql e da conexo previamente criados. O comando no executado quando os objetos dessa classe so instanciados.1 OdbcCommand comando = new OdbcCommand ( textoDoComando , conexao ) ;Cdigo C# 2.4: Criando um comando ODBC

Por m, o comando pode ser executado atravs do mtodo ExecuteNonQuery(). A conexo deve ser aberta antes de executar o comando.1 2 conexao . Open () ; comando . ExecuteNonQuery () ;

ImportanteA mesma conexo pode ser reaproveitada para executar vrias operaes. Quando no houver mais operaes a serem executadas, devemos nalizar a conexo ODBC atravs do mtodo Close(). Finalizar as conexes ODBC que no so mais necessrias importante pois libera recursos no SGBD.1 conexao . close () ;Cdigo C# 2.6: Finalizando uma conexo ODBC

Mais SobreEm C#, para evitar que o uma conexo no seja fechada aps a sua utilizao, podemos aplicar um bloco using.1 2 3 4 using ( OdbcConnection conexao = new OdbcConnection ( stringDeConexao ) ) { // utiliza a conexao }Cdigo C# 2.7: Utilizando um bloco using

No cdigo acima, quando o bloco using que est associado conexo ODBC terminar, automaticamente, essa conexo ser fechada.

Exerccios de Fixaowww.k19.com.br

27

ADO.NET

28

Crie um projeto do tipo Console Application no Microsoft Visual C# Express, chamado ODBC.1 2 Crie uma classe chamada InsereEditora no projeto ODBC para inserir registros na tabela Editoras.

1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3

using System . Data . Odbc ; namespace Odbc { class InsereEditora { static void Main ( string [] args ) { string stringDeConexao = @ " driver ={ SQL Server }; server = MARCELO - PC \ SQLEXPRESS ; database = livraria ; uid = sa ; pwd = sa ; " ; System . Console . Write ( " Digite o Nome da Editora : " ) ; string nome = System . Console . ReadLine () ; System . Console . Write ( " Digite o Email da Editora : " ) ; string email = System . Console . ReadLine () ; string textoInsereEditora = @ " INSERT INTO Editoras ( Nome , Email ) VALUES ( " + nome + @ " , " + email + @ " ) " ; using ( OdbcConnection conexao = new OdbcConnection ( stringDeConexao ) ) { OdbcCommand command = new OdbcCommand ( textoInsereEditora , conexao ) ; conexao . Open () ; command . ExecuteNonQuery () ; } } } }Cdigo C# 2.8: InsereEditora.cs

Exerccios Complementares1

Crie uma classe chamada InsereLivro no projeto ODBC para inserir registros na tabela Livros.

SQL InjectionA implementao da insero de registros feita anteriormente possui uma falha grave. Os dados obtidos do usurio atravs do teclado no so tratados antes de serem enviados para o SGDB. Esses dados podem conter caracteres especiais. Se esses caracteres no so tratados, o comportamento esperado da operao afetado. Eventualmente, registros no so inseridos como deveriam ou brechas de segurana podem se abrir. Por exemplo, considere a classe InsereEditora do exerccio de xao. Se o usurio digitar OReilly e [email protected], o cdigo SQL gerado pela aplicao seria:1 INSERT INTO Editoras ( nome , email ) VALUES ( O Reilly , oreilly@email . com )

28

www.k19.com.br

29

ADO.NET

Observe que o caractere aspas simples aparece cinco vezes no cdigo SQL acima. O SGDB no saberia dizer onde de fato termina o nome da editora. Ao tentar executar esse cdigo, um erro de sintaxe lanado pelo SQL Server. Para resolver esse problema manualmente, devemos adicionar dois caracteres seguidos.1 INSERT INTO Editoras ( nome , email ) VALUES ( O Reilly , oreilly@email . com )

Os valores recebidos dos usurios devem ser analisados e os caracteres especiais contidos nesses valores devem ser tratados. Esse processo extremamente trabalhoso, pois o conjunto de caracteres especiais e a forma de trat-los diferente em cada SGDB. A responsabilidade do tratamento dos caracteres especiais contidos nos valores de entrada dos usurios pode ser repassada para os drivers ODBC. Dessa forma, o cdigo das aplicaes se torna independente das particularidades desse processo para cada SGDB.

Mais SobreO processo de tratamento dos caracteres especiais das entradas dos usurios denominado sanitize.

1 2 3 4 5 6 7 8 9 1 11 12 13 14

// pegando os dados da editora pelo teclado string nome = System . Console . ReadLine () ; string email = System . Console . ReadLine () ; // definindo a sentena SQL com parmetros string textoDoComando = @ " INSERT INTO Editoras ( Nome , Email ) VALUES (? , ?) ; " ; // criando um comando odbc OdbcCommand comando = new OdbcCommand ( textoDoComando , conexao ) ; // atribuindo valores aos parmetros comando . Parameters . AddWithValue ( " @Nome " , nome ) ; comando . Parameters . AddWithValue ( " @Email " , email ) ;Cdigo C# 2.12: Sanitizando as entradas dos usurios

Observe que a sentena SQL foi denida com parmetros atravs do caractere ?. Antes de executar o comando, necessrio atribuir valores aos parmetros. Isso feito com o mtodo AddWithValue(). Esse mtodo realiza a tarefa de sanitizar os valores enviados pelo usurio.

Exerccios de FixaoTente causar um erro de SQL Injection ao inserir editoras com a classe InsereEditora. (Dica: tente entradas com aspas simples)3

Altere o cdigo da classe InsereEditora para eliminar o problema do SQL Injection. Observe o cdigo abaixo:4

1 2 3 4 5

using System . Data . Odbc ; namespace Odbc { class InsereEditora

www.k19.com.br

29

ADO.NET6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31 32 33 { static void Main ( string [] args ) { string stringDeConexao = @ " driver ={ SQL Server }; server = MARCELO - PC \ SQLEXPRESS ; database = livraria ; uid = sa ; pwd = sa ; " ; System . Console . Write ( " Digite o Nome da Editora : " ) ; string nome = System . Console . ReadLine () ; System . Console . Write ( " Digite o Email da Editora : " ) ; string email = System . Console . ReadLine () ; string textoInsereEditora = @ " INSERT INTO Editoras ( Nome , Email ) VALUES (? ,?) " ; using ( OdbcConnection conexao = new OdbcConnection ( stringDeConexao ) ) { OdbcCommand command = new OdbcCommand ( textoInsereEditora , conexao ) ; command . Parameters . AddWithValue ( " @Nome " , nome ) ; command . Parameters . AddWithValue ( " @Email " , email ) ; conexao . Open () ; command . ExecuteNonQuery () ; } } } }Cdigo C# 2.13: InsereEditora.cs

30

5

Agora tente causar novamente o problema de SQL Injection ao inserir novas editoras.

Exerccios ComplementaresProvoque um erro de SQL Injection na classe InsereLivro. (Dica: tente entradas com aspas simples.)2 3 4

Altere o cdigo para eliminar o problema do SQL Injection. Agora tente causar novamente o problema de SQL Injection ao inserir novos livros.

Listando registrosDepois de inserir alguns registros, interessante consultar os dados das tabelas para conferir se a insero foi realizada com sucesso. O processo para executar um comando de consulta parecido com o de insero. necessrio denir a sentena SQL e criar um objeto da classe OdbcCommand.1 2 3 4 5 // definindo a sentena SQL string textoDoComando = @ " SELECT * FROM Editoras ; " ; // criando um comando odbc OdbcCommand comando = new OdbcCommand ( textoDoComando , conexao ) ;Cdigo C# 2.15: Criando um comando de seleo

A diferena que para executar um comando de consulta necessrio utilizar o mtodo Execu30www.k19.com.br

31

ADO.NET

teReader() ao invs do ExecuteNonQuery(). Esse mtodo devolve um objeto da classe System.Data.Odbc.OdbcDataReader.1 OdbcDataReader resultado = comando . ExecuteReader () ;Cdigo C# 2.16: Executando um comando de consulta

Os dados contidos no OdbcDataReader podem ser acessados atravs dos nomes das colunas.1 2 string nome = resultado [ " Nome " ] as string ; string email = resultado [ " Email " ] as string ;Cdigo C# 2.17: Recuperando os campos do primeiro registro do resultado

O cdigo acima mostra como os campos do primeiro registro do resultado da consulta so recuperados. Agora, para recuperar os outros registros necessrio avanar o OdbcDataReader atravs do mtodo Read().1 2 3 4 5 6 7 string nome1 = resultado [ " nome " ] as string ; string email1 = resultado [ " email " ] as string ; resultado . Read () ; string nome2 = resultado [ " nome " ] as string ; string email2 = resultado [ " email " ] as string ;Cdigo C# 2.18: Recuperando os campos dos dois primeiros registros do resultado

O prprio mtodo Read() devolve um valor booleano para indicar se o reader conseguiu avanar para o prximo registro. Quando esse mtodo devolver false signica que no h mais registros para serem recuperados.1 2 3 4 5 while ( resultado . Read () ) { string nome = resultado [ " nome " ] as string ; string email = resultado [ " email " ] as string ; }Cdigo C# 2.19: Recuperando os campos de todos os registros do resultado

Exerccios de FixaoInsira algumas editoras utilizando a classe InsereEditora que voc criou nos exerccios anteriores.6

Adicione uma nova classe ao projeto ODBC chamada ListaEditora. O objetivo listar as editoras que foram salvas no banco. Veja o cdigo dessa classe.7

1 2 3 4 5 6 7 8

using System . Data . Odbc ; namespace Odbc { class ListaEditora { static void Main ( string [] args ) {

www.k19.com.br

31

ADO.NET9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 string stringDeConexao = @ " driver ={ SQL Server }; server = MARCELO - PC \ SQLEXPRESS ; database = livraria ; uid = sa ; pwd = sa ; " ; using ( OdbcConnection conexao = new OdbcConnection ( stringDeConexao ) ) { string textoListaEditora = " SELECT * FROM Editoras " ; OdbcCommand command = new OdbcCommand ( textoListaEditora , conexao ) ; conexao . Open () ; OdbcDataReader resultado = command . ExecuteReader () ; while ( resultado . Read () ) { long ? id = resultado [ " Id " ] as long ?; string nome = resultado [ " Nome " ] as string ; string email = resultado [ " Email " ] as string ; System . Console . WriteLine ( " { } : {1} - {2}\ n " ,id , nome , email ) ; } } } } }Cdigo C# 2.20: ListaEditora.cs

32

Exerccios Complementares5

Crie uma classe para listar os livros cadastrados na base de dados.

Connection FactoryVoc deve ter percebido que para cada ao executada no banco de dados, ns precisamos criar uma conexo. Isso gera um problema relacionado string de conexo car armazenada em diversos locais. Imagine que o driver do banco foi atualizado e mudamos a sua verso. Isso implicaria fazer diversas alteraes no cdigo em cada ocorrncia da string de conexo, tornando o cdigo mais suscetvel a erros e dicultando a sua manuteno. Para resolver esta situao, ns poderamos criar uma classe responsvel pela criao e distribuio de conexes, mantendo assim uma nica referncia para a string de conexo, e qualquer alterao no modo em que nos conectamos base de dados, s implica mudanas nesta classe.1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 static class ConnectionFactory { public static OdbcConnection CreateConnection () { string driver = @ " SQL Server " ; string servidor = @ " MARCELO - PC \ SQLEXPRESS " ; string baseDeDados = @ " livraria " ; string usuario = @ " sa " ; string senha = @ " sa " ; StringBuilder connectionString = new StringBuilder () ; connectionString . Append ( " driver = " ) ; connectionString . Append ( driver ) ; connectionString . Append ( " ; server = " ) ; connectionString . Append ( servidor ) ; connectionString . Append ( " ; database = " ) ; connectionString . Append ( baseDeDados ) ; connectionString . Append ( " ; uid = " ) ;

32

www.k19.com.br

3319 2 21 22 23 24 25 connectionString . Append ( usuario ) ; connectionString . Append ( " ; pwd = " ) ; connectionString . Append ( senha ) ; return new OdbcConnection ( connectionString . ToString () ) ; } }Cdigo C# 2.22: ConnectionFactory.cs

ADO.NET

Agora podemos obter uma nova conexo apenas chamando ConnectionFactory.CreateConnection(). O resto do sistema no precisa mais conhecer os detalhes sobre a conexo com o banco de dados, diminuindo o acoplamento da aplicao.

Exerccios de Fixao8

Adicione uma nova classe chamada ConnectionFactory com seguinte cdigo:using System ; using System . Data . Odbc ; using System . Text ; namespace Odbc { static class ConnectionFactory { public static OdbcConnection CreateConnection () { string driver = @ " SQL Server " ; string servidor = @ " MARCELO - PC \ SQLEXPRESS " ; string baseDeDados = @ " livraria " ; string usuario = @ " sa " ; string senha = @ " sa " ; StringBuilder connectionString = new StringBuilder () ; connectionString . Append ( " driver = " ) ; connectionString . Append ( driver ) ; connectionString . Append ( " ; server = " ) ; connectionString . Append ( servidor ) ; connectionString . Append ( " ; database = " ) ; connectionString . Append ( baseDeDados ) ; connectionString . Append ( " ; uid = " ) ; connectionString . Append ( usuario ) ; connectionString . Append ( " ; pwd = " ) ; connectionString . Append ( senha ) ; return new OdbcConnection ( connectionString . ToString () ) ; } } }Cdigo C# 2.23: ConnectionFactory.cs

1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31 32

Altere as classes InsereEditora e ListaEditora para que elas utilizem a fbrica de conexo. Execute-as novamente.9

1 2 3 4 5 6

using System . Data . Odbc ; namespace Odbc { class InsereEditora {

www.k19.com.br

33

ADO.NET7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 static void Main ( string [] args ) { System . Console . Write ( " Digite o Nome da Editora : " ) ; string nome = System . Console . ReadLine () ; System . Console . Write ( " Digite o Email da Editora : " ) ; string email = System . Console . ReadLine () ; string textoInsereEditora = @ " INSERT INTO Editoras ( Nome , Email ) VALUES (? ,?) " ; using ( OdbcConnection conexao = ConnectionFactory . CreateConnection () ) { OdbcCommand command = new OdbcCommand ( textoInsereEditora , conexao ) ; command . Parameters . AddWithValue ( " @Nome " , nome ) ; command . Parameters . AddWithValue ( " @Email " , email ) ; conexao . Open () ; command . ExecuteNonQuery () ; } } } }

34

Cdigo C# 2.24: InsereEditora.cs

1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26

using System . Data . Odbc ; namespace Odbc { class ListaEditora { static void Main ( string [] args ) { using ( OdbcConnection conexao = ConnectionFactory . CreateConnection () ) { string textoListaEditora = " SELECT * FROM Editoras " ; OdbcCommand command = new OdbcCommand ( textoListaEditora , conexao ) ; conexao . Open () ; OdbcDataReader resultado = command . ExecuteReader () ; while ( resultado . Read () ) { long ? id = resultado [ " Id " ] as long ?; string nome = resultado [ " Nome " ] as string ; string email = resultado [ " Email " ] as string ; System . Console . WriteLine ( " { } : {1} - {2}\ n " ,id , nome , email ) ; } } } } }

Cdigo C# 2.25: ListaEditora.cs

Exerccios ComplementaresAltere as classes InsereLivro e ListaLivro para que elas utilizem a fbrica de conexo. Executeas novamente.6

34

www.k19.com.br

35

ADO.NET

Desaos1 2

Implemente um teste que remove uma editora pelo id. Implemente um teste que altera os dados de uma editora pelo id.

www.k19.com.br

35

ADO.NET

36

36

www.k19.com.br

CAPTULODriver Oracle ODBC Driver SQL Server ODBC

E NTITY F RAMEWORK

3

Mltiplas sintaxes da linguagem SQLNo captulo anterior, utilizamos conexes ODBC para fazer uma aplicao C# interagir com os SGDBs. Nessa interao, as consultas so denidas com a linguagem SQL. A sintaxe dessa linguagem diferente em cada SGDB. Dessa forma, a complexidade do trabalho dos desenvolvedores aumenta. Para resolver esse problema, as consultas deveriam ser denidas atravs de um mecanismo independente da linguagem SQL.

SELECT TOP 100 * FROM livros ORDER BY autor ASC

SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY autor ASC) AS rownumber, id, titulo, autor FROM livros ) WHERE rownumber < connectionStrings > < add name = " K19Context " providerName = " System . Data . SqlClient " connectionString = " Server =.\ SQLEXPRESS ; Database = k19db ; Trusted_Connection = false ; User Id = sa ; Password = sa ; Persist Security Info = true ; MultipleActiveResultSets = True " / > Cdigo XML 3.1: App.cong

www.k19.com.br

39

E NTITY F RAMEWORK

40

MapeamentoUm dos principais objetivos dos frameworks ORM estabelecer o mapeamento entre os conceitos do modelo orientado a objetos e os conceitos do modelo relacional. Este mapeamento pode ser denido atravs de um arquivo XML ou de maneira mais prtica com DbContext. Quando utilizamos DbContext, evitamos a criao de extensos arquivos XML. Considere as entidades Livro e Editora denidas abaixo.1 2 3 4 5 6 7 public class Livro { public int LivroId { get ; set ; } public string Titulo { get ; set ; } public decimal Preco { get ; set ; } public Editora Editora { get ; set ; } }Cdigo C# 3.1: Livro.cs

1 2 3 4 5 6 7

public class Editora { public int EditoraId { get ; set ; } public string Nome { get ; set ; } public string Email { get ; set ; } public ICollection < Livro > Livros { get ; set ; } }Cdigo C# 3.2: Editora.cs

Criaremos uma classe para ajudar a mapear essas entidades para o banco de dados. A classe

EditoraContext deriva de DbContext, que faz parte da biblioteca Code First:1 2 3 4 5 public class EditoraContext : DbContext { public DbSet < Editora > Editoras { get ; set ; } public DbSet < Livro > Livros { get ; set ; } }Cdigo C# 3.3: EditoraContext.cs

Utilizamos o recurso Code First do Entity Framework 4 para permitir a persistncia no banco de dados. Isto signica que as propriedades Editoras e Livros de EditoraContext sero mapeadas para tabelas com mesmo nome no banco de dados. Ou seja, a propriedade Editoras ser mapeada para uma tabela chamada Editoras e a propriedade Livros ser mapeada para uma tabela chamada Livros. Cada propriedade denida nas entidades Livro e Editora ser mapeada para uma coluna nas tabelas Livros e Editoras. Abaixo segue a denio da tabela Editoras que foi criada em nosso banco de dados:

40

www.k19.com.br

41

E NTITY F RAMEWORK

Abaixo segue a denio da tabela Livros que foi criada em nosso banco de dados:

Utilizando o Code First, no foi necessrio congurar nada para que a persistncia e o mapeamento fossem realizados. Isto ocorreu simplesmente escrevendo as trs classes acima. Nenhuma congurao a mais necessria. Podemos utilizar anotaes para sobrescrever o mapeamento padro. Para utilizar anotaes, precisamos adicionar como referncia as bibliotecas EntityFramework.dll e System.ComponentModel.DataAnnotations.dll ao projeto e acrescentar using para o namespace System.ComponentModel.DataAnnotations. A seguir descrevemos as principais anotaes. ColumnAttribute: Dene o nome e o tipo da coluna no banco de dados da propriedade mapeada.1 2 3 4 5 6 7 8 public class Livro { public int LivroId { get ; set ; } [ Column ( " NomeDoLivro " , TypeName = " varchar " ) ] public string Titulo { get ; set ; } public decimal Preco { get ; set ; } public Editora Editora { get ; set ; } }Cdigo C# 3.4: Livro.cs

DatabaseGeneratedAttribute: Utilizado para indicar que o valor do atributo gerado automaticamente pelo banco de dados. Para denir como o valor do atributo gerado, podemos utilizar trs constantes do enum DatabaseGenerateOption: DatabaseGeneratedOption.Identity: o valor de um atributo com a opo Identity deve ser gerado quando a instncia for salva (com a chamada de SaveChanges()) pela primeira vez. Alm disso, o banco de dados supe que esse valor no ser mais alterado. Portanto, no se deve modicar o valor desse atributo. DatabaseGeneratedOption.Computed: o valor de um atributo com a opo Computed gerado sempre que a instncia for salva. DatabaseGeneratedOption.None: o valor de um atributo com a opo None no ser gerado pelo banco de dados. ForeignKeyAttribute: Dene que o atributo ser mapeado para uma chave estrangeira.1 2 3 4 public class Livro { public int LivroId { get ; set ; } public string Titulo { get ; set ; }

www.k19.com.br

41

E NTITY F RAMEWORK5 6 7 8 9 public decimal Preco { get ; set ; } [ ForeignKey ( " Editora " ) ] public int EditoraId { get ; set ; } public Editora Editora { get ; set ; } }Cdigo C# 3.5: Livro.cs

42

1 2 3 4 5 6 7

public class Editora { public int EditoraId { get ; set ; } public string Nome { get ; set ; } public string Email { get ; set ; } public ICollection < Livro > Livros { get ; set ; } }Cdigo C# 3.6: Editora.cs

InversePropertyAttribute: Nos relacionamentos bidirecionais, utilizamos essa anotao para evitar o mapeamento de dois relacionamentos unidirecionais ao invs de um bidirecional. Por exemplo, considere as entidades Pessoa e Livro. Podemos estabelecer um relacionamento bidirecional entre essas entidades, pois uma pessoa pode escrever um livro.1 2 3 4 5 6 public class Pessoa { public int Id { get ; set ; } public string Nome { get ; set ; } public ICollection < Livro > LivrosPublicados { get ; set ; } }Cdigo C# 3.7: Pessoa.cs

1 2 3 4 5 6 7 8 9 1

public class Livro { public int LivroId { get ; set ; } public string Titulo { get ; set ; } public decimal Preco { get ; set ; } public Editora Editora { get ; set ; } [ InverseProperty ( " LivrosPublicados " ) ] public Pessoa Autor { get ; set ; } }Cdigo C# 3.8: Livro.cs

No cdigo acima, a propriedade Autor da classe Livro foi mapeada com a anotao InverseProperty para evitar que dois relacionamentos unidirecionais fossem estabelecidos entre Pessoa e Livro. KeyAttribute: Dene uma ou mais propriedades que identicam unicamente as instncias de uma entidade. Se a classe dene propriedades chamadas ID ou Id, ou com o nome da classe seguido por ID ou Id, esta propriedade tratada como chave primria por conveno. Caso contrrio, podemos denir a nossa chave primria com o KeyAttribute. No exemplo abaixo, denimos a propriedade Identificador para ser a chave primria correspondente entidade Pessoa.1 2 public class Pessoa {

42

www.k19.com.br

433 4 5 6 7 8 [ Key ] public public public public }Cdigo C# 3.9: Pessoa.cs

E NTITY F RAMEWORK

int Identificador { get ; set ; } string Nome { get ; set ; } ICollection < Livro > LivrosPublicados { get ; set ; } ICollection < Livro > LivrosRevisados { get ; set ; }

MaxLengthAttribute: Dene o tamanho mximo permitido para um array ou string. MinLengthAttribute: Dene o tamanho mnimo permitido para um array ou string.1 2 3 4 5 6 7 8 9 public class Pessoa { public int Id { get ; set ; } [ MinLength (1 , ErrorMessage = " Tamanho minimo : 1 " ) ] [ MaxLength (255 , ErrorMessage = " Tamanho mximo : 255 " ) ] public string Nome { get ; set ; } public ICollection < Livro > LivrosPublicados { get ; set ; } public ICollection < Livro > LivrosRevisados { get ; set ; } }Cdigo C# 3.10: Pessoa.cs

StringLengthAttribute: Dene os tamanhos mnimo e mximo permitido para o campo string.1 2 3 4 5 6 7 8 9 public class Editora { public int EditoraId { get ; set ; } [ StringLength (255 , MinimumLength =1 ) ] public string Nome { get ; set ; } public string Email { get ; set ; } public string ExtraInfo { get ; set ; } public ICollection < Livro > Livros { get ; set ; } }Cdigo C# 3.11: Editora.cs

NotMappedAttribute: Pode ser aplicado em classes ou propriedades. Indica que a classe ou propriedade anotada no deve ser mapeada para o banco de dados.1 2 3 4 5 6 7 8 9 public class Editora { public int EditoraId { get ; set ; } public string Nome { get ; set ; } public string Email { get ; set ; } [ NotMapped ] public string ExtraInfo { get ; set ; } public ICollection < Livro > Livros { get ; set ; } }Cdigo C# 3.12: Editora.cs

RequiredAttribute: Dene que o campo obrigatrio. Este atributo ignorado em propriedades do tipo collection. Quando denido numa referncia, indica que a cardinalidade 1 e a propriedade da chave estrangeira no-nula.1 2 3 4 public class Editora { public int EditoraId { get ; set ; } [ Required ]

www.k19.com.br

43

E NTITY F RAMEWORK5 6 7 8 9 public public public public }Cdigo C# 3.13: Editora.cs

44

string Nome { get ; set ; } string Email { get ; set ; } string ExtraInfo { get ; set ; } ICollection < Livro > Livros { get ; set ; }

TableAttribute: Dene a tabela para a qual a classe deve ser mapeada.1 2 3 4 5 6 7 8 9 1 [ Table ( " Livros " ) ] public class Livro { public int LivroId { get ; set ; } public string Titulo { get ; set ; } public decimal Preco { get ; set ; } public Editora Editora { get ; set ; } public Pessoa Autor { get ; set ; } public Pessoa Revisor { get ; set ; } }Cdigo C# 3.14: Livro.cs

Manipulando entidadesMostramos anteriormente que as entidades de uma aplicao so mapeadas atravs de uma classe que deriva de DbContext. Considere o seguinte exemplo. Suponha que as entidades da nossa aplicao foram mapeadas com a classe K19Context, que deriva de DbContext. As instncias das entidades da nossa aplicao sero administradas por objetos da classe K19Context. Esses objetos so responsveis pelas operaes de insero, remoo, alterao e consulta. Mostraremos a seguir as principais operaes que podem ser realizadas atravs de um DbContext.

PersistindoPara indicar que determinado objeto deve ser persistido no banco de dados, devemos utilizar o mtodo System.Data.Entity.DbSet.Add(), passando o objeto em questo como parmetro. O mtodo Add() adiciona o objeto ao contexto com o estado Added. Para armazenar de fato as informaes de um objeto no banco de dados, utilizamos o mtodo SaveChanges() do DbContext. Todos os objetos do contexto que estejam no estado Added so inseridos no banco de dados quando o mtodo SaveChanges() chamado.1 2 3 4 5 6 7 using ( var context = new EditoraContext () ) { Editora editora = new Editora { Nome = " K19 " , Email = " contato@k19 . com . br " }; // Adiciona a editora criada ao contexto com estado Added context . Editoras . Add ( editora ) ; context . SaveChanges () ; }Cdigo C# 3.15: Persistindo um objeto

44

www.k19.com.br

45

E NTITY F RAMEWORK

BuscandoPara obter um objeto que contenha informaes do banco de dados, basta utilizar o mtodo

Find() do DbSet. Podemos passar o identicador do objeto que desejamos recuperar como parmetro para esse mtodo.1 Editora editora = context . Editoras . Find (1) ;Cdigo C# 3.16: Buscando uma editora com o identicador 1

RemovendoPara indicar que determinado objeto deve ser removido, basta utilizar o mtodo System.Data.Entity.DbSet.Remove(). Esse mtodo marca o objeto para ser removido do banco de dados, colocando-o no estado Deleted. Quando o mtodo SaveChanges() chamado, todas os objetos no estado Deleted so removidos do banco de dados.1 2 3 Editora editora = context . Editoras . Find (1) ; context . Editoras . Remove ( editora ) ; context . SaveChanges () ;Cdigo C# 3.17: Removendo uma editora do banco de dados

AtualizandoPara alterar os dados de um registro correspondente a um objeto, basta utilizar as suas propriedades. Quando as propriedades de um objeto do contexto so alteradas, o estado Modied associado a este objeto. Objetos no estado Modified so atualizados no banco de dados quando o mtodo SaveChanges() chamado.1 2 3 Editora editora = context . Editoras . Find (1) ; editora . Nome = " Abril S / A " ; context . SaveChanges () ;Cdigo C# 3.18: Alterando o nome de uma editora

ListandoPara obter uma listagem com todos os objetos referentes aos registros de uma tabela, podemos utilizar o Language Integrated Query (LINQ), que nos permite escrever consultas dentro do cdigo C#.1 2 3 4 5 6 var consulta = from e in context . Editoras where e . Nome . Contains ( " A " ) select e ; // Equivalente a : SELECT * FROM Editoras e where e . Nome Like A % foreach ( var item in consulta )

www.k19.com.br

45

E NTITY F RAMEWORK7 8 9 { System . Console . WriteLine ( " Editora : " + item . Nome ) ; }Cdigo C# 3.19: Utilizando LINQ para fazer uma consulta

46

46

www.k19.com.br

47

E NTITY F RAMEWORK

Exerccios de FixaoCrie um projeto do tipo Console Application no Microsoft Visual C# Express, chamado EF4-Code-First.1 2

Adicione ao projeto as bibliotecas EntityFramework.dll e System.ComponentModel.Data-

Annotations.dll.

Figura 3.5: Adicionando uma referncia

Faa o download da biblioteca EntityFramework.dll no site da K19 (http://www.k19.com.br/ EntityFramework.dll) e ento adicione-a ao projeto:

Figura 3.6: Adicionando EntityFramework.dll ao projeto

www.k19.com.br

47

E NTITY F RAMEWORK

48

Adicione a biblioteca System.ComponentModel.DataAnnotations.dll ao projeto:

Figura 3.7: Adicionando System.ComponentModel.DataAnnotations.dll ao projeto

3

Dena uma classe Editora conforme cdigo abaixo:namespace EF4_Code_First { public class Editora { public int Id { get ; set ; } public string Nome { get ; set ; } public string Email { get ; set ; } } }Cdigo C# 3.20: Editora.cs

1 2 3 4 5 6 7 8 9

Dena uma classe LivrariaContext que derivada de DbContext. Nesta classe dena uma propriedade Editoras do tipo genrico DbSet.4

1 2 3 4 5 6 7 8 9

using System . Data . Entity ; namespace EF4_Code_First { public class LivrariaContext : DbContext { public DbSet < Editora > Editoras { get ; set ; } } }Cdigo C# 3.21: LivrariaContext.cs

5

Adicione o arquivo App.config e dena a string de conexo.www.k19.com.br

48

49

E NTITY F RAMEWORK

Figura 3.8: App.cong

1 2 3 4 5 6 7 8 9 1 11 12 13 14 15

< configuration > < connectionStrings > < add name = " LivrariaContext " providerName = " System . Data . SqlClient " connectionString = " Server =.\ SQLEXPRESS ; Database = efcodefirst ; Trusted_Connection = false ; User Id = sa ; Password = sa ; Persist Security Info = true ; MultipleActiveResultSets = True " / > Cdigo XHTML 3.1: Arquivo App.cong

6

Dena uma classe InsereEditora:using System ; namespace EF4_Code_First { public class InsereEditora { static void Main ( string [] args ) { using ( LivrariaContext db = new LivrariaContext () ) { Console . WriteLine ( " Digite o nome da Editora : " ) ; string nome = Console . ReadLine () ; Console . WriteLine ( " Digite o email da Editora : " ) ; string email = Console . ReadLine () ; Editora e = new Editora { Nome = nome , Email = email }; db . Editoras . Add ( e ) ;

1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16

www.k19.com.br

49

E NTITY F RAMEWORK17 18 19 2 21 db . SaveChanges () ; } } } }Cdigo C# 3.22: InsereEditora.cs

50

7

Dena a classe ListaEditoras:using System . Linq ; using System ; namespace EF4_Code_First { public class ListaEditoras { static void Main ( string [] args ) { using ( LivrariaContext db = new LivrariaContext () ) { var consulta = from e in db . Editoras select e ; foreach ( Editora editora in consulta ) { Console . WriteLine ( " { } - {1} {2} " , editora . Id , editora . Nome , editora . Email ) ; } } } } }Cdigo C# 3.23: classe ListaEditoras

1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21

RepositriosAs classes DbContext e DbSet do EF oferecem recursos sucientes para que os objetos do domnio sejam persistidos, recuperados, alterados e removidos do banco de dados. Porm, em aplicaes com alta complexidade e grande quantidade de cdigo, espalhar as chamadas aos mtodos do DbContext e DbSet pode gerar diculdades na manuteno e no entendimento do sistema. Para melhorar a organizao das nossas aplicaes, diminuindo o custo de manuteno e aumentando a legibilidade do cdigo, podemos aplicar o padro Repository do DDD (Domain Driven Design). Conceitualmente, um repositrio representa o conjunto de todos os objetos de um determinado tipo. Ele deve oferecer mtodos para administrar seus elementos. Os repositrios podem trabalhar com objetos prontos na memria ou reconstru-los com dados obtidos de um banco de dados. O acesso ao banco de dados pode ser realizado atravs de ferramenta ORM como o Entity Framework.1 2 3 4 5 6 7 using using using using System ; System . Collections . Generic ; System . Linq ; System . Data . Entity ;

namespace EF4_Code_First {

50

www.k19.com.br

518 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31 32 33 34 35 public class EditoraRepository { DbContext context ; public EditoraRepository ( DbContext context ) { this . context = context ; } public void Adiciona ( Editora e ) { context . Set < Editora >() . Add ( e ) ; context . SaveChanges () ; } public Editora Busca ( int id ) { return context . Set < Editora >() . Find ( id ) ; } public List < Editora > BuscaTodas () { var consulta = from e in context . Set < Editora >() select e ; return consulta . ToList () ; } } }Cdigo C# 3.24: EditoraRepository.cs

E NTITY F RAMEWORK

1 2 3 4 5

var context = new EditoraContext () ; EditoraRepository repository = new EditoraRepository ( context ) ; List < Editora > editoras = repository . BuscaTodas () ;Cdigo C# 3.25: Buscando todas as editoras armazenadas no banco de dados

Exerccios de Fixao8

Implemente um repositrio de editoras criando uma nova classe no projeto EF4-Code-First.using System ; using System . Linq ; using System . Collections . Generic ; namespace EF4_Code_First { public class EditoraRepository : IDisposable { private LivrariaContext db = new LivrariaContext () ; public void Adiciona ( Editora e ) { db . Editoras . Add ( e ) ; db . SaveChanges () ; } public Editora Busca ( int id ) { Editora e = db . Editoras . Find ( id ) ; return e ; }

1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21

www.k19.com.br

51

E NTITY F RAMEWORK22 23 24 25 26 27 28 29 3 31 32 33 34 35

52

public List < Editora > BuscaTodas () { var consulta = from e in db . Editoras select e ; return consulta . ToList () ; } public void Dispose () { db . Dispose () ; } } }Cdigo C# 3.26: EditoraRepository.cs

9

Altere a classe InsereEditora para que utilize o repositrio de editoras.using System ; namespace EF4_Code_First { public class InsereEditora { static void Main ( string [] args ) { using ( EditoraRepository repository = new EditoraRepository () ) { Console . WriteLine ( " Digite o nome da Editora : " ) ; string nome = Console . ReadLine () ; Console . WriteLine ( " Digite o email da Editora : " ) ; string email = Console . ReadLine () ; Editora e = new Editora { Nome = nome , Email = email }; repository . Adiciona ( e ) ; } } } }Cdigo C# 3.27: InsereEditora.cs

1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19

10

Altere a classe ListaEditoras para que utilize o repositrio de editoras.using System ; namespace EF4_Code_First { public class ListaEditoras { static void Main ( string [] args ) { using ( EditoraRepository repository = new EditoraRepository () ) { var consulta = repository . BuscaTodas () ; foreach ( Editora editora in consulta ) { Console . WriteLine ( " { } - {1} {2} " , editora . Id , editora . Nome , editora . Email ) ; } } } } }Cdigo C# 3.28: ListaEditoras.cs

1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18

52

www.k19.com.br

CAPTULO

V ISO G ERAL DO ASP.NET MVC

4

Necessidades de uma aplicao web

HTTP

Os usurios de uma aplicao web utilizam navegadores (browsers) para interagir com essa aplicao. A comunicao entre navegadores e uma aplicao web realizada atravs de requisies e respostas denidas pelo protocolo HTTP Dessa forma, os desenvolvedores de aplicaes web devem . estar preparados para trabalhar com o protocolo HTTP.

Acesso simultneo

Alm disso, na grande maioria dos casos, as aplicaes web devem ser acessadas por diversos usurios ao mesmo tempo. Consequentemente, os desenvolvedores web devem criar ou utilizar algum mecanismo eciente que permita esse tipo de acesso.

Contedo dinmico

As pginas de uma aplicao web devem ser geradas dinamicamente. Por exemplo, quando um usurio de uma aplicao de email acessa a sua caixa de entrada, ele deseja ver todos os emails enviados at aquele momento. A pgina contendo a lista de emails deve ser gerada novamente toda vez que essa pgina for requisitada. Consequentemente, os desenvolvedores web devem criar ou utilizar algum mecanismo eciente que permita que o contedo das pginas das aplicaes web seja gerado dinamicamente.www.k19.com.br

53

V ISO G ERAL DO ASP.NET MVC

54

Aplicao WebRequisio HTTP

TP

HT

o

qu

isi

Re

www.k19.com.br

www.k19.com.br

Cursos

Artigos

Apostilas

Figura 4.1: Necessidades de uma aplicao web

SoluoResolver os trs problemas apresentados tomaria boa parte do tempo de desenvolvimento, alm de exigir conhecimentos tcnicos extremamente especcos por parte dos desenvolvedores. Para facilitar o desenvolvimento de aplicaes web, a plataforma .NET soluciona esses problemas fundamentais. A plataforma .NET oferece os seguintes recursos fundamentais para o desenvolvimento de aplicaes web: Envio e recebimento de mensagens HTTP. Acesso simultneo das aplicaes por vrios usurios de uma maneira eciente. Gerao dinmica das pginas das aplicaes.

ASP .NET MVCAtualmente, o ASP .NET MVC o framework para desenvolvimento de aplicaes web na plataforma .NET em maior ascenso. A documentao desse framework pode ser obtida em http: //www.asp.net/mvc. O ASP.NET MVC fortemente baseado nos padres MVC e Front Controller.

MVC e Front ControllerO MVC (model-view-controller) um padro de arquitetura que tem por objetivo isolar a lgica de negcio da lgica de apresentao de uma aplicao.54www.k19.com.br

qu Re aH st TT Pwww.k19.com.br

isi Re o sp

o

HT

TPResposta HTTP

Re sp o st a HT TP

55

V ISO G ERAL DO ASP.NET MVC

Esse padro (ou alguma variao) amplamente adotado nas principais plataformas de desenvolvimento atuais. Em particular, ele bastante utilizado no desenvolvimento de aplicaes web. O padro MVC divide uma aplicao em trs tipos de componentes: modelo, viso e controlador.

Modelo: encapsula os dados e as funcionalidades da aplicao. Viso: responsvel pela exibio de informaes, cujos dados so obtidos do modelo. Controlador: recebe as requisies do usurio e aciona o modelo e/ou a viso.

Para mais detalhes sobre o padro MVC, uma boa referncia o livro Pattern-Oriented Software Architecture Volume 1: A System of Patterns (editora Wiley, 1996) dos autores Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, Michael Stal e Michael Stal. No padro Front Controller, todas as requisies do usurio so recebidas pelo mesmo componente. Dessa forma, tarefas que devem ser realizadas em todas as requisies podem ser implementadas por esse componente. Isso evita a repetio de cdigo e facilita a manuteno do sistema. Para mais informaes sobre esse padro, consulte, por exemplo, o livro Professional ASP .NET Design Patterns (editora Wrox, 720) de Scott Millett.

Visual Web DeveloperO primeiro passo para construir uma aplicao web utilizando ASP .NET MVC criar um projeto no Visual Web Developer a partir do modelo adequado. No nosso caso, o modelo de projeto que deve ser utilizado o ASP .NET MVC 4 Web Application.

Figura 4.2: Criando um projeto

www.k19.com.br

55

V ISO G ERAL DO ASP.NET MVC

56

Devemos escolher Basic Project conforme gura abaixo:

Figura 4.3: Criando um projeto

O projeto criado j vem com diversas pastas e arquivos. Ao longo dos prximos captulos, a funo de cada pasta e de cada arquivo ser discutida.

Testando a aplicaoPara vericar o funcionamento do projeto, basta execut-lo atravs do menu: Debug -> Start Debugging. Automaticamente um servidor de desenvolvimento inicializado na mquina e a aplicao implantada nesse servidor. Alm disso, uma janela do navegador padro do sistema aberta na url principal da aplicao. O servidor pode ser nalizado atravs do cone ASP .NET Development Server que ca na barra de tarefas do Windows.

Trocando a porta do servidorPara trocar a porta utilizada pelo servidor de desenvolvimento que o Visual Web Developer utiliza, basta alterar as propriedades do projeto clicando com o boto direito do mouse no projeto e escolhendo o item properties e depois a aba web.

Exemplo de uma Aplicao Web56www.k19.com.br

57

V ISO G ERAL DO ASP.NET MVC

Veremos a seguir um exemplo de uma simples aplicao web em ASP.NET MVC. Essa aplicao ter apenas uma pgina web que mostrar o nmero de acessos essa pgina at o momento. Primeiramente, criaremos uma classe na camada de controle da aplicao para armazenar esse nmero. As classes que denem controladores devem derivar da classe Controller e seus nomes devem terminar com a palavra Controller. Alm disso, essas classes devem estar na pasta Controllers da aplicao. Considere a classe K19Controller denida abaixo.1 2 3 4 5 6 7 8 9 1 11 public class K19Controller : Controller { private static int NumeroDeAcessos { get ; set ; } public ActionResult Home () { K19Controller . NumeroDeAcessos ++; ViewBag . Acessos = K19Controller . NumeroDeAcessos ; return View () ; } }Cdigo C# 4.1: K19Controller.cs

A classe K19Controller possui uma propriedade chamada NumeroDeAcessos, que armazenar o nmero de acessos nossa pgina. O mtodo Home() ser chamado toda vez que a url http://:/K19/Home for requisitada por um navegador. Note que essa url formada pelo nome do controlador (nome da classe que dene o controlador sem o suxo Controller) seguido pelo nome desse mtodo. Cada vez que o mtodo Home() chamado, o valor da propriedade NumeroDeAcessos incrementado. Alm disso, o valor atualizado dessa propriedade colocado na ViewBag para que possa ser acessado na camada de apresentao. Para indicar que o uxo de execuo deve seguir para a camada de apresentao, o mtodo Home() invoca o mtodo View() e devolve a resposta obtida. Por padro, o uxo ser direcionado para um arquivo chamado Home.cshtml que deve estar localizado na pasta Views\K19\. Na camada de apresentao, vamos adicionar a tela associada ao mtodo Home(). Para isso, criaremos um arquivo chamado Home.cshtml na pasta Views\K19\ da aplicao com o contedo abaixo.1 2 3 4 @{ ViewBag . Title = " Home " ; } < h2 > Acessos : @ViewBag . Acessos Cdigo CSHTML 4.1: Home.cshtml

Para acessar a ViewBag, devemos utilizar o caractere @, como no cdigo acima.

Exerccios de Fixao1

Crie um projeto do tipo ASP .NET MVC 4 Web Application chamado K19. Utilize o template Basicwww.k19.com.br

57

V ISO G ERAL DO ASP.NET MVC

58

Project.

Figura 4.4: Criando um projeto

Figura 4.5: Criando um projeto

Dena uma pgina de saudao. Para isto, crie um controlador chamado K19 no projeto K19 conforme a gura abaixo:2

58

www.k19.com.br

59

V ISO G ERAL DO ASP.NET MVC

Figura 4.6: Criando um controlador

Figura 4.7: Criando um controlador

1 2 3 4 5 6 7 8 9 1 11 12 13 14 15

using System ; using System . Web . Mvc ; namespace K19 . Controllers { public class K19Controller : Controller { public ActionResult Home () { Random random = new Random () ; ViewBag . NumeroDaSorte = random . Next () ; return View () ; } } }Cdigo C# 4.2: K19Controller.cs

www.k19.com.br

59

V ISO G ERAL DO ASP.NET MVC3

60

Dentro da pasta Views, crie uma pasta chamada K19.

Figura 4.8: Criando uma pasta

Dena a pgina com a mensagem de saudao. Crie um arquivo chamado Home.cshtml dentro da pasta Views\K19\.4

Figura 4.9: Adicionando uma tela

60

www.k19.com.br

61

V ISO G ERAL DO ASP.NET MVC

Figura 4.10: Adicionando uma tela

1 2 3 4

@{ ViewBag . Title = " Home " ; } < h2 > Ol ! O seu nmero da sorte @ViewBag . NumeroDaSorte

Cdigo CSHTML 4.2: Home.cshtml

5

Para visualizar a pgina, basta executar o projeto no Visual Studio e acessar o endereo http://localhost:/K19/Homewww.k19.com.br

61

V ISO G ERAL DO ASP.NET MVC

62

Figura 4.11: Acessando a pgina da aplicao

Integrao com Entity FrameworkA integrao entre Entity Framework e ASP.NET MVC 4 realizada de maneira extremamente simples. No Visual Studio 2010, ao criar-se um projeto ASP.NET MVC 4 do tipo Basic, a biblioteca do Entity Framework 5 ca disponvel automaticamente para o projeto. A string de conexo que a aplicao ASP.NET MVC 4 utilizar deve ser denida no arquivo de congurao Web.config.1 2 3 4 5 6 7 8 9 1 11 12 13 14 ... < connectionStrings > < add name = " K19Context " providerName = " System . Data . SqlClient " connectionString = " Server =.\ SQLEXPRESS ; Database = k19bd ; Trusted_Connection = false ; User Id = sa ; Password = sa ; Persist Security Info = true ; MultipleActiveResultSets = True " / > ...Cdigo XML 4.1: Exemplo de string de conexo

Por m, bastaria implementar as entidades e mape-las como visto no Captulo 3.

ScaffoldO Visual Studio 2010 capaz de gerar telas e controladores para as operaes de insero, leitura, alterao e remoo (CRUD) a partir de uma entidade de um projeto ASP.NET MVC 4. Os controla62www.k19.com.br

63

V ISO G ERAL DO ASP.NET MVC

dores gerados podem utilizar as funcionalidades do Entity Framework para interagir com o banco de dados.

Exerccios de FixaoVamos gerar o nosso primeiro scaffold. Para isto, dena as classes Editora e K19Context na pasta Models do nosso projeto K19.6

1 2 3 4 5 6 7 8 9

namespace K19 . Models { public class Editora { public int Id { get ; set ; } public string Nome { get ; set ; } public string Email { get ; set ; } } }

Cdigo C# 4.3: Editora.cs

1 2 3 4 5 6 7 8 9

using System . Data . Entity ; namespace K19 . Models { public class K19Context : DbContext { public DbSet < Editora > Editoras { get ; set ; } } }

Cdigo C# 4.4: K19Context.cs

Dena a string de conexo. Para isto, altere o arquivo Web.config da raiz do projeto K19 e acrescente a string de conexo dentro da tag .7

1 2 3 4 5 6 7 8 9 1 11 12 13 14

... < connectionStrings > < add name = " K19Context " providerName = " System . Data . SqlClient " connectionString = " Server =.\ SQLEXPRESS ; Database = k19bd ; Trusted_Connection = false ; User Id = sa ; Password = sa ; Persist Security Info = true ; MultipleActiveResultSets = True " / > ...

Cdigo XML 4.2: String de conexo

8

Antes de gerar o scaffold, precisamos fazer um build no projeto.www.k19.com.br

63

V ISO G ERAL DO ASP.NET MVC

64

Figura 4.12: Build do projeto

Aps o build do projeto, podemos gerar o scaffold. Para isto, devemos criar um controlador chamado Editora conforme a gura abaixo.9

Figura 4.13: Gerando o scaffold

Dena o model que deseja gerar o scaffold e a classe responsvel pelo acesso ao banco de dados.64www.k19.com.br

65

V ISO G ERAL DO ASP.NET MVC

Figura 4.14: Gerando o scaffold

Aps gerar o scaffold, verique os arquivos gerados no projeto.www.k19.com.br

65

V ISO G ERAL DO ASP.NET MVC

66

Figura 4.15: Scaffold gerado

10

Para testar, acesse o endereo http://localhost:/Editora.

66

www.k19.com.br

CAPTULO

C AMADA DE A PRESENTAO

5

A camada de apresentao responsvel por gerar as pginas de uma aplicao web. Os dados apresentados em uma pgina web so denidos na camada de modelo. A camada de controle recupera os dados da camada de modelo e os envia para a camada de apresentao. Basicamente, a camada de apresentao denir como esses dados sero apresentados para os usurios da aplicao. O uxo inverso tambm ocorre. Ou seja, a camada de apresentao obtm dados inseridos pelos usurios e os envia para a camada de controle que, por sua vez, usa esses dados para alterar a camada de modelo. Mostraremos, neste captulo, como a camada de apresentao de uma aplicao web construda com a utilizao de recursos do ASP.NET MVC como Inline Code, HTML Helper, Layout e Partial Views.

Razor e ASPXAt a segunda verso do ASP .NET MVC, as telas (ou pginas) de uma aplicao web eram desenvolvidas em ASPX. A partir da terceira verso desse framework, podemos usar a linguagem Razor para construir essas telas. A principal caracterstica da Razor ser concisa e simples, diminuindo o nmero de caracteres e as tradicionais tags de scripts do ASP.NET MVC (). Nos exemplos abaixo, mostraremos algumas diferena entre Razor e ASPX.

Criando VariveisToda expresso em Razor comea com o caractere @. Para criarmos variveis, precisamos declarlas dentro de um bloco Razor:1 2 3 4 5 6 @{ string nome = " K19 " ; string telefoneDaK19 = " 2387 -3791 " ; string enderecoDaK19 = " Av . Brigadeiro Faria Lima " ; int numeroDaK19 = 1571; }Cdigo CSHTML 5.1: Criando variveis em Razor

1 2 3 4 5 6

www.k19.com.br

67

C AMADA DE A PRESENTAO

68

Cdigo ASPX 5.1: Criando variveis em ASPX

Acessando variveisAs variveis podem ser facilmente acessadas.1 Telefone da K19 : @telefoneDaK19 Cdigo CSHTML 5.2: Acessando uma varivel

1

Telefone da K19 : < %= telefoneDaK19 % > Cdigo ASPX 5.2: Acessando uma varivel

Condicionais (if e else)Podemos utilizar os comandos de controle de uxo if e else. Veja os exemplos abaixo.1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 @if ( numero == numeroDaK19 ) { Chegou na K19 ! } else { Continue andando . } @{ int numero = 463; if ( numero == numeroDaK19 ) { Chegou na K19 ! } else { Continue andando . } }Cdigo CSHTML 5.3: Utilizando if e else em Razor

1 2 3 4 5 6 7 8 9 1 11 12 13 14

Chegou na K19 ! Continue andando . Cdigo CSHTML 5.4: Utilizando if e else em ASPX

68

www.k19.com.br

69

C AMADA DE A PRESENTAO

LaosPodemos criar laos utilizando o comando for.1 2 3 4 @for ( int i = ; i < 5; i ++) { i = @i }Cdigo CSHTML 5.5: Criando um lao em Razor

1 2 3 4 5 6 7 8

i = < %= i % > Cdigo ASPX 5.3: Criando um lao em ASPX

Texto e cdigo1 2 3 4 @if ( x == " nome " ) { @ : O nome da editora @editora . Nome }Cdigo CSHTML 5.6: Texto e cdigo em Razor

1 2 3 4 5 6 7 8

O nome da editora < %= editora . Nome % > Cdigo ASPX 5.4: Texto e cdigo em ASPX

ComentriosPodemos adicionar comentrios nas pginas.1 @ * Comentrio * @Cdigo CSHTML 5.7: Comentrios em Razor

1

Cdigo ASPX 5.5: Comentrios em ASPX

www.k19.com.br

69

C AMADA DE A PRESENTAO

70

Exerccios de FixaoUtilize o projeto K19 e altere o arquivo Views\K19\Home.cshtml para imprimir uma mensagem dez vezes.1

1 2 3 4 5 6 7 8

@{ ViewBag . Title = " Home " ; } @for ( int i = ; i < 1 ; i ++) { < h2 > Ol ! O seu nmero da sorte @ViewBag . NumeroDaSorte }

Cdigo CSHTML 5.8: Home.cshtml

Para ver o resultado, acesse a url http://localhost:/K19/Home. Altere o arquivo Home.cshtml do exerccio anterior para imprimir uma mensagem a partir de uma varivel.2

1 2 3 4 5 6 7 8 9

@{ ViewBag . Title = " Home " ; string mensagem = " Ol ! O seu nmero da sorte " + @ViewBag . NumeroDaSorte ; } @for ( int i = ; i < 1 ; i ++) { < h2 > @mensagem }

Cdigo CSHTML 5.9: Home.cshtml

Para ver o resultado, acesse a url http://localhost:/K19/Home.

Exerccios Complementares1

Altere o arquivo Home.cshtml para gerar a seguinte tela para o usurio:www.k19.com.br

70

71

C AMADA DE A PRESENTAO

Figura 5.1: Inline Code

ViewBag e Strogly Typed ViewsA ViewBag utilizada para transmitir dados da camada de controle para a camada de apresentao. Para adicionar um item propriedade ViewBag, devemos denir uma chave para esse item. Veja o cdigo abaixo.1 ViewBag . HoraDoServidor = DateTime . Now . ToShortTimeString () ;Cdigo C# 5.1: Adicionando um item na ViewBag

No cdigo acima, criamos uma chave chamada HoraDoServidor e atribumos um valor a essa chave. Na camada de apresentao, os itens armazenados na ViewBag podem ser acessados facilmente atravs da sintaxe da Razor. Veja um exemplo abaixo.1 A hora do servidor @ViewBag . HoraDoServidorCdigo CSHTML 5.11: Acessando um item da ViewBag

A ViewBag oferece uma forma simples de transmitir dados da camada de controle para a camada de apresentao, mas apresenta algumas desvantagens. Por exemplo, como as chaves so adicionadas dinamicamente, no possvel garantir a existncia dessas chaves em tempo de compilao. Considere o cdigo abaixo.www.k19.com.br

71

C AMADA DE A PRESENTAO1 2 3 4 5 6 7 8 9 double numero = new Random () . NextDouble () ; if ( numero < .5) { ViewBag . X = " K19 TREINAMENTOS " ; } else { ViewBag . X = 1 ; }Cdigo C# 5.2: Adcicionando chaves dinamicamente na ViewBag

72

No cdigo acima, o tipo do objeto associado chave X depende do valor da varivel numero, que gerado aleatoriamente. Quando o valor gerado for menor do que 0.5, o tipo desse objeto ser string. Caso contrrio, o tipo desse objeto ser int. Suponha que a chave X seja utilizada na camada de apresentao.1 @ViewBag . X . Lower () Cdigo CSHTML 5.12: Utilizando a chave X ViewBag

O cdigo acima no produz erros de compilao. Contudo, na execuo, um erro poder ocorrer. O problema que esse cdigo supe que o objeto associado chave X possui o mtodo Lower(). No entanto, se a ao for acionada um nmero suciente de vezes, em algum momento isso no ser verdade, e um erro de execuo ocorrer. Alm disso, recursos do Visual Studio como IntelliSense (recurso para completar cdigo) ou refatorao no podem ser aplicados com o uso da ViewBag. Uma alternativa utilizao da ViewBag o recurso strongly typed views. Com esse recurso podemos xar, em tempo de compilao, o tipo do objeto que ser transferido da camada de controle para a camada de apresentao. Uma vez que o tipo desse objeto foi xado, o compilador capaz de vericar a validade do cdigo, evitando eventuais erros de execuo. Alm disso, o Visual Studio pode auxiliar o desenvolvimento da aplicao com os recursos de IntelliSense e de refatorao. Para utilizar strongly type views, o primeiro passo , na camada de controle, passar como parmetro para o mtodo View() um objeto do tipo esperado pela camada de apresentao.1 2 3 4 5 public ActionResult acao () { Editora editora = new Editora { Nome = " K19 " , Email = " contato@k19 . com . br " }; re