K19 k32-desenvolvimento-web-com-aspnet-mvc

206
TREINAMENTOS Desenvolvimento Web com ASP.NET MVC 4

description

 

Transcript of K19 k32-desenvolvimento-web-com-aspnet-mvc

  • 1. TREINAMENTOSDesenvolvimento Webcom ASP.NET MVC 4
  • 2. Desenvolvimento Web com ASP.NET MVC 4 25 de junho de 2012Sumrio iSobre a K19 1Seguro Treinamento 2Termo de Uso 3Cursos 41 Banco de Dados 1 1.1 Sistemas Gerenciadores de Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.3 Bases de Dados (Databases) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.4 Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.5 CRUD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.6 Chaves Primria e Estrangeira . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.7 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 ADO.NET 23 2.1 Driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.2 ODBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.3 ODBC Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.4 Criando uma conexo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.5 Inserindo registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.7 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.8 SQL Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2.10 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2.11 Listando registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2.12 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.13 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.14 Connection Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 www.k19.com.br i
  • 3. S UMRIO ii 2.15 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.16 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 2.17 Desaos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 Entity Framework 37 3.1 Mltiplas sintaxes da linguagem SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.2 Orientao a Objetos VS Modelo Relacional . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.3 Ferramentas ORM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.4 Congurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.5 Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.6 Manipulando entidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.7 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.8 Repositrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514 Viso Geral do ASP.NET MVC 53 4.1 Necessidades de uma aplicao web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.2 ASP .NET MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 4.3 MVC e Front Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 4.4 Visual Web Developer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.5 Exemplo de uma Aplicao Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 4.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 4.7 Integrao com Entity Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 4.8 Scaffold . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 4.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635 Camada de Apresentao 67 5.1 Razor e ASPX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 5.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 5.3 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 5.4 ViewBag e Strogly Typed Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 5.5 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 5.6 HTML Helpers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 5.7 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 5.8 Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 5.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 5.10 Partial views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 5.11 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 966 Camada de Controle 99 6.1 Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 6.2 ActionResult . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 6.3 Parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 6.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 6.5 TempData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 6.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1047 Rotas 107 7.1 Adicionando uma rota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 7.2 Adicionando Parmetros nas Rotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108ii www.k19.com.br
  • 4. iii S UMRIO 7.3 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1098 Validao 111 8.1 Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 8.2 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 8.3 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 8.4 Anotaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 8.5 Validao no lado do Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 8.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1169 Sesso 119 9.1 Identicando os navegadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 9.2 Sesses no ASP .NET MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 9.3 Session Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 9.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12110 Autenticao 125 10.1 Filtro de Autenticao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 10.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12711 Tratamento de Erros 131 11.1 Try-Catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 11.2 Custom Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 11.3 Http Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 11.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134A ASP.NET Web API 139 A.1 REST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 A.2 Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 A.3 URIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 A.4 Operaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 A.5 Media Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 A.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142B Migrations 147 B.1 Passo a Passo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 B.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154C Projeto 161 C.1 Modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 C.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 C.3 Persistncia - Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 C.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 C.5 Persistncia - Congurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 C.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 C.7 Persistncia - Repositrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 C.8 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 C.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 C.10 Apresentao - Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 C.11 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 C.12 Cadastrando e Listando Selees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 www.k19.com.br iii
  • 5. S UMRIO iv C.13 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 C.14 Removendo Selees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 C.15 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 C.16 Cadastrando, Listando e Removendo Jogadores . . . . . . . . . . . . . . . . . . . . . . . 174 C.17 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 C.18 Removendo Jogadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 C.19 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 C.20 Membership e Autorizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 C.21 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 C.22 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 C.23 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 C.24 Controle de Erro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 C.25 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 C.26 Enviando email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 C.27 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190D Respostas 193iv www.k19.com.br
  • 6. 1 S UMRIOSobre a K19 A 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 prin-cipais tecnologias utilizadas pelas empresas. Atravs desses treinamentos, seus alunos se tornamcapacitados para atuar no mercado de trabalho. Visando a mxima qualidade, a K19 mantm as suas apostilas em constante renovao e melho-ria, oferece instalaes fsicas apropriadas para o ensino e seus instrutores esto sempre atualizadosdidtica e tecnicamente. www.k19.com.br 1
  • 7. S UMRIO 2Seguro Treinamento Na 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 pos-sui o Seguro Treinamento. Ao contratar um curso, o aluno poder refaz-lo quantas vezes desejarmediante 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 aoalunos que desejam utilizar o Seguro Treinamento. O valor da franquia para utilizar o Seguro Treina-mento 10% do valor total do curso.2 www.k19.com.br
  • 8. 3 S UMRIO Termo de UsoTermo de Uso Todo o contedo desta apostila propriedade da K19 Treinamentos. A apostila pode ser utilizadalivremente para estudo pessoal . Alm disso, este material didtico pode ser utilizado como materialde apoio em cursos de ensino superior desde que a instituio correspondente seja reconhecida peloMEC (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 semo prvio consentimento formal, por escrito, da K19 Treinamentos. O uso indevido est sujeito smedidas legais cabveis. www.k19.com.br 3
  • 9. S UMRIO 4 TR EIN AM EN TR TO EIN S TREINAMENTOS AM EN TO S Conhea os nossos cursos K01- 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/cursos4 www.k19.com.br
  • 10. CAPTULO B ANCO DE D ADOS 1 Em geral, as aplicaes necessitam armazenar dados de forma persistente para consult-los pos-teriormente. Por exemplo, a aplicao de uma livraria precisa armazenar os dados dos livros e dosautores de forma persistente. Suponha que esses dados sejam armazenados em arquivos do sistema operacional. Vrios fato-res importantes nos levam a descartar tal opo. A seguir, apresentamos as principais diculdades aserem 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 in- formaes estejam sempre consistentes.Consulta: O tempo gasto para realizar as consultas aos dados armazenados deve ser o menor poss- vel.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 parapersistir as informaes de uma aplicao de maneira adequada. Felizmente, tal tipo de sistema jexiste 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 popularesso: Oracle Database SQL Server www.k19.com.br 1
  • 11. B ANCO DE D ADOS 2 MySQL Server PostgreSQL SQL ServerNeste treinamento, utilizaremos o SQL Server Express, que mantido pela Microsoft. O SQL ServerExpress 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 chamadode Microsoft SQL Server Management Studio Express. Bases de Dados (Databases)Um sistema gerenciador de banco de dados capaz de gerenciar informaes de diversos sistemasao mesmo tempo. Por exemplo, as informaes dos clientes de um banco, alm dos produtos de umaloja virtual ou dos livros de uma livraria. Suponha que os dados fossem mantidos sem nenhuma separao lgica. Implementar regrasde segurana especcas seria extremamente complexo. Tais regras criam restries quanto ao con-tedo que pode ser acessado por cada usurio. Por exemplo, determinado usurio poderia ter per-misso de acesso aos dados dos clientes do banco, mas no s informaes dos produtos da lojavirtual, 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 dasinformaes 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.2 www.k19.com.br
  • 12. 3 B ANCO DE D ADOS www.k19.com.br 3
  • 13. B ANCO DE D ADOS 4 Repare que alm da base de dados livraria h outras bases. Essas bases foram criadas automati-camente 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 comandoDROP DATABASE. TabelasUm servidor de banco de dados dividido em bases de dados com o intuito de separar as informa-es de domnios diferentes. Nessa mesma linha de raciocnio, podemos dividir os dados de umabase a m de agrup-los segundo as suas correlaes. Essa separao feita atravs de tabelas. Porexemplo, no sistema de um banco, interessante separar o saldo e o limite de uma conta, do nome eCPF de um cliente. Ento, poderamos criar uma tabela para os dados relacionados s contas e outrapara os dados relacionados aos clientes. Cliente Conta nome idade cpf numero saldo limite Jos 27 31875638735 1 1000 500 Maria 32 30045667856 2 2000 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. Cadaregistro dessa tabela armazena em seus campos os dados de um determinado cliente.Criando tabelas no SQL Server Express As tabelas no SQL Server Express so criadas atravs do comando CREATE TABLE. Na criao deuma tabela necessrio denir quais so os nomes e os tipos das colunas.4 www.k19.com.br
  • 14. 5 B ANCO DE D ADOS www.k19.com.br 5
  • 15. B ANCO DE D ADOS 6 No SQL Server os nomes das tabelas so precedidas pelo ID do usurio que possui a tabela. Nocaso 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 (Structu-red Query Language). Essa linguagem oferece quatro comandos bsicos: INSERT, SELECT, UPDATE6 www.k19.com.br
  • 16. 7 B ANCO DE D ADOSe DELETE. Esses comandos so utilizados para inserir, ler, alterar e remover registros, respectiva-mente. www.k19.com.br 7
  • 17. B ANCO DE D ADOS 88 www.k19.com.br
  • 18. 9 B ANCO DE D ADOS Chaves Primria e EstrangeiraSuponha que os livros da nossa livraria sejam classicados por editoras. As editoras possuem nomee telefone. Para armazenar esses dados, uma nova tabela deveria ser criada. Nesse momento, teramos duas tabelas (Livro e Editora). Constantemente, a aplicao da livrariadever descobrir qual a editora de um determinado livro ou quais so os livros de uma determinadaeditora. 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, deve www.k19.com.br 9
  • 19. B ANCO DE D ADOS 10consultar a tabela Livro para obter o nome da editora correspondente. Depois, com esse nome, deveconsultar a tabela Editora para obter as informaes da editora. Porm, h um problema nessa abordagem. A tabela Editora aceita duas editoras com o mesmonome. Dessa forma, eventualmente, no conseguiramos descobrir os dados corretos da editora deum determinado livro. Para resolver esse problema, deveramos criar uma restrio na tabela Editoraque proba a insero de editoras com o mesmo nome. Para resolver esse problema no SQL Server Express, poderamos adicionar a propriedade UNI-QUE no campo nome da tabela Editora. Porm, ainda teramos mais um problema. Na tabela Li-vro, poderamos adicionar registros vinculados a editoras inexistentes, pois no h nenhuma relaoexplcita entre as tabelas. Para solucionar esses problemas, devemos utilizar o conceito de chaveprimria e chave estrangeira. Toda tabela pode ter uma chave primria, que um conjunto de um ou mais campos que de-vem ser nicos para cada registro. Normalmente, um campo numrico escolhido para ser a chaveprimria 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 chamadoeditora_id que deve ser utilizado para guardar o valor da chave primria da editora correspondenteao livro. Alm disso, o campo editora_id deve estar explicitamente vinculado com o campo id databela Editora. Para estabelecer esse vnculo, o campo editora_id da tabela Livro deve ser uma chaveestrangeira associada chave primria da tabela Editora. Uma chave estrangeira um conjunto de uma ou mais colunas de uma tabela que possuem va-lores iguais aos da chave primria de outra tabela. Com a denio da chave estrangeira, um livro no pode ser inserido com o valor do campoeditora_id invlido. Caso tentssemos fazer isso, obteramos uma mensagem de erro. Exerccios de Fixao 1 Abra o Microsoft SQL Server Management Studio Express utilizando NOME_DA_MAQUINASQLEXPRESS como Server Name, SQL Server Authentication como Authentication, sa como Logine sa como Password.10 www.k19.com.br
  • 20. 11 B ANCO DE D ADOS 2 Caso exista uma base de dados chamada Livraria, remova-a conforme a gura abaixo: 3 Crie uma nova base de dados chamada livraria, conforme mostrado na gura abaixo. Voc vaiutilizar esta base nos exerccios seguintes. www.k19.com.br 11
  • 21. B ANCO DE D ADOS 124 Crie uma tabela chamada Editoras conforme as guras abaixo.12 www.k19.com.br
  • 22. 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
  • 23. B ANCO DE D ADOS 14 O campo Id dever ser incrementado automaticamente. Dena ele com a propriedade Identitysegundo a gura abaixo:14 www.k19.com.br
  • 24. 15 B ANCO DE D ADOS 5 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 chaveprimria e automaticamente incrementada. Voc precisa tornar o campo EditoraId uma chave estrangeira. Clique com o boto direito sobrea coluna EditoraId e selecione a opo Relantioships..., conforme a gura abaixo: www.k19.com.br 15
  • 25. B ANCO DE D ADOS 16 Devemos acrescentar o relacionamento entre livro e editora. Clique em Add e posteriormente noboto direita na linha Tables and Columns Specication. Devemos informar qual a chave primria que a coluna EditoraId da tabela Livros faz referncia.16 www.k19.com.br
  • 26. 17 B ANCO DE D ADOSPara isto, informe a tabela Editoras como Primary Key Table e indique a coluna Id como a chaveprimria referenciada. Selecione a coluna EditoraId como a coluna que ir fazer referncia a chaveprimria 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
  • 27. B ANCO DE D ADOS 18 7 Consulte os registros da tabela Editoras, e em seguida consulte a tabela Livros. Veja exemploslogo abaixo:18 www.k19.com.br
  • 28. 19 B ANCO DE D ADOS8 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
  • 29. B ANCO DE D ADOS 2010 Remova alguns registros da tabela Livros. Veja o exemplo abaixo:11 Remova alguns registros da tabela Editoras. Preste ateno para no remover uma editora quetenha algum livro relacionado j adicionado no banco. Veja o exemplo abaixo:20 www.k19.com.br
  • 30. 21 B ANCO DE D ADOS12 Faa uma consulta para buscar todos os livros de uma determinada editora. Veja um exemplona gura abaixo: www.k19.com.br 21
  • 31. B ANCO DE D ADOS 2222 www.k19.com.br
  • 32. CAPTULO ADO.NET 2 No captulo anterior, aprendemos que utilizar bancos de dados uma tima alternativa paraarmazenar os dados de uma aplicao. Entretanto, voc deve ter percebido que as interfaces dispo-nveis para interagir com o SQL Server Express no podem ser utilizadas por qualquer pessoa. Parautiliz-las, necessrio conhecer a linguagem SQL e os conceitos do modelo relacional. Em geral, asinterfaces dos outros SGDBs exigem os mesmos conhecimentos. SELECT * FROM tbl_funcionarios WHERE nome LIKE %jonas%; INSERT INTO tbl_funcionarios (nome, codigo, salario) VALUES (Rafael, 1234, 1000); 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 co-nhecimentos tcnicos de SQL ou do modelo relacional para serem utilizadas. Dessa forma, usurioscomuns poderiam manipular as informaes do banco de dados atravs dessas aplicaes. Nessaabordagem, os usurios interagem com as aplicaes e as aplicaes interagem com os SGDBs. www.k19.com.br Cadastro de Funcionrios Nome: Cdigo: Salrio: Figura 2.2: Usurios comuns devem utilizar interfaces simples www.k19.com.br 23
  • 33. ADO.NET 24 DriverAs aplicaes interagem com os SGDBs atravs de troca de mensagens. Os SGDBs denem o formatodas mensagens. Para no sobrecarregar o canal de comunicao entre as aplicaes e os SGDBs, asmensagens trocadas devem ocupar o menor espao possvel. Geralmente, protocolos binrios somais apropriados para reduzir o tamanho das mensagens e consequentemente diminuir a carga docanal de comunicao. Por isso, os SGDBs utilizam protocolos binrios. rollback find getReference persist begin getTransaction commit 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 com-plexas para um ser humano compreender. Dessa forma, o trabalho dos desenvolvedores seria muitocomplexo, aumentando o custo para o desenvolvimento e manuteno das aplicaes. 10 010 11 110 01 1011010111 11 11 11 0 0010110011 0 0010110001 01 00 01 1101011101 10 111 10 110 11 01 01 1010111101 10 01 10 1 0101101001 0 01 01 00 11 0111011100 0111011100 01 101 11 0101101001 1010111101 1 010 1101011101 0010110001 0 0010110011 1011010111 Figura 2.4: Mensagens binrias so altamente complexas para os seres humanos Para resolver esse problema e facilitar o desenvolvimento das aplicaes, as empresas propriet-24 www.k19.com.br
  • 34. 25 ADO.NETrias dos SGDBs, normalmente, desenvolvem e distribuem drivers de conexo. Um driver de conexoatua como um intermedirio entre as aplicaes e os SGDBs. Os drivers de conexo so tradutores de comandos escritos em uma determinada linguagemde programao para comandos denidos de acordo com o protocolo de um SGDB. Utilizando umdriver de conexo, os desenvolvedores das aplicaes no manipulam diretamente as mensagensbinrias trocadas entre as aplicaes e os SGDBs. Mais Sobre Em alguns casos, o protocolo binrio de um determinado SGDB fechado. Consequen- temente, 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 total-mente independente. Consequentemente, cada driver teria sua prpria interface, ou seja, seu pr-prio conjunto de instrues. Dessa maneira, o desenvolvedor da aplicao precisa conhecer as ins-trues de cada um dos drivers dos respectivos bancos que ele for utilizar. Para facilitar o trabalho do desenvolvedor da aplicao, a Microsoft deniu uma especicaochamada 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 decomandos 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 Mana-ger do Windows. O ODBC Manager pode ser executado atravs do item Ferramentas Administrati-vas do Painel de Controle. www.k19.com.br 25
  • 35. ADO.NET 26 Criando uma conexoCom o driver de conexo ODBC instalado na mquina j possvel criar uma conexo com o bancode 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 string stringDeConexao = @ " driver ={ SQL Server };2 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.OdbcConnec-tion 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, pos-svel inserir registros nas tabelas. O primeiro passo para executar um comando deni-lo em lin-guagem SQL de acordo com a sintaxe do SGDB utilizado.26 www.k19.com.br
  • 36. 27 ADO.NET1 string textoDoComando = @ " INSERT INTO Editoras ( Nome , Email )2 VALUES ( Abril , abril@email . com ) ; " ; Mais Sobre O 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 docdigo sql e da conexo previamente criados. O comando no executado quando os objetos dessaclasse 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 deveser aberta antes de executar o comando.1 conexao . Open () ;2 comando . ExecuteNonQuery () ; Importante A mesma conexo pode ser reaproveitada para executar vrias operaes. Quando no houver mais operaes a serem executadas, devemos nalizar a conexo ODBC atravsdo mtodo Close(). Finalizar as conexes ODBC que no so mais necessrias importantepois libera recursos no SGBD. 1 conexao . close () ; Cdigo C# 2.6: Finalizando uma conexo ODBC Mais Sobre Em C#, para evitar que o uma conexo no seja fechada aps a sua utilizao, podemos aplicar um bloco using. 1 using ( OdbcConnection conexao = new OdbcConnection ( stringDeConexao ) ) 2 { 3 // utiliza a conexao 4 } Cdigo C# 2.7: Utilizando um bloco usingNo cdigo acima, quando o bloco using que est associado conexo ODBC terminar, automa-ticamente, essa conexo ser fechada. Exerccios de Fixao www.k19.com.br 27
  • 37. ADO.NET 28 1 Crie um projeto do tipo Console Application no Microsoft Visual C# Express, chamadoODBC. 2 Crie uma classe chamada InsereEditora no projeto ODBC para inserir registros na tabela Edi-toras. 1 using System . Data . Odbc ; 2 3 namespace Odbc 4 { 5 class InsereEditora 6 { 7 static void Main ( string [] args ) 8 { 9 string stringDeConexao = @ " driver ={ SQL Server };10 server = MARCELO - PC SQLEXPRESS ; database = livraria ; uid = sa ; pwd = sa ; " ;1112 System . Console . Write ( " Digite o Nome da Editora : " ) ;13 string nome = System . Console . ReadLine () ;1415 System . Console . Write ( " Digite o Email da Editora : " ) ;16 string email = System . Console . ReadLine () ;1718 string textoInsereEditora =19 @ " INSERT INTO Editoras ( Nome , Email )20 VALUES ( " + nome + @ " , " + email + @ " ) " ;2122 using ( OdbcConnection conexao = new OdbcConnection ( stringDeConexao ) )23 {24 OdbcCommand command = new OdbcCommand ( textoInsereEditora , conexao ) ;25 conexao . Open () ;26 command . ExecuteNonQuery () ;27 }28 }29 }30 } Cdigo C# 2.8: InsereEditora.cs Exerccios Complementares 1 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 ob-tidos 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 compor-tamento esperado da operao afetado. Eventualmente, registros no so inseridos como deveriamou brechas de segurana podem se abrir. Por exemplo, considere a classe InsereEditora do exerccio de xao. Se o usurio digitarOReilly 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
  • 38. 29 ADO.NET Observe que o caractere aspas simples aparece cinco vezes no cdigo SQL acima. O SGDB nosaberia dizer onde de fato termina o nome da editora. Ao tentar executar esse cdigo, um erro desintaxe lanado pelo SQL Server. Para resolver esse problema manualmente, devemos adicionardois 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 nessesvalores devem ser tratados. Esse processo extremamente trabalhoso, pois o conjunto de caracteresespeciais e a forma de trat-los diferente em cada SGDB. A responsabilidade do tratamento dos caracteres especiais contidos nos valores de entrada dosusurios pode ser repassada para os drivers ODBC. Dessa forma, o cdigo das aplicaes se tornaindependente das particularidades desse processo para cada SGDB. Mais Sobre O processo de tratamento dos caracteres especiais das entradas dos usurios denomi- nado sanitize. 1 // pegando os dados da editora pelo teclado 2 string nome = System . Console . ReadLine () ; 3 string email = System . Console . ReadLine () ; 4 5 // definindo a sentena SQL com parmetros 6 string textoDoComando = 7 @ " INSERT INTO Editoras ( Nome , Email ) VALUES (? , ?) ; " ; 8 9 // criando um comando odbc10 OdbcCommand comando = new OdbcCommand ( textoDoComando , conexao ) ;1112 // atribuindo valores aos parmetros13 comando . Parameters . AddWithValue ( " @Nome " , nome ) ;14 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 exe-cutar o comando, necessrio atribuir valores aos parmetros. Isso feito com o mtodo AddWith-Value(). Esse mtodo realiza a tarefa de sanitizar os valores enviados pelo usurio. Exerccios de Fixao 3 Tente causar um erro de SQL Injection ao inserir editoras com a classe InsereEditora. (Dica:tente entradas com aspas simples) 4 Altere o cdigo da classe InsereEditora para eliminar o problema do SQL Injection. Observe ocdigo abaixo:1 using System . Data . Odbc ;23 namespace Odbc4 {5 class InsereEditora www.k19.com.br 29
  • 39. ADO.NET 30 6 { 7 static void Main ( string [] args ) 8 { 9 string stringDeConexao = @ " driver ={ SQL Server };10 server = MARCELO - PC SQLEXPRESS ; database = livraria ; uid = sa ; pwd = sa ; " ;1112 System . Console . Write ( " Digite o Nome da Editora : " ) ;13 string nome = System . Console . ReadLine () ;1415 System . Console . Write ( " Digite o Email da Editora : " ) ;16 string email = System . Console . ReadLine () ;1718 string textoInsereEditora =19 @ " INSERT INTO Editoras ( Nome , Email ) VALUES (? ,?) " ;2021 using ( OdbcConnection conexao = new OdbcConnection ( stringDeConexao ) )22 {23 OdbcCommand command = new OdbcCommand ( textoInsereEditora , conexao ) ;2425 command . Parameters . AddWithValue ( " @Nome " , nome ) ;26 command . Parameters . AddWithValue ( " @Email " , email ) ;2728 conexao . Open () ;29 command . ExecuteNonQuery () ;30 }31 }32 }33 } Cdigo C# 2.13: InsereEditora.cs 5 Agora tente causar novamente o problema de SQL Injection ao inserir novas editoras. Exerccios Complementares 2 Provoque um erro de SQL Injection na classe InsereLivro. (Dica: tente entradas com aspassimples.) 3 Altere o cdigo para eliminar o problema do SQL Injection. 4 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 in-sero foi realizada com sucesso. O processo para executar um comando de consulta parecido com o de insero. necessriodenir a sentena SQL e criar um objeto da classe OdbcCommand.1 // definindo a sentena SQL2 string textoDoComando = @ " SELECT * FROM Editoras ; " ;34 // criando um comando odbc5 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 Execu-30 www.k19.com.br
  • 40. 31 ADO.NETteReader() ao invs do ExecuteNonQuery(). Esse mtodo devolve um objeto da classe System.Da-ta.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 string nome = resultado [ " Nome " ] as string ;2 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 recu-perados. Agora, para recuperar os outros registros necessrio avanar o OdbcDataReader atravsdo mtodo Read().1 string nome1 = resultado [ " nome " ] as string ;2 string email1 = resultado [ " email " ] as string ;34 resultado . Read () ;56 string nome2 = resultado [ " nome " ] as string ;7 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 avanarpara o prximo registro. Quando esse mtodo devolver false signica que no h mais registrospara serem recuperados.1 while ( resultado . Read () )2 {3 string nome = resultado [ " nome " ] as string ;4 string email = resultado [ " email " ] as string ;5 } Cdigo C# 2.19: Recuperando os campos de todos os registros do resultado Exerccios de Fixao 6 Insira algumas editoras utilizando a classe InsereEditora que voc criou nos exerccios anteri-ores. 7 Adicione uma nova classe ao projeto ODBC chamada ListaEditora. O objetivo listar as edi-toras que foram salvas no banco. Veja o cdigo dessa classe.1 using System . Data . Odbc ;23 namespace Odbc4 {5 class ListaEditora6 {7 static void Main ( string [] args )8 { www.k19.com.br 31
  • 41. ADO.NET 32 9 string stringDeConexao = @ " driver ={ SQL Server };10 server = MARCELO - PC SQLEXPRESS ; database = livraria ; uid = sa ; pwd = sa ; " ;1112 using ( OdbcConnection conexao = new OdbcConnection ( stringDeConexao ) )13 {14 string textoListaEditora = " SELECT * FROM Editoras " ;15 OdbcCommand command = new OdbcCommand ( textoListaEditora , conexao ) ;16 conexao . Open () ;17 OdbcDataReader resultado = command . ExecuteReader () ;1819 while ( resultado . Read () )20 {21 long ? id = resultado [ " Id " ] as long ?;22 string nome = resultado [ " Nome " ] as string ;23 string email = resultado [ " Email " ] as string ;24 System . Console . WriteLine ( " {0} : {1} - {2} n " ,id , nome , email ) ;25 }26 }27 }28 }29 } Cdigo C# 2.20: ListaEditora.cs Exerccios Complementares 5 Crie uma classe para listar os livros cadastrados na base de dados. Connection Factory Voc deve ter percebido que para cada ao executada no banco de dados, ns precisamos criaruma conexo. Isso gera um problema relacionado string de conexo car armazenada em diversoslocais. Imagine que o driver do banco foi atualizado e mudamos a sua verso. Isso implicaria fa-zer diversas alteraes no cdigo em cada ocorrncia da string de conexo, tornando o cdigo maissuscetvel a erros e dicultando a sua manuteno. Para resolver esta situao, ns poderamos criar uma classe responsvel pela criao e distri-buio de conexes, mantendo assim uma nica referncia para a string de conexo, e qualqueralterao no modo em que nos conectamos base de dados, s implica mudanas nesta classe. 1 static class ConnectionFactory 2 { 3 public static OdbcConnection CreateConnection () 4 { 5 string driver = @ " SQL Server " ; 6 string servidor = @ " MARCELO - PC SQLEXPRESS " ; 7 string baseDeDados = @ " livraria " ; 8 string usuario = @ " sa " ; 9 string senha = @ " sa " ;1011 StringBuilder connectionString = new StringBuilder () ;12 connectionString . Append ( " driver = " ) ;13 connectionString . Append ( driver ) ;14 connectionString . Append ( " ; server = " ) ;15 connectionString . Append ( servidor ) ;16 connectionString . Append ( " ; database = " ) ;17 connectionString . Append ( baseDeDados ) ;18 connectionString . Append ( " ; uid = " ) ;32 www.k19.com.br
  • 42. 33 ADO.NET19 connectionString . Append ( usuario ) ;20 connectionString . Append ( " ; pwd = " ) ;21 connectionString . Append ( senha ) ;2223 return new OdbcConnection ( connectionString . ToString () ) ;24 }25 } Cdigo C# 2.22: ConnectionFactory.cs 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 Fixao 8 Adicione uma nova classe chamada ConnectionFactory com seguinte cdigo: 1 using System ; 2 using System . Data . Odbc ; 3 using System . Text ; 4 5 namespace Odbc 6 { 7 static class ConnectionFactory 8 { 9 public static OdbcConnection CreateConnection ()10 {11 string driver = @ " SQL Server " ;12 string servidor = @ " MARCELO - PC SQLEXPRESS " ;13 string baseDeDados = @ " livraria " ;14 string usuario = @ " sa " ;15 string senha = @ " sa " ;1617 StringBuilder connectionString = new StringBuilder () ;18 connectionString . Append ( " driver = " ) ;19 connectionString . Append ( driver ) ;20 connectionString . Append ( " ; server = " ) ;21 connectionString . Append ( servidor ) ;22 connectionString . Append ( " ; database = " ) ;23 connectionString . Append ( baseDeDados ) ;24 connectionString . Append ( " ; uid = " ) ;25 connectionString . Append ( usuario ) ;26 connectionString . Append ( " ; pwd = " ) ;27 connectionString . Append ( senha ) ;2829 return new OdbcConnection ( connectionString . ToString () ) ;30 }31 }32 } Cdigo C# 2.23: ConnectionFactory.cs 9 Altere as classes InsereEditora e ListaEditora para que elas utilizem a fbrica de conexo.Execute-as novamente.1 using System . Data . Odbc ;23 namespace Odbc4 {5 class InsereEditora6 { www.k19.com.br 33
  • 43. ADO.NET 34 7 static void Main ( string [] args ) 8 { 9 System . Console . Write ( " Digite o Nome da Editora : " ) ;10 string nome = System . Console . ReadLine () ;1112 System . Console . Write ( " Digite o Email da Editora : " ) ;13 string email = System . Console . ReadLine () ;1415 string textoInsereEditora =16 @ " INSERT INTO Editoras ( Nome , Email ) VALUES (? ,?) " ;1718 using ( OdbcConnection conexao = ConnectionFactory . CreateConnection () )19 {20 OdbcCommand command = new OdbcCommand ( textoInsereEditora , conexao ) ;2122 command . Parameters . AddWithValue ( " @Nome " , nome ) ;23 command . Parameters . AddWithValue ( " @Email " , email ) ;2425 conexao . Open () ;26 command . ExecuteNonQuery () ;27 }28 }29 }30 } Cdigo C# 2.24: InsereEditora.cs 1 using System . Data . Odbc ; 2 3 namespace Odbc 4 { 5 class ListaEditora 6 { 7 static void Main ( string [] args ) 8 { 9 using ( OdbcConnection conexao = ConnectionFactory . CreateConnection () )10 {11 string textoListaEditora = " SELECT * FROM Editoras " ;12 OdbcCommand command = new OdbcCommand ( textoListaEditora , conexao ) ;13 conexao . Open () ;14 OdbcDataReader resultado = command . ExecuteReader () ;1516 while ( resultado . Read () )17 {18 long ? id = resultado [ " Id " ] as long ?;19 string nome = resultado [ " Nome " ] as string ;20 string email = resultado [ " Email " ] as string ;21 System . Console . WriteLine ( " {0} : {1} - {2} n " ,id , nome , email ) ;22 }23 }24 }25 }26 } Cdigo C# 2.25: ListaEditora.cs Exerccios Complementares 6 Altere as classes InsereLivro e ListaLivro para que elas utilizem a fbrica de conexo. Execute-as novamente.34 www.k19.com.br
  • 44. 35 ADO.NET Desaos1 Implemente um teste que remove uma editora pelo id.2 Implemente um teste que altera os dados de uma editora pelo id. www.k19.com.br 35
  • 45. ADO.NET 3636 www.k19.com.br
  • 46. CAPTULO E NTITY F RAMEWORK 3 Mltiplas sintaxes da linguagem SQL No captulo anterior, utilizamos conexes ODBC para fazer uma aplicao C# interagir com osSGDBs. 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 indepen-dente da linguagem SQL. SELECT TOP 100 * FROM livros ORDER BY autor ASC Driver SQL Server ODBC SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY autor ASC) AS rownumber, id, titulo, autor FROM livros ) WHERE rownumber