Professional Documents
Culture Documents
Jlio Battisti
Aprovado em 30 Exames de Certicificao Microsoft:
MCP 2000 e 2003, MCP+I, MCSE +I, MCSE 2000, MCSE 2003, MCSA 2000, MCSA 2003, MCSD, MCDBA e MCDST
ASP.NET
Uma Revoluo na Construo de Sites e Aplicaes Web
Site: www.juliobattisti.com.br e-mail: webmaster@juliobattisti.com.br
I www.juliobattisti.com.br
Cursos de informtica. Artigos e dicas sobre Certificaes da Microsoft. Artigos sobre Carreira e Trabalho. Dicas de livros e sites sobre diversos assuntos. Simulados gratuitos, em portugus, para os exames da Microsoft.
PIRATARIA CRIME, COM PENA DE CADEIA. EU AGRADEO PELA SUA HONESTIDADE. SE VOC COMPROU UMA CPIA DESTE CURSO, DIRETAMENTE COM O AUTOR, NO DISTRIBUA CPIAS PARA OUTRAS PESSOAS. SE VOC RECEBEU UMA CPIA ILEGAL DESTE ARQUIVO, NO ADQUIRIDA DIRETAMENTE COM O AUTOR JLIO BATTISTI, ENTRE EM CONTATO E REGULARIZE A SUA CPIA.
www.juliobattisti.com.br
II
Agradecimentos
Escrever sobre um assunto novo e empolgante como ASP.NET , ao mesmo tempo, estimulante e desafiador. Estimulante porque representa uma mudana de paradigma e desafiador porque explicar de uma maneira clara e objetiva um assunto como ASP.NET uma tarefa rdua. Aos heris, muitas vezes annimos, que se lanaram na aventura de entender o ASP.NET e, principalmente, divulgar suas descobertas e vitrias, em inmeros sites gratuitos e listas de discusso da Internet, ficam os meus sinceros agradecimentos. O esprito de colaborao e coleguismo destas pessoas realmente admirvel. minha esposa Lu, pelo carinho, amor, dedicao, companheirismo e tolerncia. dona Lucy, minha me, por sempre me apoiar e ser uma grande admiradora e incentivadora de tudo o que fao. A meu Pai, em memria, pelo jeito simples e pacato, que me ensinou a parar e refletir nos momentos difceis. Aos meus irmos agradeo pelos bons momentos que juntos passamos. Aos amigos de Boqueiro do Leo, pelas poucas horas de lazer e diverso que pude usufruir neste ano de tanto trabalho. A vocs gostaria de dizer que sinto sinceras saudades da companhia de todos. equipe editorial da Axcel por acreditar e produzir mais um trabalho de minha autoria. Tambm no posso deixar de agradecer aos demais membros da Axcel Books, pela sua pacincia em produzir, corrigir e revisar mais este trabalho, sempre com sugestes para a melhoria do mesmo. A Deus por nos dar a inteligncia e a determinao na busca de cada vez fazer as coisas de uma maneira melhor e mais simples.
Sobre o Autor
Jlio Battisti profissional certificado da Microsoft, tendo sido aprovado em 21 Exames da Microsoft, com os quais obteve certificaes como: MCP, MCP+I, MCSE 2000, MCSE+I, MCDBA 2000 e MCSD. Trabalha como Gerente de rede na Secretaria da Receita Federal, e trabalha com o Framework .NET e o ASP.NET desde a verso Beta 1 do Framework .NET, lanada em Junho de 2000. Tambm autor de artigos de informtica e trabalha com o desenvolvimento e administrao de Web Sites. Atua como instrutor de cursos de informtica tanto na Secretaria da Receita Federal como para turmas em Universidades e outros cursos.
III
www.juliobattisti.com.br
www.juliobattisti.com.br
IV
DISPONVEL S EM PDF
SQL Server 2000: Administrao & Desenvolvimento Curso Completo - 816 pginas
O lanamento destinado aos usurios/leitores da verso anterior do SQL Server, o SQL 7, alm de redes de computadores em geral, Windows 2000 Server, TCP/IP, Bancos de Dados em geral, do Microsoft Access e do Visual Basic. O leitor aprender na obra destinada do iniciante ao avanado detalhes sobre o modelo de dados relacional, como instalar o SQL Server 2000 em diferentes plataformas, alm da criao e administrao de bancos de dados, tabelas e outros objetos. Aprenda ainda Como criar pginas ASP que acessam os dados do SQL Server 2000.
www.juliobattisti.com.br
Sumrio
Introduo: Uma Nova Revoluo no Desenvolvimento de Software?
Quem Deveria Ler Este Livro? Equipamento e Software Necessrios Instalando e Testando o IIS 5.0 Como Obter e Instalar o Microsoft .NET Framework SDK Configuraes do Servidor Utilizado Neste Livro Uma Viso Geral do Contedo do Livro Hora de Comear
1
2 2 4 9 12 13 13
PARTE 1: O Framework .NET e a Linguagem C# Captulo 1: Entendendo a Nova Proposta da Microsoft o Framework .NET
Introduo O Primeiro Contato com o Framework .NET Apresentando o Conceito de Servios Web Services Apresentando o CLR Common Language Runtime .NET Framework Class Library Um Pequeno Parnteses Para falar mal dos Modelos Anteriores Ai que Saudade do MS-DOS??? Prazer. Eu Sou o Windows! Redes e Internet Mais Problemas (ou Solues) Vista! Modelo em 2 Camadas Aplicaes em 3 Camadas Aplicaes em Quatro Camadas Questes a Considerarmos nos Modelos de 3 ou Mais Camadas Utilizados Atualmente De Volta ao Framework .NET: os Demais Elementos Linguagens Habilitadas ao .NET Um Rpida Apresentao do VB.NET Uma Rpida Apresentao do C# Common Type System Metadata Assemblies Interfaces com o Usurio Windows Forms Web Forms Os Servidores .NET
14 15
15 16 16 18 19 21 21 22 23 23 25 26 28 29 29 30 30 32 33 34 35 35 36 37
www.juliobattisti.com.br
VI
SUMRIO SQL Server 2000 Exchange Server 2000 BizTalk Server 2000 Commerce Server 2000 Application Center 2000 Host Integration Server 2000 Internet Security and Acceleration Server 2000 Mobile Information 2001 Server ADO.NET Concluso 39 39 39 40 40 40 40 40 41 43
45
45 46 47 47 47 48 49 50 51 51 52 54 54 55 55 60 61 62 62 64 68 69 72
Captulo 3: Apresentando o C#
Introduo Mais uma Linguagem de Programao? Como a cara de um Programa Escrito em C#?
73
73 74 75
VII
www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB Tipos da Linguagem C# Value Types O Tipo Struct Os Tipos de Enumerao Reference Types O Tipo String O Tipo Arrays Instrues de Fluxo de Controle no C# Instrues de Seleo A Instruo If A Instruo Switch Instrues de Repetio A Instruo For A Instruo While A Instruo do/while A Instruo Foreach Instrues de Salto (Jump) A Instruo Break A Instruo Continue A Instruo Goto A Instruo Return A Instruo Throw Concluso 82 83 86 90 92 92 96 99 100 100 105 109 110 114 117 120 123 123 123 123 124 124 124
125
125 126 126 127 130 131 131 133 134 137 137 140 140 140 141 141
www.juliobattisti.com.br
VIII
SUMRIO Indexadores (Indexers) Eventos (Events) Construtores e Destrutores de uma Classe Modificadores Para os Membros de uma Classe Adicionando Funcionalidade a uma Classe Mtodos O Polimorfismo Posto em Prtica Override Concluso 141 141 141 144 144 155 159
160
160 161 161 162 174 176 176 178 178 179 182 182 184 185 188 195
196 197
197 197 198 200 202 202 202 203 203 207 207
IX
www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB Check List Para Acompanhar os Exemplos Deste Livro ASP e ASP.NET Podem Rodar no Mesmo Servidor? Enfim Vamos Iniciar com ASP.NET A Extenso do Arquivo Mudou .aspx Inserindo Cdigo ASP.NET Um Pequeno Exemplo, s Para Comear Exemplo 1 Banco de Dados do SQL Server 2000 Para os Exemplos Deste Livro O Segundo Exemplo Conectando com um Banco de Dados Cad o meu Objeto Recordset? Conectando com o Banco de Dados Um Controle Poderoso Para Exibir os Dados Posso Ter um Comando que Ultrapassa uma Linha? O Bom e Velho SQL Continua o Mesmo? Concluso 207 209 209 209 210 212 212 216 216 219 219 220 220 220 221
223
223 224 224 225 225 227 234 235 236 236 237 238 238 239 242 244 250 251 254 254 255 256 256 263
www.juliobattisti.com.br
SUMRIO HTMLAnchor Control HtmlInputButton Control HtmlButton Control HtmlImage Control Concluso Introduo 267 269 270 273 277 279
279
280 281 282 282 282 283 287 293 297 300 305 308
309
309 310 310 311 312 312 318 320 324 326 329 331 337 343 345 347 350 353
XI
www.juliobattisti.com.br
355
355 356 358 359 359 360 362 362 363 363 364 369 374 376 380 382 388 405 405 407 413
414
414 415 415 418 422 422 425 425 434 435 440 440 446 456 460 465
www.juliobattisti.com.br
XII
474
474 475 475 477 511 529 531 532
PARTE 3: Conceitos Avanados do ASP.NET e Segurana Captulo 13: Web Services e Visual Studio .NET
Introduo Uma Introduo aos Web Services Possveis Utilizaes Para um Web Service O que Diferencia Web Services das Tecnologias de Componentes Como COM ou CORBA? Criando um Web Service Sintaxe Para a Criao de um Web Service Uma Maneira Fcil de Testar a Funcionalidade de um Web Service Proxies: Conceito e Criao Conceito Criando o Proxy Utilizando o Utilitrio Wsdl.exe Compilando o Arquivo CalculosLegais.cs Para Gerar a DLL Correspondente Disponibilizando a DLL Para que a Mesma Possa Ser Utilizada Utilizando o Web Service em uma Pgina ASP.NET O Novo Ambiente Grfico de Desenvolvimento Visual Studio .NET O que h de Novo no Visual Studio .NET Concluso
533 534
534 535 537 538 539 539 541 545 545 546 549 550 552 558 558 577
579
579 580 581 583 587 592
XIII
www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB Sistemas de Arquivos no Windows 2000 e Permisses NTFS Definindo Permisses NTFS Autenticao Bsica Autenticao Integrada do Windows Autenticao Utilizando Certificados Mapeamento do Certificado Cliente Configurando o Tipo de Autenticao no IIS Mais Configuraes de Segurana do IIS Configurando Opes Gerais de Segurana Configurando de Segurana Para Aplicativos Web no IIS Definindo Restries de Acesso em Nvel de Endereo IP Mecanismos de Segurana do Banco de Dados O que uma Aplicao Web no IIS? Uma Aplicao Cliente/Servidor Tradicional Aplicaes Web um Novo Paradigma O que uma Aplicao Web no IIS? Configuraes de Segurana com o Arquivo Web.Config Impersonation O Arquivo Web.Config Definindo o Tipo de Autenticao Definindo os Usurios e Grupos que Tm Permisso de Acesso Aplicao Concluso 593 596 603 604 605 606 606 610 610 613 615 619 620 620 621 622 629 629 630 634 634 639
641
641 642 655 667 670 675 681 682 682 683 683 684 684 691
www.juliobattisti.com.br
XIV
SUMRIO
693
693 694 694 696 696 700 703 704 709
710
710 710 712 712 713 713 714 717 717 719 720 722 727 734 737 740 745
745
746 747 749 750 751 752 753 754 755
XV
www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB Primeira Forma Normal Segunda Forma Normal Terceira Forma Normal Passos Para Projetar um Banco de Dados Concluso 755 756 757 758 760
761
761 761 761 762 769 771 771 772 772 774 776 778 781
782
782 785
www.juliobattisti.com.br
XVI
INTRODUO
INTRODUO
Desde Junho de 2000 que a Microsoft vem anunciando a sua iniciativa .NET. Milhares de artigos j foram escritos sobre esta mais nova empreitada da gigante de Seattle. A idia bsica por detrs desta iniciativa uma mudana, radical, no modelo de desenvolvimento, comercializao e utilizao de Software. A iniciativa .NET a viso da Microsoft para um mundo em que o software passa a ser comercializado na forma de Servios, os quais so acessados atravs da Internet, utilizando-se protocolos padro como XML (Extensible Markup Language) e SOAP (Simple Object Access Protocol). So muitos os elementos que do suporte ao .NET, dentre os quais destacam-se uma linha de servidores conhecidos como Servidores .NET, o sistema operacional Windows 2000 e suas futuras verses, alm de um novo conjunto de ferramentas de desenvolvimento, conjunto este batizado de Visual Studio Next Generation ou comercialmente conhecido como Visual Studio .NET. Um mundo em que o Software visto como servios, os quais podem ser acessados, atravs da Internet, por qualquer computador ou dispositivo autorizado, no nenhuma novidade ou inveno da Microsoft. Empresas como IBM, Sun e ORACLE possuem suas prprias ferramentas e iniciativas nesta direo, algumas inclusive em estgios bastante avanados de desenvolvimento. A plataforma .NET a aposta da Microsoft nesta
NOTA: Para uma relao completa de todas as alteraes da verso Beta 2 em relao Beta 1, consulte o seguinte endereo: http:// www.123aspx.com/ b1to2changes/ default.asp.
direo. Porm todos sabemos que nenhuma empresa no mundo sabe divulgar to bem suas iniciativas e produtos como a Microsoft. Quando o .NET foi anunciado em Junho de 2000, os elementos que davam suporte iniciativa ainda encontravamse na verso Beta 1. Em Junho de 2001, portanto um ano depois, foi lanada a verso Beta 2, conhecida como Microsoft .NET Framework SDK. A verso Beta 2 apresentou inmeras alteraes, inclusive com a retirada de alguns
www.juliobattisti.com.br
NOTA: So vrias as maneiras de se referir nova plataforma .NET da Microsoft: DOT.NET, .NET, Plataforma .NET, Iniciativa .NET, Framework .NET
possibilidade de conhecer os fundamentos bsicos de uma nova linguagem C#, bem como os elementos bsicos do .NET e a nova verso do ASP ASP.NET. Em resumo, nos captulos e anexos deste livro, voc encontrar todas as informaes necessrias para entender o modelo .NET. Tambm apresentaremos os elementos bsicos da nova linguagem C#. Uma vez conhecendo o modelo .NET e a linguagem C#, estaremos aptos a criar aplicaes utilizando ASP.NET.
www.juliobattisti.com.br
INTRODUO
A configurao mnima necessria depende de uma srie de fatores, conforme descrito a seguir. Se o equipamento vai ser utilizado como um servidor Web na Internet, vrios so os aspectos a serem considerados, tais como:
NOTA: Poderamos utilizar o Windows 98 ou Me, porm algumas opes no estariam disponveis, uma vez que o servidor Web para esta plataforma o PWS Personal Web Server, o qual possui um nmero reduzido de funcionalidades em relao ao IIS.
Aplicaes implementadas e recursos de hardware necessrios, tais como memria, disco e processador. Nmero estimado de acessos simultneos e dirios, sendo esta uma das estimativas mais difceis de se obter, uma vez que o sucesso de um site pode ser determinado por um nmero muito grande de fatores, nem todos de fcil mensurao. Grau de segurana necessrio e desejvel. Neste caso, entram questes como criptografia, uso de certificados digitais, criao de VPN Virtual Private Networks (Redes Privadas Virtuais), procedimentos de recuperao falha, plano de contingncia, etc.
Percentual de folga desejado para recursos tais como: memria, processador, disco. Ao projetar um site, bastante comum utilizar hardware que atenda as necessidades atuais com uma certa folga, para que seja possvel atender a crescimentos maiores do que os estimados. Alguns sites famosos j enfrentaram problemas de crescimentos maiores do que o esperado. Quando isso acontece, mais recursos de hardware precisam ser adicionados com o site em funcionamento.
Para maiores informaes sobre como planejar a capacidade de hardware para um servidor Web com o IIS 5.0, consulte o captulo Capacity Planning do livro Internet Information Services Resource Guide, o qual parte integrante do Windows 2000 Server Resource Kit. Como equipamento para ser utilizado em casa, ou em um laboratrio de teste na sua empresa, aconselho a seguinte configurao:
Processador Pentium 450 ou superior. 128 MB de RAM, sendo 256 MB, altamente recomendveis. 6 GB de Disco rgido.
Com menos de 128 MB de RAM, o desempenho, mesmo para uma mquina de testes, fica muito comprometido. Alm do Windows 2000 Server e do IIS 5.0, tambm precisaremos ter os seguintes programas e servios instalados, para que possamos acompanhar os exemplos deste livro:
Internet Explorer 5.01 ou superior. Microsoft .NET Framework SDK Beta 2. Veremos como fazer o download e instalar este Framework mais adiante, nesta introduo.
Em cada um dos captulos, estaremos apresentando uma srie de exemplos prticos. Atravs destes exemplos, voc poder entender melhor a aplicao dos conceitos tericos apresentados. Em muitas situaes, a melhor maneira de
www.juliobattisti.com.br
www.juliobattisti.com.br
INTRODUO
6. 7. 8. 9. Surgir a janela indicada na Figura 2. D um clique no boto Componentes. Ser exibida, por breves instantes, uma mensagem Aguarde.... Depois surge a janela Assistente de componentes do Windows, conforme indicado na Figura 3. Utilizando o Assistente de componentes do Windows, podemos adicionar novos servios, ou remover servios que no sejam mais necessrios. 10. V descendo com a barra de rolagem vertical, at localizar o item Internet Information Services (IIS), conforme indicado pela Figura 4.
www.juliobattisti.com.br
DICA: Instale somente os servios realmente necessrios. No uma boa idia instalar todos os servios disponveis, mesmo que somente alguns sejam utilizados. Quanto mais servios instalados, maiores as possibilidades de ataque e quebra da segurana do site, por parte de um hacker, alm de consumir memria e processador desnecessariamente.
14. Ao instalarmos o IIS 5.0, podemos escolher um ou mais dos seus componentes, dependendo das necessidades do nosso site. No necessrio que todos os componentes do IIS 5.0 sejam instalados. Por exemplo, se o servio de cpia de arquivos no for necessrio, no temos por que instalar o servio de ftp. 15. Clique no boto Detalhes. 16. Na lista de opes disponveis, certifique-se de que somente as seguintes esto marcadas:
Arquivos comuns. Documentao. Extenses de servidor do FrontPage 2000. Gerenciador de Internet Services (HTML). Servidor File Transfer Protocol (FTP). Servidor World Wide Web.
www.juliobattisti.com.br
INTRODUO
17. Observe que, aps ter selecionado os componentes a serem instalados, o Windows 2000 Server exibe o espao em disco necessrio, conforme indicado pela Figura 5. 18. D um clique em OK. Voc estar de volta ao Assistente de componentes do Windows.
www.juliobattisti.com.br
Agora que j temos o IIS 5.0 instalado e testado, temos que partir para a instalao do Microsoft .NET Framework SDK. Este Framework instala todos os componentes necessrios para que possamos criar pginas ASP.NET, utilizar a linguagem C#, alm de todos os demais componentes necessrios para o .NET. importante salientar que o Visual
www.juliobattisti.com.br
INTRODUO
Studio .NET no faz parte deste Framework. No Captulo 13 veremos a instalao e configurao do Visual Studio .NET. No momento em que este livro estava sendo escrito, o Visual Studio .NET encontrava-se em Beta 2.
www.juliobattisti.com.br
www.juliobattisti.com.br
10
INTRODUO
7. Se existir algun servio que ser atualizado, em uso, o assistente de instalao avisa e pede para que o respectivo servio seja parado. Para parar um servio voc pode utilizar o comando Iniciar -> Programas -> Ferramentas Administrativas -> Servios. 8. 9. Aps a verificao dos servios ser exibida uma tela informando que o MDAC 2.7 ser instalado. D um clique no boto Concluir e a instalao ser iniciada. Dentro de poucos minutos surge uma tela informando que o MDAC 2.7 foi instalado com sucesso. D um clique no boto Close, para fechar esta tela. Aps a instalao do MDAC 2.7, estamos prontos para iniciar a instalao do Microsoft .NET Framework SDK. Para instalar o Microsoft .NET Framework SDK faa o seguinte: 1. 2. 3. 4. 5. 6. 7. 8. Localize o arquivo Setup.exe que voc copiou anteriormente. D um clique duplo no mesmo para iniciar a instalao. Surge uma tela perguntando se voc deseja iniciar a instalao. D um clique no boto Sim para seguir adiante. O programa de instalao iniciar a extrao dos arquivos necessrios instalao. Este procedimento demora alguns minutos. Encerrada e extrao, surgir a tela inicial do assistente de instalao. D um clique no boto Next para seguir para a prxima etapa. Na segunda etapa voc precisa marcar a opo I accept the agreement, para aceitar o contrato de licena do Framework .NET e seguir adiante. Marque a opo I accept the agreement e d um clique no boto Next para ir para a prxima etapa. Nesta etapa temos a opo the instalar o SDK (Software Development Kit) que o Framework .NET propriamente dito, os exemplos. Observe que a opo para instalar a Documentao j vem marcada e no pode ser desmarcada. 9. Por padro todas as opes j vm marcadas. Vamos aceitar este padro. D um clique no boto Next para ir para a prxima etapa. 10. Nesta etapa devemos def inir a pasta de destino. Por padro selecionada a pasta: \Arquivos de programas\Microsoft.NET\FrameworkSDK\ do drive onde est instalado o Windows 2000. Vamos aceitar a pasta sugerida pelo Setup. D um clique no boto Next para ir para a prxima etapa. 11. Nesta etapa iniciada a instalao dos diversos componentes. Este processo demora alguns minutos. medida que os componentes vo sendo instalados, o andamento da instalao vai sendo exibido, conforme indicado na Figura 10. 12. No final surge uma mensagem dizendo que a instalao foi completada com sucesso. D um clique no boto OK para fechar esta mensagem. Agora o Microsoft .NET Framework est instalado e pronto para ser utilizado. Com isso instalamos todo o Software necessrio para acompanhar os exemplos deste livro. Apenas para confirmar, podemos verificar se a instalao ocorreu com sucesso. Selecione o comando Iniciar -> Programas -> Microsoft .NET Framework SDK. Dentre as vrias opes exibidas selecione a opo Documentation.
11
www.juliobattisti.com.br
Pentium 450 256 MB RAM Windows 2000 Server em Portugus IIS 5.0 Microsoft .NET Framework SDK Nome do servidor: Servidor Endereo IP: 10.204.123.1 Mscara de sub-rede: 255.255.255.0 Domnio DNS: groza.com
O endereo para acessar a pgina inicial do servidor o seguinte: http://www.groza.com ou http://localhost. Sempre que for feita referncia a um destes dois endereos, voc deve substituir pelo endereo do equipamento que voc est utilizando para acompanhar os exemplos deste livro.
www.juliobattisti.com.br
12
INTRODUO
Parte 1 Captulos 1 a 5: Nesta parte trataremos sobre o Framework .NET, o que o mesmo apresenta de novo, quais os seus principais componentes e como o mesmo pode tornar mais fcil, rpido e eficiente o desenvolvimento de aplicaes. Tambm veremos os fundamentos bsicos da nova linguagem C# (leia-se C Sharp). Parte 2 Captulos 6 a 12: Veremos o que o ASP.NET, quais as novas caractersticas e como criar pginas ASP.NET. Aprenderemos a conectar pginas com Bancos de Dados, utilizando ADO.NET e tambm a hierarquia de classes do Framework .NET. Parte 3 Captulo 13 em diante: Nesta parte final do livro veremos alguns exemplos de aplicativos utilizando ASP.NET bem como diversas tcnicas e dicas teis para a criao de aplicativos com ASP.NET. Vamos aprender a instalar o Visual Studio .NET e utiliz-lo para a criao e publicao de pginas ASP.NET. Veremos o que so e como criar Web Services. Tambm trataremos sobre segurana.
Hora de Comear
Agora que j temos o nosso computador preparado para acompanhar os exemplos deste livro, hora de iniciarmos o nosso aprendizado. Conforme veremos, o .NET representa uma mudana radical em relao aos modelos de programao anteriores. Aprender um novo modelo uma tarefa desafiadora. Lembram do programador COBOL para o Mainframe tendo que aprender programao estruturada e, depois, tendo que passar de programao estruturada para orientao a objetos? Se voc est justamente querendo aprender os conceitos deste novo modelo, ento este o livro certo. Apresentaremos as principais dvidas para aqueles que esto iniciando com o .NET e com ASP.NET. O cdigo-fonte para os exemplos em C# e para as pginas ASP.NET dos captulos deste livro esto disponveis para download no site da editora Axcel Books em www.axcel.com.br. Caso voc tenha sugestes sobre tpicos que gostaria de ver includos em futuras edies deste livro, ou queira relatar algum erro encontrado no livro, basta entrar em contato atravs do e-mail: livroaspnet@juliobattisti.com.br. Desejo a todos uma boa leitura e tenho certeza de que este trabalho ir ajud-los no entendimento deste novo paradigma de programao, bem como ir ajud-los a, rapidamente, criar aplicaes Web baseadas em ASP.NET.
13
www.juliobattisti.com.br
PARTE
1
O Framework .NET e a Linguagem C#
www.juliobattisti.com.br
14
Introduo
Neste captulo apresentaremos o Framework .NET. Veremos qual a proposta da Microsoft com mais esta iniciativa. Iniciaremos o captulo com uma viso geral, de alto nvel, sobre as propostas do Framework .NET. Em outras palavras: A que veio e a que se prope o .NET? Vamos mostrar quais os principais componentes e quais solues pode nos oferecer o Framework .NET. Antes de entrarmos nos detalhes sobre cada elemento e das funes de cada elemento, importante entendermos como este novo modelo poder ajudar no desenvolvimento de Software e, em conseqncia, ajudar as empresas a terem sistemas melhores, mais rpidos, mais econmicos e mais sintonizados com as reais necessidades de cada empresa. Uma vez devidamente apresentado o Framework .NET, falaremos sobre os modelos atuais de desenvolvimento e utilizao de Software. Veremos quais os problemas do modelo atual e quais as solues propostas para estes problemas, pelo Framework .NET. Um novo paradigma de desenvolvimento tem que mostrar que capaz de resolver, se no todos, pelo menos a grande maioria dos problemas dos modelos existentes. J passou o tempo, se que um dia esta prtica foi aceitvel, de mudar de tecnologia somente para estar atualizado com o mercado. Aprender novas tcnicas e ferramentas envolve tempo, um longo aprendizado e, principalmente, pesados investimentos financeiros. Para que uma empresa esteja disposta a fazer todos estes investimentos, o Framework .NET ter que demonstrar que realmente capaz de apresentar solues para os grandes problemas dos modelos atuais de desenvolvimento de software. Em seguida passaremos a apresentar os principais elementos que compem o Framework .NET:
CAPTULO
1
Entendendo a Nova Proposta da Microsoft o Framework .NET
CLR Common Language Runtime Metadata Assemblies Linguagens habilitadas ao .NET Common Type System Interoperabilidade entre diferentes linguagens Web Services Os servidores .NET ADO.NET
15
www.juliobattisti.com.br
uma mudana to grande ou at maior do que a mudana do DOS para o Windows; O Framework .NET foi todo projetado j tendo a Internet como objetivo, diferente de outras plataformas que foram adaptadas para a Internet, medida que a rede mundial crescia de importncia.
www.juliobattisti.com.br
16
17
www.juliobattisti.com.br
Para o formato dos dados, o Framework .NET utiliza XML Extensible Markup Language. Conforme veremos mais adiante, o XML vem ganhando fora como um padro para troca de informaes na Internet, principalmente para troca de informaes entre empresas em sites de Comrcio Eletrnico. Como protocolo de transporte, o Framework .NET utiliza o SOAP Single Object Access Protocol. Com SOAP podemos fazer com que toda a comunicao entre diferentes Web Services e demais componentes de um programa seja feita atravs do protocolo padro da Internet que o HTTP. O SOAP no um protocolo criado pela Microsoft para ser utilizado pelo .NET. O SOAP um padro da indstria, sendo utilizado por produtos de diversas empresas, como IBM, Sun e ORACLE.
Pode parecer que no existe nada de novo nesta abordagem, pois tecnologias para criar programas a partir de componentes prontos j existem h um bom tempo: COM+, CORBA, etc. Porm a grande vantagem dos Web Services, no Framework .NET, que os mesmos podem ser acessados, facilmente, atravs da utilizao de um protocolo padro: SOAP e trocando informaes em um formato padro: XML. Esta abordagem torna a criao e utilizao dos Web Services uma tarefa muito mais simples do que, por exemplo, a criao de componentes COM+ ou CORBA, os quais utilizam formatos de dados e protocolos de comunicao proprietrios. Falaremos mais sobre Web Services e tambm aprenderemos a cri-los, mais adiante neste livro.
O Runtime (ambiente de execuo) o ambiente que d suporte execuo das aplicaes .NET. Quando um programa .NET executado, todo o controle do mesmo feito atravs do CLR. Para aplicaes anteriores, desenvolvidas utilizando COM/COM+, o programador era responsvel por inserir no cdigo do programa uma srie de funes necessrias ao correto funcionamento do mesmo, como por exemplo o Gerenciamento de memria, criao e destruio de objetos. A codificao destas funes no era uma tarefa fcil, o que exigia muito tempo do programador, alm de conhecimentos avanados. Com aplicaes .NET, todas estas funes so executadas pelo CLR, ou seja, o programador no precisa preocupar-se com as mesmas. Desta forma somente precisamos nos preocupar com a funcionalidade do nosso programa, o que poupa tempo e agiliza o processo de desenvolvimento. As aplicaes criadas em uma das linguagens habilitadas para o .NET (como VB.NET, C# ou ASP.NET), ao serem compiladas, geram um cdigo intermedirio conhecido como MSIL Microsoft Intermediate Language, o qual abreviado simplesmente como IL Intermediate Language. Este cdigo que executado pelo CRL. Vamos analisar o diagrama apresentado na Figura 1.2:
www.juliobattisti.com.br
18
Para que uma linguagem seja habilitada ao .NET, o seu compilador deve ser capaz de gerar cdigo MSIL. O Cdigo MSIL gerado executado pelo CRL.
A prpria Microsoft no nega que a idia bastante semelhante ao ambiente de execuo para aplicaes desenvolvidas em Java, onde temos um ambiente de execuo comum a Mquina Virtual Java, a qual executa byte code, que o cdigo gerado pelas aplicaes Java. Todas as linguagens habilitadas ao .NET tm a sua disposio um rico conjunto de classes e objetos, os quais fornecem desde conexo com banco de dados at funes mais especficas, como funes grficas, de escrita em disco, etc. Este conjunto de classes e objetos conhecido como .NET Framework class library. Todo cdigo habilitado a rodar no CLR, ou seja, que pode ser compilado para MSIL conhecido como managed code ou cdigo gerenciado. Cdigo antigo, como por exemplo COM ou COM+, os quais no esto habilitados para rodar sob controle do CLR so chamados de unmanaged code ou cdigo no gerenciado. Veremos mais detalhes a respeito destas definies no Captulo 2, onde trataremos o CLR em mais detalhes.
19
www.juliobattisti.com.br
NOTA: J existem diversos fabricantes trabalhando para habilitar suas linguagens de desenvolvimento para o Framework .NET.
Manipulao de String Conectividade com banco de dados Acesso a arquivos Segurana Manipulao de dados
Na Figura 1.3, temos uma viso geral dos principais elementos que formam o Framework .NET.
www.juliobattisti.com.br
20
Um programa para o ambiente MS-DOS, na grande maioria das vezes, era composto por um arquivo executvel (.exe). Os demais arquivos necessrios ao funcionamento do programa, tais como imagens grficas ou arquivos de dados, eram salvos, normalmente, no mesmo diretrio (na poca do MS-DOS no falvamos em Pastas) do arquivo executvel e tudo funcionava perfeitamente bem. Para instalar o programa em outro computador, bastava copiar o diretrio do programa e pronto, nada mais precisava ser feito. Podemos ver que o processo de instalao era bastante simplificado, mas em contrapartida o desenvolvimento era todo manual e as funcionalidades bastante limitadas. As redes locais ainda no eram realidade e a grande maioria dos programas era feito para trabalhar em um nico computador, acessando dados locais. Comunicao entre programas, reaproveitamento de cdigo e acesso via rede eram coisas raras ou inexistentes. Para as necessidades da poca, era um modelo plenamente satisfatrio. A maior prova disso que, ainda hoje, facilmente encontramos programas feitos em Clipper, para o ambiente MS-DOS, rodando em pequenos estabelecimentos, dando suporte a todas as operaes dirias. Tente voc propor que estas pessoas substituam seus programas em Clipper, que atendam perfeitamente s necessidades destes pequenos estabelecimentos, por programas para Windows com interface grfica. Com certeza voc receber um sonoro NO. Porm logo as redes comeariam a invadir as empresas, os programas a tornar-se mais complexos. Com o advento das redes e do sucesso dos PCs, mais e mais pessoas comearam a utilizar computadores. A velha interface a caracter do MS-DOS no atendia mais as necessidades. Neste momento que o Windows comea a surgir no mercado.
21
www.juliobattisti.com.br
Se alguma das configuraes, necessrias ao funcionamento do programa, fosse alterada, o programa deixava de funcionar. Isto gerava uma chamada ao pessoal de suporte que, na maioria das vezes, somente conseguia resolver a situao reinstalando o programa. Os arquivos .DLL poderiam ser utilizados por mais do que um programa. Pode acontecer uma situao em que um programa que esteja sendo instalado substitua uma determinada .DLL por uma verso mais nova do que a verso da .DLL atualmente existente no sistema. O problema que podem existir programas que dependam da verso mais antiga. Nesta situao os programas que dependem da verso mais antiga simplesmente deixaro de funcionar. Pode tambm acontecer o contrrio, ou seja, um programa que est sendo instalado substitui uma .DLL por uma verso mais antiga, fazendo com que outros programas deixem de funcionar. Em situaes mais crticas poderia acontecer de o programa que est sendo instalado substituir uma .DLL vital para o Windows. Nestas situaes todo o sistema deixaria de funcionar e, em alguns casos, somente uma reinstalao poderia resolver o problema.
Vejam que o que parecia uma boa soluo acabou se mostrando um verdadeiro pesadelo para gerenciar e manter em funcionamento. Nesta poca surge, inclusive, a expresso DLL Hell, que poderamos traduzir por: O Inferno das DLLs.
Cada vez que um programa fosse alterado, o mesmo precisaria ser reinstalado em todos os computadores onde fosse necessria a nova verso. E se, ao fazer a atualizao para a nova verso, fosse substituda alguma .DLL necessria ao funcionamento de algum outro programa? Novos problemas para o pessoal do suporte. Vejam que este modelo gera uma grande carga de suporte, o que encarece muito a manuteno em funcionamento de uma estao de trabalho da empresa.
www.juliobattisti.com.br
22
Modelo em 2 Camadas
No incio da utilizao do modelo Cliente/Servidor, as aplicaes foram desenvolvidas utilizando-se um modelo de desenvolvimento em duas camadas. Neste modelo, um programa, normalmente desenvolvido em um ambiente de desenvolvimento, como o Visual Basic, Delphi ou Power Builder, instalado em cada estao de trabalho Cliente. Este programa acessa dados em um servidor de banco de dados, conforme ilustrado na Figura 1.5. Neste modelo, temos um programa que instalado no Cliente. Programa esse que faz acesso ao banco de dados que fica residente no Servidor de Banco de dados. Na maioria dos casos, a mquina do cliente um PC rodando Windows, e a aplicao Cliente desenvolvida utilizando-se um dos ambientes conhecidos, conforme citado anteriormente.
23
www.juliobattisti.com.br
Apresentao: O cdigo que gera a interface visvel do programa faz parte da aplicao cliente. Todos os formulrios, menus e demais elementos visuais esto contidos no cdigo da aplicao cliente. Caso sejam necessrias alteraes na interface do programa, faz-se necessria a gerao de uma nova verso do programa, e todas as estaes de trabalho que possuem a verso anterior devem receber a nova verso, para que o usurio possa ter acesso s alteraes da interface. A que comeam a surgir os problemas no modelo em 2 camadas: uma simples alterao de interface suficiente para gerar a necessidade de atualizar a aplicao, em centenas ou milhares de estaes de trabalho. O gerenciamento desta tarefa algo extremamente complexo e oneroso financeiramente. Lgica do Negcio: As regras que definem a maneira como os dados sero acessados e processados so conhecidas como Lgica do Negcio. Fazem parte das Regras do Negcio, desde funes simples de validao da entrada de dados, como o clculo do dgito verificador de um CPF, at funes mais complexas, como descontos escalonados para os maiores clientes, de acordo com o volume da compra. Questes relativas a legislao fiscal e escrita contbil tambm fazem parte da Lgica do Negcio. Por exemplo, um programa para gerncia de Recursos Humanos, desenvolvido para a legislao dos EUA, no pode ser utilizado, sem modificaes, por uma empresa brasileira. Isso acontece porque a legislao dos EUA diferente da legislao brasileira. Em sntese, as regras para o sistema de recursos humanos so diferentes. Alteraes nas regras do negcio so bastante freqentes, ainda mais com as repetidas mudanas na legislao do nosso pas. Com isso, faz-se necessria a gerao de uma nova verso do programa, cada vez que uma determinada regra muda, ou quando regras forem acrescentadas ou retiradas. Desta forma, todas as estaes de trabalho que possuem a verso anterior devem receber a nova verso, para que o usurio possa ter acesso s alteraes. Agora temos mais um srio problema no modelo de 2 camadas: qualquer alterao nas regras do negcio suficiente para
www.juliobattisti.com.br
24
Aplicaes em 3 Camadas
Como uma evoluo do modelo de 2 camadas, surge o modelo de trs camadas. A idia bsica do modelo de 3 camadas retirar as Regras do Negcio, da aplicao Cliente e centraliz-las em um determinado ponto, o qual chamado de Servidor de Aplicaes. O acesso ao banco de dados feito atravs das regras contidas no Servidor de Aplicaes. Ao centralizar as Regras do Negcio em um nico ponto, fica muito mais fcil a atualizao das mesmas. A Figura 1.6 nos d uma viso geral do modelo em 3 camadas:
25
www.juliobattisti.com.br
Apresentao: Continua no programa instalado no cliente. Alteraes na Interface do programa ainda iro gerar a necessidade de atualizar a aplicao em todas as estaes de trabalho, onde a aplicao estiver sendo utilizada. Porm cabe ressaltar que alteraes na interface so menos freqentes do que alteraes nas regras do negcio. Lgica: So as regras do negcio, as quais determinam de que maneira os dados sero utilizados e manipulados. Esta camada foi deslocada para o Servidor de Aplicaes. Desta maneira, quando uma regra do negcio for alterada, basta atualiz-la no Servidor de Aplicaes. Aps a atualizao, todos os usurios passaro a ter acesso nova verso, sem que seja necessrio reinstalar o programa em cada um dos computadores da rede. Vejam que, ao centralizar as regras do negcio em um Servidor de Aplicaes, estamos facilitando a tarefa de manter a aplicao atualizada. As coisas esto comeando a melhorar. Dados: Nesta camada temos o servidor de Banco de dados, no qual reside toda a informao necessria para o funcionamento da aplicao. Cabe reforar que os dados somente so acessados atravs do Servidor de Aplicao, e no diretamente pela aplicao cliente.
Com a introduo da camada de Lgica, resolvemos o problema de termos que atualizar a aplicao, em centenas ou milhares de estaes de trabalho, toda vez que uma regra do negcio for alterada. Porm continuamos com o problema de atualizao da interface da aplicao, cada vez que sejam necessrias mudanas na Interface. Por isso que surgiram os modelos de n-camadas. No prximo tpico, iremos falar um pouco sobre o modelo de 4 camadas.
Cliente: Neste caso o Cliente o Navegador utilizado pelo usurio, quer seja o Internet Explorer, quer seja o Netscape Navigator, ou outro navegador qualquer. Apresentao: Passa para o Servidor Web. A interface pode ser composta de pginas HTML, ASP, PHP, Flash ou qualquer outra tecnologia capaz de gerar contedo para o navegador. Com isso alteraes na interface da aplicao so feitas diretamente no servidor Web, sendo que estas alteraes estaro, automaticamente, disponveis para todos os Clientes. Com este modelo no existe a necessidade de reinstalar a aplicao em
www.juliobattisti.com.br
26
Lgica: So as regras do negcio, as quais determinam de que maneira os dados sero utilizados. Esta camada est no Servidor de Aplicaes. Desta maneira, quando uma regra do negcio for alterada, basta atualiz-la no Servidor de Aplicaes. Aps a atualizao, todos os usurios passaro a ter acesso nova verso, sem que seja necessrio reinstalar o programa em cada estao de trabalho da rede. Vejam que, ao centralizar as regras do negcio em um Servidor de Aplicaes, estamos facilitando a tarefa de manter a aplicao atualizada. Dados: Nesta camada temos o servidor de Banco de dados, no qual reside toda a informao necessria para o funcionamento da aplicao.
Com o deslocamento da camada de apresentao para um Servidor Web, resolvemos o problema de termos que atualizar a aplicao, em centenas ou milhares de computadores, cada vez que uma interface precisar de alteraes. Neste ponto a atualizao das aplicaes uma tarefa mais gerencivel, muito diferente do que acontecia no caso do modelo em 2 camadas. Os servidores de Aplicao, Web e banco de dados no precisam necessariamente ser servidores separados, isto , uma mquina para fazer o papel de cada um dos servidores. O conceito de servidor de Aplicao, servidor Web ou servidor de Banco de dados um conceito relacionado com a funo que o servidor desempenha. Podemos ter, em um mesmo equipamento, um Servidor de aplicaes, um servidor Web e um servidor de Banco de dados. Claro que questes de desempenho devem ser levadas em considerao. Tambm podemos ter a funcionalidade do Servidor de Aplicaes distribuda atravs de vrios servidores, com cada servidor tendo alguns componentes que formam parte das funcionalidades da aplicao. Este modelo onde temos
27
www.juliobattisti.com.br
www.juliobattisti.com.br
28
Podemos criar nossos programas em qualquer uma destas linguagens. Ao compilarmos o programa, o resultado ser cdigo MSIL, o qual passa a ser executado pelo CLR. Quando a Inprise lanar o Delphi habilitado ao .NET, teremos
29
www.juliobattisti.com.br
Foram adicionadas mais caracterstica de orientao a objetos, tais como herana verdadeira, construtores parametrizados e overriding de mtodos e propriedades. Mais facilidades para o desenvolvimento de aplicaes Internet. Por exemplo, para criar pginas ASP.NET, ao invs de VBScript utilizamos diretamente o VB.NET ou o C#. Herana visual: Esta uma caractersticas que os desenvolvedores do Delphi j tinham h algum tempo. Com o VB.NET podemos criar um formulrio com as caractersticas bsicas para todos os formulrios da aplicao. Quando precisarmos de um formulrio com caractersticas adicionais, podemos construir este novo formulrio baseado, isto , herdando as caractersticas do formulrio bsico; depois s adicionar os elementos necessrios. Ao criarmos o nosso formulrio, herdando do formulrio bsico, o formulrio que est sendo criado ter, automaticamente, todos os elementos do formulrio bsico. Alm dos elementos grficos, o cdigo para tratamento de eventos tambm herdado. O melhor de tudo que, ao alterarmos o formulrio bsico, todas as alteraes so refletidas nos formulrios herdados. A herana visual facilita, enormemente, a criao de aplicaes que tenham uma interface consistente e de fcil alterao. Tratamento estruturado de excees: com o VB.NET, temos muito mais recursos para o tratamento de erros e excees do que o bom e velho On Error do Visual Basic. Isso faz com que possamos criar programas mais confiveis.
Falar sobre as novidades do VB.NET assunto para um captulo inteiro. Ensinar o VB.NET: assunto para um livro inteiro. Em um trabalho futuro estaremos tratando desta nova e excitante verso do VB.
Uma linguagem orientada a objetos e to poderosa quanto o C++. Uma linguagem to fcil de utilizar quanto o VB.
O pessoal da Microsoft realmente conseguiu aliar estas duas caractersticas em uma s linguagem: Poder e Simplicidade. Conforme veremos nos captulos 3, 4 e 5, o C# de fcil aprendizagem e utilizao, ao mesmo tempo que nos fornece poderosos mecanismos, antes s encontrados no C++.
www.juliobattisti.com.br
30
public static void Main() { string umamensagem = Hello World !!!; Console.WriteLine(umamensagem); } }
Salve este programa no disco com o nome de primeiroprograma.cs. Agora vamos compilar o programa e execut-lo. Para compilar o programa, abra um Prompt de Comando (Iniciar -> Programas -> Acessrios -> Prompt de comando). Na janela do prompt v para a pasta onde voc salvou o arquivo hello.cs e execute o seguinte comando:
csc primeiroprograma.cs
Com este comando estamos compilando o arquivo-fonte primeiroprograma.cs, para gerar um executvel .exe. O resultado deste comando indicado na Figura 1.8, onde utilizamos o comando dir, para mostrar que a compilao gerou o executvel primeiroprograma.exe. Para executar o nosso programa, basta digitar primeiroprograma e pressionar Enter. O programa ser executado, conforme indicado na Figura 1.9. Bem, por enquanto isto, fizemos apenas uma pequena apresentao da linguagem C#. Teremos trs captulos deste livro (3, 4 e 5), para tratar desta linguagem. Apenas um ltimo detalhe para o qual gostaria de chamar a ateno: Observe, para aqueles que conhecem Java ou C++, a semelhana entre a estrutura de um programa em C# e um programa em uma destas linguagens.
31
www.juliobattisti.com.br
www.juliobattisti.com.br
32
Fornece uma estrutura que possibilita a integrao entre diferentes linguagens habilitadas ao .NET, com uma execuo mais rpida, uma vez que a sobrecarga para a converso entre os diferentes tipos de diferentes linguagens deixa de existir. Fornece uma estrutura de tipos com base em um modelo orientado a objetos, o que facilita a criao de novas linguagens habilitadas ao .NET, favorecendo a utilizao de boas prticas de programao, como por exemplo a herana. Uma vez que os tipos so objetos, podemos criar tipos derivados dos objetos bsicos, os quais herdam todas as caractersticas dos objetos bsicos. O CTS define algumas regras que toda linguagem deve seguir, para ser habilitada ao .NET. Por seguirem um conjunto de regras comum, a interao entre programas escritos em diferentes linguagens fica bem mais fcil.
No Captulo 2, quando detalharemos o CLR, vamos detalhar um pouco mais sobre o CTS.
Metadata
Na seo Questes a considerarmos nos modelos de 3 ou mais camadas utilizados atualmente, descrevemos, como uma das inconvenincias do modelo de componentes baseados em COM/COM+, o fato de que os mesmos, para poderem ser utilizados, precisam ser registrados. Ao registrarmos um componente COM/COM+, uma srie de informaes sobre o mesmo so gravadas na Registry do sistema. Estas informaes so utilizadas pelos programas que precisam acessar o componente. Se alguma destas informaes estiver errada ou tiver sido alterada, o componente no poder ser acessado e os programas que utilizam o componente deixaro de funcionar corretamente. No Framework .NET, para utilizarmos os componentes .NET (.NET Componentes), no necessrio que os mesmos sejam registrados. O prprio componente .NET possui todas as informaes necessrias ao seu funcionamento, bem como as informaes necessrias para que outros aplicativos possam utiliz-los. Estas informaes, que fazem parte do prprio componente .NET ficam gravadas no arquivo que compe componente, na forma de Metadata. Uma traduo popularmente conhecida para Metadata seria: dados sobre dados. No nosso caso, Metadata seriam as informaes que o componente .NET possui a respeito de si mesmo, informaes estas que podem ser utilizadas por outros componentes e servios, para acessar o componente em questo. Alm de fazer com que no seja necessrio o registro do componente, as informaes de Metadata facilitam a interoperabilidade entre diferentes componentes, mesmo entre componentes escritos em diferentes linguagens. Estas informaes so geradas, automaticamente, no momento da compilao do componente e so gravadas no arquivo .DLL ou .EXE do componente. So muitas as informaes que podem ser inseridas no componente, na forma de Metadata, tais como:
33
www.juliobattisti.com.br
Uma chave pblica para verificao da origem e da autenticidade do componente. Informaes sobre todas as classes ou componentes, dos quais o componente depende para funcionar corretamente. Tipos disponibilizados (exportados) pelo componente. Permisses de segurana para o acesso ao componente, seus mtodos e propriedades. Classes bsicas e interfaces do Framework .NET, utilizadas pelo componente. Atributos personalizados, implementados no componente. Membros do componente (mtodos, campos, propriedades, eventos, etc).
Quando o componente acessado, o CLR carrega os metadados do componente na memria e faz referncia a estes metadados, para obter informaes sobre as classes, membros, herana e dependncias do componente. So diversos os benefcios do uso de metadados, dentre os quais podemos destacar os seguintes:
Mdulos de cdigo auto descritivos: O prprio componente contm toda a informao necessria para interagir com outros componentes. Desta forma o componente pode ser implementado como um nico arquivo, o qual contm a sua definio (na forma de metadados) e a sua implementao, o cdigo do componente. Nunca demais repetir: A utilizao de metadados facilita, enormemente, a interoperabilidade entre componentes criados usando diferentes linguagens.
Assemblies
Uma aplicao .NET constituda de um conjunto de blocos chamados Assembly. Atravs dos Assemblies que podemos controlar a distribuio de uma aplicao, fazer o controle de verses, alm de definir as configuraes de segurana. Um assembly uma coleo de tipos e recursos que foram construdos para trabalharem juntos, formando, com isso, uma unidade com funcionalidade e escopos bem definidos. Um assembly fornece ao CLR importantes informaes sobre a implementao de tipos da aplicao. Para o CLR, um tipo somente existe no contexto de um assembly. De uma maneira mais simples, poderamos dizer que um assembly o mecanismo utilizado pelo .NET, para empacotar todos os elementos e informaes necessrias ao funcionamento de uma aplicao ou componente. Vamos simplificar mais ainda: o assembly uma maneira de juntar e organizar os diversos elementos que formam uma aplicao ou componente. Os assemblies foram criados para simplificar a distribuio de aplicaes e resolver o problema de verses, existentes em aplicaes baseadas em componentes. Lembram que no incio deste captulo falamos sobre o termo DLL Hell?. Com este termo estvamos nos referindo ao problema de um programa, ao ser instalado, substituir uma DLL por uma verso mais nova ou mais antiga, fazendo com que programas que dependiam da verso anterior da DLL deixassem de funcionar. Atravs do uso de assemblies e dos metadados contidos em cada componente, possvel que diferentes verses, do mesmo componente, estejam disponveis, ao mesmo tempo, em um computador. Desta forma, cada programa utiliza a verso do componente para o qual o programa foi criado. Ao instalarmos uma nova verso do componente, o qual vem embutido em um assembly, as verses anteriores sero mantidas, se as mesmas estiverem sendo utilizados por outros programas. Isso faz com que o inferno das DLLs (DLL Hell) seja coisa do passado.
www.juliobattisti.com.br
34
Permite que o desenvolvedor defina regras sobre o uso de diferentes verses entre diferentes componentes .NET. Fornece a infraestrutura necessria para que as regras de verso definidas pelo desenvolvedor sejam respeitadas. Fornece a infraestrutura necessria, para que diferentes verses de um mesmo componente de software possam rodar, simultaneamente. Esta execuo simultnea conhecida como syde-by-syde execution.
NOTA: Veremos mais detalhes sobre assemblies e seus elementos no Captulo 2, onde estaremos detalhando o CLR Common Language Runtime.
compem uma aplicao Web so diferentes dos termos utilizados para representar uma aplicao tradicional para o Windows, tambm conhecidas como aplicaes Win32. Alis, este um dos pontos que gostaria de destacar; o Framework .NET no foi concebido apenas para a criao de aplicaes Web. Com Framework .NET, podemos criar qualquer tipo de aplicao, desde aplicaes Web, passando por aplicaes Win32 tradicionais, at aplicaes de Console, tambm conhecidas como aplicaes de linha de comando.
Windows Forms
Que o Framework .NET foi todo projetado tendo em vista a Internet nos j sabemos. Porm nem todas as aplicaes so ou sero desenvolvidas para a Web. A utilizao de Windows Forms (Win Forms ou, se preferirem, Formulrios do Windows) o mecanismo que nos permite criar as tradicionais aplicaes para Windows. Win Forms o novo mecanismo para construo de aplicaes Windows, baseadas no Framework .NET. Um Windows Form bastante semelhante ao conceito de formulrio utilizado pelas verses atuais do VB e do Delphi. O formulrio o elemento bsico, sobre o qual adicionamos controles e cdigo para determinados eventos associados com o formulrio e seus controles. O Windows Form tudo isso, porm com a diferena de poder utilizar todos os mecanismos do Framework .NET. Dentre os principais mecanismos disponveis, destaca-se o mecanismo de herana, o qual chamado, para o caso dos Win Forms, de herana visual. Anteriormente havamos comentado sobre herana visual.
35
www.juliobattisti.com.br
System.Windows.Forms. So baseadas em um formulrio padro criado pelo usurio, atravs do mecanismo de herana.
Em resumo, o Win Form o elemento bsico de interao com o usurio; em outras palavras, o Win Form o elemento visual das aplicaes, elemento este com o qual o usurio ir trabalhar. Na Figura 1.10, temos uma viso geral dos elementos que compem uma aplicao Win32 tpica, construda com o Framework .NET.
Web Forms
Para aplicaes Win32 a interface com o usurio so os Windows Forms, vistos no item anterior. Para aplicaes Web, criadas com ASP.NET, as pginas so construdas utilizando-se Web Forms. Um dos objetivos da utilizao de Web Forms trazer para o desenvolvimento Web as facilidades de arrastar e soltar, existentes no desenvolvimento de aplicaes tradicionais. Com isso poderemos, com o uso do Visual Studio .NET, criar pginas Web, simplesmente arrastando componentes sobre um Web Form.
www.juliobattisti.com.br
36
Um modelo (template), o qual contm os elementos visuais e de formatao da pgina, normalmente contedo baseado em HTML, ou HTML gerado pelo cdigo ASP.NET. Uma seo de cdigo, a qual responsvel por todo o processamento lgico dos elementos da pgina. Por exemplo, na seo de cdigo podemos colocar os comandos necessrios para estabelecer uma conexo com um banco de dados e um comando para retornar os dados que sero utilizados pela pgina. Tambm podemos colocar comandos que atualizam os dados no banco de dados, de acordo com as informaes digitadas na pgina.
Observe que com estes dois elementos: template e seo de cdigo, temos uma separao entre o cdigo de processamento e o contedo da pgina propriamente dito. Isso evita a criao de cdigos do tipo macarro, onde temos sees de cdigo alternadas com sees de HTML, sucessivamente. O cdigo macarro bastante comum nas verses anteriores do ASP (ASP 2.0 e ASP 3.0). Com o Framework .NET so disponibilizados uma srie de novos controles para utilizao em pginas ASP.NET. Estes novos controles apresentam novas caractersticas e propriedades que facilitam a criao de pginas, digamos, mais inteligentes, onde podemos inserir cdigo em resposta a uma srie de eventos. O melhor disso tudo que o funcionamento destes controles independente do Navegador utilizado pelo cliente, uma vez que os mesmos so processados no servidor Web. A seo de cdigo de um Web Form pode ser criada utilizando qualquer linguagem do Framework .NET, como por exemplo: VB.NET, C# ou Jscript.NET. Com a utilizao de Web Forms bem mais simples manter o estado de uma pgina, entre diferentes requisies do usurio, isso tudo sem a necessidade de implementar a manuteno de estado utilizando os objetos Session e Application.
NOTA: Veremos mais detalhes sobre a criao, vantagens e os elementos de Web Forms no Captulo 6 Uma Introduo ao ASP.NET.
Alm disso, com o uso de Web Forms podemos construir aplicaes Web com interfaces bastante sofisticadas e funcionais, de uma maneira fcil atravs da utilizao de ferramentas de desenvolvimento como o Visual Studio .NET e outras que devero surgir para o desenvolvimento para o Framework .NET. Na Figura 1.11, temos uma viso geral dos elementos que compem uma aplicao Web tpica, criada com ASP.NET, com a utilizao de Web Forms.
Os Servidores .NET
Alm do Framework .NET, a Microsoft vem disponibilizando novas verses dos servidores da famlia Back Office. Estas novas verses vm sendo adaptadas para dar suporte ao modelo de desenvolvimento .NET. Por exemplo, os servidores esto sendo adaptados para o padro XML, que o padro de dados para troca de informaes entre componentes e servios do Framework .NET. Outra preocupao para esta linha de servidores com a escalabilidade dos mesmos. Estes servidores foram projetados para atender um grande volume de usurios, alm de terem a capacidade
37
www.juliobattisti.com.br
Interoperabilidade: Ao contrrio do que muitos anunciaram, os Mainframes continuam vivos. Alm disso, o ambiente de TI das empresas bastante heterogneo, onde convivem diferentes sistemas operacionais e diferentes fontes e formatos de dados. O Framework .NET e os servidores .NET facilitam a tarefa de integrar dados das mais variadas fontes, desde o tradicional Mainframe, passando por fontes de dados estruturados como o SQL Server 2000 ou ORACLE e chegando a fontes no estruturadas, como mensagens de correio eletrnico, arquivos de vdeo e imagens grficas.
NOTA: Nota: Para maiores informaes sobre MMC e Snap-Ins, consulte a Unidade IV do livro: Srie Curso Bsico & Rpido: Microsoft Windows 2000 Server, de minha autoria, publicado pela editora Axcel Books (www.axcel.com.br).
de administrao intuitivas e fceis de utilizar. Todos os servidores utilizam interfaces padronizadas, atravs do uso do MMC Microsoft Management Console e Snap-Ins especficos para a administrao de cada servidor. Neste tpico descreveremos, rapidamente, quais os servidores .NET e qual a funo de cada um no ambiente empresarial. Veremos uma breve descrio dos seguintes servidores:
SQL Server 2000 Exchange Server 2000 BizTalk Server 2000 Commerce Server 2000
www.juliobattisti.com.br
38
Application Center 2000 Host Integration Server 2000 Internet Security and Acceleration Server 2000 Mobile Information 2001 Server
http://www.microsoft.com/sql Livro: SQL Server 2000 Administrao e Desenvolvimento: Curso Completo, de minha autoria, publicado pela editora Axcel Books (www.axcel.com.br).
http://www.microsoft.com/exchange http://www.swynk.com
39
www.juliobattisti.com.br
Maiores informaes e uma verso de avaliao para download podem ser encontradas no seguinte endereo: http:// www.microsoft.com/isaserver
www.juliobattisti.com.br
40
ADO.NET
Com o ASP 3.0, a tecnologia preferida para o acesso a diferentes fontes de dados a tecnologia ADO Activex Data Objects, trabalhando em conjunto com OLE-DB, conforme ilustrado na Figura 1.12
41
www.juliobattisti.com.br
Para trabalharmos com ADO.NET, utilizaremos as seguintes classes da biblioteca de classes do Framework .NET ( .NET Framework Class Library).
Ao longo deste livro, principalmente nos Captulos 10 e 11, estaremos utilizando ADO.NET em diversos exemplos de conexo de pginas ASP.NET com fontes diversas de dados.
www.juliobattisti.com.br
42
Concluso
Neste captulo apresentamos o .NET ao amigo leitor. Iniciamos o captulo apresentando uma viso geral e uma definio genrica para a iniciativa .NET da Microsoft. Tratamos de conceitos como Web Services, CLR Common Language Runtime e .NET Framework Class Library. Vimos que o .NET a viso da Microsoft em um mundo onde o Software passa a ser desenvolvido e comercializado na forma de servios. Os programas so construdos a partir de unidades menores, os assemblies. Dentro de um assembly tenho todos os elementos que garantem uma funcionalidade especfica, para a qual o assembly foi projetado. Dentro deste contexto podemos concluir que, mais do que uma atualizao tecnolgica, o .NET uma mudana de Paradigma. Destacamos os dois principais componentes do Framework .NET. Em primeiro lugar uma ambiente de execuo comum a todas as linguagens habilitadas ao .NET CLR Common Language Runtime. Qualquer linguagem habilitada ao .NET, ao ser compilada, gera cdigo MSIL Microsoft Intermediate Language, sendo que o cdigo MSIL que executado pelo CLR. Alm disso, fornecida uma biblioteca de classes que pode ser utilizada por qualquer linguagem habilitada ao .NET .NET uma mudana de Paradigma. Ao colocar a disposio do programador um conjunto de classes padronizadas, o Framework .NET est incentivando boas prticas de programao, como a herana e a conseqente reutilizao de cdigo. Em seguida apresentamos os problemas com o modelo de desenvolvimento atual, baseado em componentes que seguem o padro COM/COM+. Vimos que, para que um componente possa ser utilizado, o mesmo precisa ser registrado e que diferentes verses de um mesmo componente no podem coexistir em um mesmo computador, o que pode fazer com que, ao instalarmos um programa, o mesmo substitua a verso atual do componente por uma verso diferente, a qual no pode ser utilizada por outros programas que dependem da verso anteriormente instalada. Isto faz com que o programa que depende da verso substituda deixe de funcionar. Esta situao tambm conhecida como DLL Hell. Tambm fizemos uma reviso rpida dos modelos de desenvolvimento em 2, 3 ou n camadas. Apresentamos as deficincias e vantagens de cada modelo. Em seguida voltamos aos componentes do Framework .NET apresentando, em primeiro lugar, as linguagens que fazem parte do Framework .NET, com destaque para a facilidade em fazer com que programas escritos em diferentes linguagens possam se comunicar e trocar informaes. Fizemos uma descrio breve do VB.NET e da nova linguagem C#. Neste livro estaremos utilizando o C# para a criao das pginas ASP.NET de exemplo. Continuando nossa jornada pela Framework .NET apresentamos o CTS Common Type System. Vimos a importncia de todas as linguagens utilizarem um conjunto padronizado de dados, principalmente para garantir a interoperabilidade entre programas criados em diferentes linguagens. Tambm tratamos do conceito de metadados (Metadata), o qual faz com que cada componente contenha todas as informaes necessrias ao seu funcionamento, o que evita que o mesmo tenha que ser registrado, como acontecia
43
www.juliobattisti.com.br
IMPORTANTE: Para a documentao sempre atualizada sobre o .NET, no deixe de consultar o endereo: http:// msdn.microsoft.com/net. NOTA: Devido natureza dinmica da Internet, alguns dos links apresentados podem ter sido alterados e, portanto, deixado de funcionar.
www.juliobattisti.com.br
44
Introduo
Antes de iniciarmos o nosso aprendizado de C# (Captulos 3, 4 e 5) e de ASP.NET (demais captulos deste livro), vamos apresentar mais alguns detalhes sobre o CLR Common Language Runtime. O CLR, conforme descrevemos no Captulo 1, o componente principal do Framework .NET. Iniciaremos o captulo apresentando mais alguns detalhes sobre a estrutura de uma aplicao .NET e a maneira como os diversos elementos so empacotados, atravs do uso de assemblies. Vamos apresentar informaes detalhadas sobre o uso de assemblies, os benefcios da utilizao dos mesmos, questes de segurana, questes sobre verso e utilizao de um cache de assemblies para acelerar a execuo dos programas .NET. Falaremos um pouco sobre as linguagens habilitadas ao .NET, a gerao do cdigo MSIL, a compilao do cdigo MSIL para cdigo nativo JIT Compile e a execuo deste cdigo. Estes aspectos so importantes para entendermos a maneira como as aplicaes .NET so executadas e gerenciadas pelo CLR. Detalharemos o conceito e a funo dos assemblies. Veremos que os mesmos formam os blocos bsicos para a construo de aplicaes .NET. Tambm veremos quais os componentes de um assembly, com destaque para a importncia do manifesto contido em um assembly. Na seqncia apresentaremos mais detalhes sobre o CTS Common Type System. Veremos quais os principais benefcios de termos um sistema de tipos comum a todas as linguagens habilitadas ao .NET. Tambm falaremos sobre as diferenas entre value types e reference types. Tambm apresentaremos as principais classes e tipos da .NET Framework Class Library. Veremos os tipos bsicos, bem como as principais classes disponveis para utilizao em nossos programas e pginas ASP.NET. Na parte final do captulo faremos uma reviso dos conceitos bsicos de orientao a objetos. Uma vez que o Framework .NET fortemente baseado em conceitos de orientao a objetos, tambm a linguagem C# que utilizaremos neste livro para a criao de pginas ASP.NET baseada nos conceitos de orientao a objetos; bastante oportuno que revisemos os seguintes conceitos: O que um objeto? Mtodos e propriedades O que so Classes? Herana
CAPTULO
2
Entendendo o CLR
45
www.juliobattisti.com.br
www.juliobattisti.com.br
46
47
www.juliobattisti.com.br
NOTA: No final do captulo apresentaremos os principais conceitos de orientao a objetos, como por exemplo: classes e herana.
www.juliobattisti.com.br
48
49
www.juliobattisti.com.br
NOTA: O mecanismo de verificao do cdigo um exemplo tpico de funcionalidade disponibilizada pelo Framework .NET, a qual, nos modelos anteriores, precisava ser desenvolvida pelo programador.
Assemblies
Conforme descrito no Captulo 1, chegou o momento de apresentarmos mais alguns detalhes sobre Assemblies e sobre o formato (ou quem sabe anatomia) de uma aplicao .NET.
www.juliobattisti.com.br
50
Funes do Assembly
Pela descrio anterior podemos concluir que o assembly um elemento fundamental na criao de aplicaes .NET. Os assemblies foram projetados, principalmente, para simplificar o processo de distribuio de aplicaes e para solucionar o problema do controle de verses existente no modelo COM/COM+. Um assembly responsvel pelas seguintes funes: Contm o cdigo executado pelo CLR. O cdigo MSIL contido em um arquivo PE (portable executable) no poder ser executado se o mesmo no estiver associado a um manifesto. a unidade bsica para atribuio de permisses e configuraes de segurana. Podemos definir, em nvel de assembly, quem pode acessar o assembly e com que nvel de acesso. uma unidade de referncia, pois as informaes contidas no manifesto do assembly so utilizadas para resolver tipos e para atender requisies de outros assemblies. Estas informaes definem quais os mtodos e propriedades que so visveis externamente. O manifesto tambm contm informaes a respeito de quais assemblies o assembly em questo depende. uma unidade para definio de verso. A atribuio de um nmero de verso feita em nvel de assembly.
51
www.juliobattisti.com.br
Componentes do Assembly
Um assembly esttico formado pelos seguintes componentes: Manifesto, o qual contm metadados do assembly. Metadados sobre os tipos do assembly (Type metadata). Cdigo MSIL. Demais recursos necessrios, como por exemplo arquivos grficos, arquivos de vdeo, etc. Podemos agrupar todos os elementos constituintes do assembly em um nico arquivo, conforme ilustrado na Figura 2.2.
www.juliobattisti.com.br
52
53
www.juliobattisti.com.br
www.juliobattisti.com.br
54
neste caso estou passando o valor contido na varivel x, para a varivel y. Alteraes feitas na varivel y no afetaro o valor da varivel x. No Framework .NET estes tipos bsicos, passados por valor, so chamados de value types. Estes tipos bsicos fazem parte do conjunto de classes disponibilizado pelo Framework .NET. Por exemplo, um inteiro acessado como System.Int32 e um valor boleano como System.Boolean. Estes tipos disponibilizados na prpria biblioteca de classes do Framework .NET so chamados de built-in value types. Para fornecer uma maior flexibilidade, o Framework .NET tambm permite que sejam criados os chamados Userdefined value types. Com isso o programador pode definir tipos personalizados, os quais so derivados da classe bsica System.ValueType. Com isso podemos criar tipos especficos, de acordo com as necessidades de cada aplicao. Por exemplo, para aplicaes de engenharia, podemos criar um tipo para representar nmeros complexos ou matrizes com caractersticas definidas. Reference types: Este tipo contm uma referncia para a localizao do valor do tipo. Em outras palavras, contm o endereo de memria onde est armazenado o valor. Vamos imaginar que x seja uma varivel do tipo reference type. Agora vamos fazer uma outra varivel y, tambm do tipo reference type, como sendo igual a x:
y=x
Neste caso, o endereo onde est armazenado o valor de x foi atribudo varivel x. Se alterarmos o valor de x, o que acontece com y? Como y contm o endereo da varivel x, ao alterarmos x, y passar a enxergar o valor modificado. Por exemplo, se utilizarmos o comando Console.Writeline(y), ser exibido o novo valor da varivel x.
NOTA: Nos Captulos 3, 4 e 5 apresentaremos alguns exemplos que ilustram a diferena entre value types e reference types.
55
www.juliobattisti.com.br
www.juliobattisti.com.br
56
NOTA: Para uma descrio completa, de todas as classes do Framework .NET, consulte o item .NET Framework Class Library, dentro do tpico .NET Framework Reference, na documentao do Framework .NET, conforme indicado na Figura 2.6. Lembrando que, uma vez instalado o Framework .NET, voc pode acessar a documentao do produto utilizando o comando: Iniciar -> Programas -> Microsoft .NET Framework SDK -> Documentation.
57
www.juliobattisti.com.br
www.juliobattisti.com.br
58
System.Drawing: Um conjunto de classes com funes grficas da biblioteca grfica do Framework .NET, a qual conhecida como GDI+ (bem que poderia ser GDI.NET). Fornece mtodos para desenhar elementos bsicos no vdeo, como por exemplo retngulos, crculos, uma linha reta, um ponto, etc. System.Globalization: Este namespace contm o conjunto de classes com as funcionalidades necessrias para a construo de aplicaes com suporte a diferentes idiomas. System.IO: Um conjunto de classes com suporte a leitura e escrita, sncrona e assncrona para stream de dados e arquivos em disco. System.Messaging: Contm um conjunto de classes para habilitar os programas .NET a trabalhar com filas, enviar mensagens para uma fila, ler mensagens de uma fila, etc. No Windows NT 4.0 tnhamos o MSMQ Microsoft Message Queue que atuava como servidor, disponibilizando servios de filas para aplicaes COM. System.Net: Disponibiliza uma interface de programao bastante fcil de utilizar, a qual nos d acesso grande maioria dos protocolos disponveis na Internet. System.Security: Um conjunto de classes com mtodos para a definio das configuraes bsicas de segurana para aplicaes .NET. System.Security.Cryptography: Disponibiliza servios de criptografia, incluindo codificao e decodificao de dados, hashing, gerao de nmeros aleatrios e autenticao de mensagens. System.Web: Contm uma srie de classes e interfaces para a comunicao browser/servidor web. Por exemplo, existe uma classe chamada HTTPRequest a qual disponibiliza uma srie de informaes a respeito da requisio HTTP feita pelo cliente. Existem outros namespaces, herdados de System.Web, como por exemplo: System.Web.Caching, System.Web.Conf iguration, System.Web.Hosting, System.Web.Mail, System.Web.SessionState, etc. System.Windows.Forms: Contm classes para a criao de aplicaes Win32, as quais podem ter acesso a todos os elementos da interface do Windows, como por exemplo botes, menus, barras de rolagem, etc. Neste namespace encontraremos uma classe chamada Form alm de muitos outros controles que podem ser utilizados para a criao da interface do usurio.
NOTA: Para que o programador possa utilizar de maneira eficiente estas classes, um bom conhecimento do diretrio em questo exigido.
59
www.juliobattisti.com.br
www.juliobattisti.com.br
60
O que um Objeto?
Na programao estruturada, ns temos uma separao entre procedimentos e os dados sobre os quais os mesmos atuam. Um procedimento pode ser uma funo que retorna um valor ou uma procedure que realiza uma srie de operaes, podendo ou no retornar um valor. Porm este modelo apresenta srias dificuldades do ponto de vista do usurio. Ao fazer a anlise e projeto de um programa, o analista precisa traduzir as necessidades dos usurios em termos de procedimentos, funes, mdulos, etc. Existe uma diferena muito grande entre a linguagem dos usurios e a linguagem dos analistas/programadores. Um objeto uma entidade que contm, alm dos dados, todas as funes que atuam sobre estes dados. Ou seja, um objeto composto dos dados que descrevem o objeto (propriedades) e das operaes que podem ser realizadas sobre estes dados (mtodos). Esta abordagem j um pouco mais prxima da abordagem entendida pelos usurios finais do sistema. Vamos imaginar um sistema para o departamento de recursos humanos. Os usurios falam em termos de empregados, cargos, etc. Poderamos ter um objeto chamado Funcionrio. Este objeto poderia conter diversas propriedades, tais como: Matrcula. Nome. Endereo. Fone. Data de Admisso. Data de Aniversrio. Nome do Pai. Nome da Me. Nmero da Identidade. Nmero do CPF. Cargo. Salrio. Com isso podemos observar que as propriedades descrevem as caractersticas de um determinado objeto. O conjunto de valores contidos nas propriedades de um determinado objeto define o seu estado atual. Alm das propriedades o objeto pode conter mtodos. Os mtodos descrevem aes que podem ser realizadas pelo objeto ou no objeto. Por exemplo, o nosso objeto funcionrio poderia ter um mtodo chamado pagamento, outro chamado transferncia, mais um chamado promoo e assim por diante. Um mtodo, na prtica, uma funo ou procedimento que realiza uma srie de aes. Os mtodos de um objeto podem receber parmetros e ter o seu comportamento alterado, dependendo do valor dos parmetros. Por exemplo, o mtodo Promoo de um objeto funcionrio pode receber, como parmetros, a Matrcula do funcionrio, a data da promoo e o cdigo do novo cargo. Dentro do mtodo Promoo pode ser chamado um mtodo AtualizaSalrio, o qual atualiza o valor do salrio do funcionrio, de acordo com o novo cargo que o mesmo ir ocupar.
61
www.juliobattisti.com.br
Mensagens
Os objetos se comunicam atravs de um mecanismo de troca de mensagens. Mensagens so mecanismos de comunicao entre objetos atravs do qual se desencadeia a execuo de um mtodo especfico. Atravs dos mecanismos de troca de mensagens um objeto pode invocar mtodos de outros objetos e receber os resultados da execuo do mtodo invocado. No desenvolvimento baseado em padres como COM/COM+ existem mtodos proprietrios para troca de mensagens. Alm disso, cada linguagem de programao possui um conjunto distinto de tipos. Desta maneira a troca de mensagens entre objetos criados em diferentes linguagens no uma tarefa simples. J no .NET existe um sistema de tipos comuns a todas as linguagens: CTS Common Type System. A existncia do CTS facilita, enormemente, a interao entre objetos criados em diferentes linguagens. Outra vantagem do Framework .NET que o mesmo utiliza um sistema para troca de mensagens, baseado no padro XML e no protocolo SOAP, ambos adotados como um padro de fato pela indstria de TI. Outro termo relacionado com orientaes a objetos instncia. Quando um programa carrega um determinado objeto na memria, dizemos que foi feita uma instncia do objeto. Ao carregar na memria estamos reservando recursos para armazenar as caractersticas do objeto atravs da definio dos valores de suas propriedades e tambm recursos para que os mtodos do objeto possam ser executados.
Classes
Se pesquisarmos a bibliografia sobre orientao a objetos encontraremos um sem-fim de definies para classes. Vamos inicialmente apresentar algumas das definies formais encontradas na bibliografia. Depois vamos a uma, digamos, explicao mais light:
www.juliobattisti.com.br
62
public static void Main() { string umamensagem = Hello World !!!; Console.WriteLine(umamensagem); } }
63
www.juliobattisti.com.br
Herana
o mecanismo que permite definir uma nova classe a partir de uma classe j existente. A classe que est sendo criada dita subclasse ou classe filha da classe j existente. Em contrapartida a classe j existente chamada de superclasse da classe que est sendo criada. A subclasse herda a estrutura de dados e os mtodos da superclasse, podendo adicionar variveis na estrutura de dados herdada, bem como adicionar novos mtodos e reescrever mtodos herdados. Uma classe pode possuir uma nica superclasse herana simples, ou pode conter mais do que uma superclasse herana mltipla. A herana mltipla tem sido alvo de muitas discusses e controvrsias. A nica linguagem, do Framework .NET, que implementa diretamente a herana mltipla o C++. A grande discusso em torno da herana mltipla tem a ver com a relao custo x benefcio, uma vez que a mesma de difcil implementao e concepo, embora os benefcios nem sempre sejam os esperados. Herana um conceito fundamental para a orientao a objetos. Atravs do mecanismo de herana podemos criar uma classe baseada em outra j existente. A nova classe que est sendo criada herda todas as propriedades e mtodos da classe base, tambm chamada de classe me ou superclasse conforme descrito anteriormente. A herana evita que as propriedades e mtodos da classe me tenham que ser redefinidos na classe filho, embora a classe filho ou subclasse possa redefinir os mtodos da classe me, atravs de um mecanismo conhecido como Overwrite. Para ilustrar o mecanismo de herana vamos a um exemplo prtico. Vamos imaginar que voc esteja projetando um programa baseado na orientao a objetos, evidentemente, para um banco. Uma das provveis classes seria a classe Clientes. Nesta classe poderamos definir as caractersticas e mtodos bsicos para um cliente tpico. Para a classe Clientes poderamos definir as seguintes propriedades: Nome CPF RG Identidade Endereo Cidade CEP Fone e-mail Para a classe Clientes poderamos definir os seguintes mtodos: Cadastrar Excluir Atualizar Observe que a nossa classe Clientes possui apenas as propriedades e mtodos comuns a qualquer cliente, quer seja um grande cliente ou um pequeno correntista. Este um dos princpios da utilizao de classes: nas classes de primeiro nvel definimos apenas as propriedades e mtodos comuns, os quais devero ser utilizados pelas classes dos demais nveis.
www.juliobattisti.com.br
64
65
www.juliobattisti.com.br
www.juliobattisti.com.br
66
67
www.juliobattisti.com.br
Clientes
ClienteCorrentista
ClienteCorrentista
ClienteCorrentista
ClienteEmprstimos
Reutilizao de Cdigo
Ao utilizar uma das classes do Framework .NET qual o princpio de orientao a objetos que estamos utilizando? Herana. Certo. Mas no era bem deste princpio que eu gostaria de tratar. Ento vamos colocar as coisas de uma maneira um pouco diferente: Ao utilizarmos a herana, qual o princpio de orientao a objetos que estamos utilizando? Reutilizao ou reaproveitamento de cdigo ou, de uma maneira mais chique: Reusabilidade. Ao invs de termos que implementar a funcionalidade de determinada classe, em cada programa onde a funcionalidade for necessria, simplesmente criamos uma classe que herda estas funcionalidades, j prontas, de uma classe do Framework .NET. Com isso estamos reutilizando o cdigo j desenvolvido. Isso poupa trabalho e facilita o desenvolvimento das aplicaes. Melhor ainda. Vamos imaginar que tenha sido descoberto um pequeno bug em um mtodo de uma classe. Ao corrigirmos este bug na classe em questo, todos os programas que utilizam a classe passaro a ter acesso s modificaes, ou seja, iro herdar as alteraes. Isso facilita, enormemente, a manuteno e alterao das aplicaes. Mas era de esperarmos tal comportamento, uma vez que reutilizao de cdigo, herana e facilidade de manuteno dos programas so alguns dos princpios bsicos da orientao a objetos.
www.juliobattisti.com.br
68
NOTA: Para orientaes sobre o download e a instalao do Framework .NET consulte a Introduo deste livro.
NOTA: Se voc est utilizando o Windows 2000 em Ingls, ao invs de Arquivo de Programas, procure na pasta Program Files.
69
www.juliobattisti.com.br
10. Abra um Prompt de comando (Iniciar -> Programas -> Acessrios -> Prompt de comando). 11. Navegue at a pasta Meus documentos. 12. Por exemplo, se a pasta Meus documentos est no drive C: utilize os seguintes comandos para navegar at a pasta Meus documentos:
C: cd Meus documentos
www.juliobattisti.com.br
70
16. Se o compilador C# estiver corretamente instalado, o programa teste.cs ser compilado e ser gerado um arquivo chamado teste.exe. Para executar este arquivo basta digitar teste e pressionar Enter. Voc obter os resultados indicados na Figura 2.13.
71
www.juliobattisti.com.br
Concluso
J temos todas as condies para iniciar a parte prtica. J foram apresentados os aspectos tericos necessrios ao entendimento do .NET. Agora hora de comear a trabalhar. Ento, nada mais a concluir. J conversei bastante. Vamos prtica.
www.juliobattisti.com.br
72
Introduo
Neste captulo apresentaremos a linguagem C# l-se C Sharp. Vamos explicar o porqu de mais uma linguagem de programao, sendo que j temos tantas. Tambm falaremos sobre as caractersticas que tornaro o C# uma alternativa atraente para o desenvolvimento de solues corporativas. Em seguida veremos a cara de um programa escrito em C#. Vamos detalhar qual a estrutura de um programa, quais os elementos obrigatrios. Vamos apresentar os elementos que compem um programa C#. Tambm falaremos dos comandos bsicos para ler e escrever na tela, de tal forma que possamos apresentar alguns exemplos simples. Vamos entender como fazer uso das Classes do .NET Framework Class Library. Veremos que temos duas opes para usar mtodos e propriedades das classes do .NET Framework Class Library. Explicaremos o uso da instruo Using e veremos como os comandos de um programa so diferentes dependendo de utilizarmos a instruo Using ou no utilizarmos. Vamos falar sobre os tipos bsicos disponveis no C#. Veremos que os tipos so disponibilizados pelo Framework .NET, no que conhecido como CTS Common Type System. O CTS disponibiliza um conjunto de tipos padronizados, o qual est disponvel para qualquer linguagem do Framework .NET. Isso faz com que um tipo Int32, por exemplo, tenha a mesma estrutura e ocupe a mesma quantidade de memria, quer seja em um programa escrito em C# ou VB.NET ou qualquer outra linguagem do Framework .NET. A disponibilizao de um sistema de tipos padronizado facilita a integrao entre programas escritos em diferentes linguagens. Na seqncia apresentaremos as estruturas da
CAPTULO
3
Apresentando o C#
linguagem C#, para o controle do fluxo do programa. Veremos que estas estruturas so muito semelhantes s encontradas na linguagem C++, com algumas pequenas diferenas.
Tambm apresentaremos os principais operadores matemticos, lgicos e de atribuio. Novamente veremos uma certa semelhana com a linguagem C++. Juntamente com os conceitos apresentados estaremos mostrando a aplicao dos mesmos, atravs do uso de exemplos simples e didticos. Se voc j programa em C++ ou Java e tem um bom entendimento dos conceitos de orientao a objetos, ver que aprender C# ser uma tarefa muito simples, rpida e agradvel. Se voc
73
www.juliobattisti.com.br
www.juliobattisti.com.br
74
75
www.juliobattisti.com.br
class ex1cap3 { // Exemplo1 Captulo 3. // Entrada e sado com C# // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
www.juliobattisti.com.br
76
10. Navegue at a pasta C:\ExCsharp\Cap3. 11 Execute o seguinte comando: csc ex1cap3.cs 12. Se o compilador C# estiver corretamente instalado, o programa teste.cs ser
NOTA: Os passos 9, 10 e 11 so utilizados para a compilao de um programa C#. Podemos resumir estes passos da seguinte maneira: Navegar at a pasta onde est o arquivo fonte (.cs) e executar o comando csc nome_do_arquivo.cs. Nos prximos exemplos no irei repetir estes trs passos detalhadamente. Irei resumir os trs passos em um nico: Navegue para a pasta onde est o arquivo .cs e execute o comando csc nome_do_arquivo.cs.
compilado e ser gerado um arquivo chamado ex1cap3.exe. 13. Agora vamos testar o nosso exemplo. Para executar o nosso exemplo basta digitar ex1cap3 e pressionar Enter. 14. Surge uma mensagem pedindo que voc digite o primeiro valor. Digite 10 e pressione Enter. 15. Surge uma mensagem pedindo que voc digite o segundo valor. Digite 20 e pressione Enter. 16. O programa exibe o resultado da soma e da adio dos valores digitados.Voc obter os resultados indicados na Figura 3.1.
77
www.juliobattisti.com.br
IMPORTANTE: O C# case sensitive, ou seja, o mesmo faz diferena entre letras maisculas e minsculas. Por exemplo, se voc declarar uma varivel i minscula e, por engano, utilizar em uma expresso I maisculo ser gerado um erro de compilao. Outro exemplo, o comando Console.WriteLine deve ser escrito desta maneira; se voc escrever, por exemplo, Console.writeline ser gerado um erro de compilao.
A clusula using utilizada para que possamos utilizar as classes, mtodos e propriedades de um determinado namespace. No nosso exemplo estamos fazendo referncia ao namespace System. Ao fazermos referncia ao namespace System, passamos a ter acesso a todos os seus mtodos, classes e propriedades. Por exemplo, abaixo de System, existe uma classe chamada Console System.Console. Na Classe System.Console temos um mtodo chamado WriteLine System.Console.WriteLine. Observe que estamos utilizando este mtodo em nosso programa. Porm, ao invs de digitar System.Console.WriteLine, utilizamos somente Console.WriteLine. Isso possvel pois estamos fazendo referncia ao namespace System, atravs da clusula using. Se no fizssemos referncia ao namespace System, teramos que utilizar a nomenclatura completa para o mtodo WriteLine System.Console.WriteLine. Observe que, ao fazermos referncia a um ou mais namespaces, estamos simplificando o nosso cdigo.
Embora a utilizao de referncias no seja obrigatria, uma prtica recomendada, uma vez que simplifica o cdigofonte. No nosso exemplo, se no tivssemos feito referncia ao namespace System, o nosso programa ficaria da seguinte maneira:
class ex1cap3 { // Exemplo1 Captulo 3. // Entrada e sado com C# // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
www.juliobattisti.com.br
78
-> {0},Adicao);
Observe que neste caso teramos que utilizar sempre a nomenclatura completa. Tambm cabe observar a maneira de acessar um mtodo ou propriedade de uma classe em C#: Utilizamos o nome do namespace (System), um ponto (System.), o nome da classe (System.Console), mais um ponto (System.Console.) e por ltimo o nome do mtodo e os parmetros que o mtodo deve receber (System.Console.WriteLine(O valor da soma -> {0},Adicao);). Com a utilizao da nomenclatura completa o cdigo fica mais longo e de difcil leitura. Abaixo temos um exemplo no qual feita referncia a vrios namespaces:
using System; using System.Data; using System.Net; using System.Security;
No C# toda a lgica de um programa deve estar contida dentro de uma classe. Na verdade, para ser mais precisos, teramos que modificar a frase anterior para que a mesma ficasse assim: No C# toda a lgica de um programa deve estar contida dentro de uma definio de tipo, sendo que uma definio de tipo pode ser uma classe, uma estrutura ou
79
www.juliobattisti.com.br
Aps a chave de abertura da classe (colocada logo aps a definio da classe), comeamos a definir os mtodos e propriedades da classe ex1cap3. Todo programa em C# deve conter um mtodo chamado Main( ). Este mtodo funciona como o ponto de entrada da aplicao. Em outras palavras, a execuo da aplicao se inicia pelo mtodo Main( ). Dentro do mtodo Main( ) podemos fazer chamadas para outros mtodos da classe ex1cap3 ou de outras classes. Novamente qualquer semelhana com o C/C++ no mera coincidncia. Vamos analisar o seguinte trecho de cdigo:
{
www.juliobattisti.com.br
80
-> {0},Adicao);
Este trecho de cdigo o corpo do mtodo Main( ). Iniciamos com a declarao de duas variveis do tipo Int32:
Int32 Adicao; Int32 Produto;
Em seguida utilizamos o mtodo Write da classe Console (Console.Write), para exibir uma mensagem na tela. Na prxima linha o mtodo ReadLine( ) da classe Console (Console.ReadLine) exibe um cursor e fica aguardando que o usurio digite alguma coisa e pressione Enter. Ao pressionar Enter, o valor digitado pelo usurio passado, no formato de uma string de texto, para a varivel Aux1:
Console.Write(Digite o primeiro valor inteiro ->); String Aux1=Console.ReadLine();
Ao final da execuo destas duas linhas temos o valor digitado pelo usurio armazenado na varivel Aux1, porm no formato de uma string de texto. As mesmas explicaes so vlidas para a varivel Aux2. O prximo passo calcular o valor da adio, que ser armazenado na varivel Adicao e da multiplicao, que ser armazenado na varivel Produto. Porm as variveis Aux1 e Aux2 so do tipo texto. No podemos adicionar e multiplicar variveis do tipo texto. Para converter o valor destas variveis para o tipo Int32 (inteiro de 32 bits), utilizamos o mtodo ToInt32, da classe Convert, conforme indicado pelas duas linhas a seguir:
Adicao = Convert.ToInt32(Aux1) + Convert.ToInt32(Aux2); Produto = Convert.ToInt32(Aux1) * Convert.ToInt32(Aux2);
Uma vez calculados os valores, o passo final exibi-los na tela. Isso feito como o mtodo WriteLine da classe Console. Um detalhe interessante a utilizao do marcador {0} com esse mtodo. O {0} substitudo pelo valor da primeira varivel passada para o mtodo, que no nosso exemplo a varivel Adicao:
Console.WriteLine(O valor da soma -> {0},Adicao);
81
www.juliobattisti.com.br
Aps a chave de fechamento do mtodo Main( ), temos a chave de fechamento da classe ex1cap3. Cabe observar que para a classe ex1cap3 temos um nico mtodo definido, que justamente o mtodo que obrigatrio para todas as classes: Main( ). Outra observao importante que todo comando encerrado com um ponto-e-vrgula (;). Com isso, podemos apresentar a estrutura geral de um programa em C#:
using namespace1; using namespace2; ... using namespacen;
class nome_da_classe {
Agora que j conhecemos a cara de um programa C#, vamos comear a estudar os diversos elementos da linguagem. Vamos iniciar falando sobre os tipos de dados disponveis no C#.
Tipos da Linguagem C#
No C# temos os seguintes tipos: Value Types Tipos de valor. Reference Types Tipos de referncia.
www.juliobattisti.com.br
82
Value Types
Um tipo Value Type contm o valor da varivel. Por conter o valor da varivel e no uma referncia (referncia= endereo de memria) varivel, valores do tipo Value Type no podem conter o valor Null. Outro detalhe importante a ser observado que tudo no C#, mesmo os tipos mais simples como um inteiro, considerado um objeto. Por exemplo, o tipo inteiro definido a partir da Estrutura System.Int32 (ou System.Int16 dependendo do tamanho necessrio). Ao criarmos uma varivel do tipo System.Int32 estamos criando uma instncia desta estrutura, o que na prtica significa criar um objeto baseado na estrutura System.Int32. Esta estrutura possui mtodos. Um dos mtodos, a ttulo de exemplo, o mtodo ToString, o qual converte o valor inteiro na string de texto correspondente. Vamos a um exemplo. Vamos imaginar que as variveis a e b so do tipo Value Type. Tambm vamos imaginar que a varivel a contm o valor 10 e a varivel b contm o valor 15. Agora considere o seguinte comando:
a = b
Neste caso o valor da varivel b atribudo varivel a. Ou seja, aps a execuo deste comando, a varivel a contm o mesmo valor da varivel b, que no nosso exemplo 15. Agora, se modificarmos o valor da varivel b, o que acontece com o valor da varivel a? Nada. Como as variveis so do tipo Value Type, ao fazermos a=b, apenas atribumos o valor de b para a. Porm a no fica com nenhuma referncia para b, ou seja, se b for modificado, a no ser afetado. Para entendermos bem este conceito, observe o exemplo da Listagem 3.2.
class ex2cap3 { // Exemplo2 Captulo 3. // Value Types // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
83
www.juliobattisti.com.br
a=10; b=15;
a=b;
b=33;
Console.WriteLine(****************************); Console.WriteLine(Aps a modificao de b!!!!); Console.WriteLine(****************************); Console.WriteLine(Valor da varivel a: {0},a); Console.WriteLine(Valor da varivel b: {0},b);
} }
Compile e execute o exemplo da listagem 3.2. Voc obter os resultados indicados na Figura 3.2.
www.juliobattisti.com.br
84
Tabela 3.1 Tipos bsicos do C# value types. Tipo System.Byte System.SByte System.Int16 System.UInt16 System.Int32 System.UInt32 Alias no C# byte sbyte short ushort int uint Descrio Byte de 8 bits, sem sinal. Valor variando entre 0 e 255. Byte de 8 bits, com sinal. Valor variando entre -128 e 127. Inteiro de 16 bits, com sinal. Valor variando entre 32.768 e 32.767. Inteiro de 16 bits, sem sinal. Valor variando entre 0 e 65.535. Inteiro de 32 bits, com sinal. Valor variando entre -2.147.438.648 e 2.147.438.647. Inteiro de 32 bits, sem sinal. Valor variando entre 0 e 4.294.967.295.
85
www.juliobattisti.com.br
Tipo System.Int64
Alias no C# long
Descrio Inteiro de 64 bits, com sinal. Valor variando entre -9.223.372.036.854.775.808 e 9.223.372.036.854.775.807. Inteiro de 64 bits, sem sinal. Valor variando entre 0 e 184.467.440.737.095.551.615. Um nico caractere unicode com 16 bits. Real de 32 bits, com sinal. Valor variando entre -3,402823E38 e 3,402823E38. Real de 64 bits, com sinal. Valor variando entre -1,79769313486232E308 e 1,79769313486232E308. Pode conter os valores True ou False. Real de 128 bits, com sinal. Valor variando entre -79.228.162.514.264.337.593.543.950.335 e 79.228.162.514.264.337.593.543.950.335.
Algumas observaes importantes sobre os tipos bsicos no C#: No C/C++ o valor verdadeiro, para uma varivel do tipo bool, representado por qualquer valor diferente de zero. No C# o valor verdadeiro no mais representado por qualquer valor diferente de zero. O tipo decimal utilizado para valores que necessitam de uma alta preciso, como por exemplo valores para clculos financeiros e monetrios. Tambm devemos destacar que a preciso dada em dgitos e no em casas decimais. As operaes so precisas at um mximo de 28 casas decimais. Agora vamos falar um pouco mais sobre um tipo que nos oferece mais opes: O tipo struct.
O Tipo Struct
Atravs da utilizao da palavra struct podemos construir estruturas complexas de dados. Por exemplo, um ponto no plano cartesiano representado pelo valor de x e y. Podemos criar uma estrutura chamada ponto, a qual contm dois campos: x e y. Alm de campos, uma estrutura pode conter constantes, mtodos, propriedades, indexadores, operadores e tipos aninhados. Pode parecer que um struct a mesma coisa que uma classe. Porm a diferena bsica que um struct um value type, enquanto uma classe um reference type (falaremos mais sobre reference type mais adiante). O namespace System contm uma srie de estruturas, algumas delas descritas na tabela 3.1: System.Int16, System.Int32, System.Byte, System.SByte e assim por diante. Vamos criar um exemplo simples, onde criamos uma estrutura para representar nmeros complexos. Um nmero complexo possui uma parte real e uma parte imaginria (s para lembrarmos um pouco da poca do segundo grau). A seguir temos alguns exemplos de nmeros complexos:
www.juliobattisti.com.br
86
Onde i, por definio, representa a raiz quadrada de -1. Para representar um nmero complexo, precisamos de dois valores do tipo single: um para a parte real e outro para a parte imaginria. Para somar dois nmeros complexos, basta somar as partes reais e as partes imaginrias, conforme exemplo a seguir:
x+y = (2-1)+(3+4,5)i x=y = 1+7,5y
Vamos a um exemplo simples, onde criaremos uma estrutura para representar nmeros complexos. Nossa estrutura conter dois campos: um para representar a parte real e outro para representar a parte imaginria. O usurio ir digitar os valores para dois nmeros complexos e o programa far a soma dos mesmos e exibir os nmeros digitados e o resultado da soma. Para definir uma estrutura utilizamos a palavra struct. Por exemplo, vamos definir a estrutura numcomplexo, a qual ser utilizada no nosso programa:
struct numcomplexo { public float preal,pimag; }
Para utilizar esta estrutura no nosso exemplo, precisamos declarar uma varivel do tipo numcomplexo. Como iremos utilizar trs variveis, sendo uma delas para conter a soma, precisamos declarar trs variveis do tipo numcomplexo:
numcomplexo num1,num2; numcomplexo soma;
Para acessar os campos individuais da estrutura utilizamos a notao tradicional da orientao a objetos, ou seja, o nome da estrutura seguida de um ponto (.) mais o nome do campo. Por exemplo, para atribuirmos um valor ao campo preal, da estrutura num1, utilizamos a seguinte sintaxe:
num1.preal = 3,5;
Agora que j conhecemos o bsico sobre estruturas, vamos apresentar o nosso exemplo. Considere o exemplo da Listagem 3.3.
// Exemplo3 Captulo 3.
87
www.juliobattisti.com.br
// Utilizao de estruturas. // Nmeros complexos. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
class ex3cap3 {
// Entrada dos valores para a parte real // e a parte imaginria dos nmeros num1 e num2.
num1.preal = Convert.ToSingle(Auxreal1);
www.juliobattisti.com.br
88
String Auxreal2=Console.ReadLine();
num2.preal = Convert.ToSingle(Auxreal2);
num2.pimag = Convert.ToSingle(Auximag2);
// Clculo da adio dos nmeros num1 e num2. // Para isto basta somar as partes reais e imaginrias // dos respectivos nmeros.
Console.WriteLine(**********************************************); Console.WriteLine(O primeiro complexo -> {0} + {1}i,num1.preal,num1.pimag); Console.WriteLine(**********************************************); Console.WriteLine(O segundo complexo -> {0} + {1}i,num2.preal,num2.pimag); Console.WriteLine(**********************************************); Console.WriteLine(O resultado da soma -> {0} + {1}i,soma.preal,soma.pimag);
Console.WriteLine(**********************************************);
} }
Digite o exemplo da Listagem 3.3 e salve o mesmo em um arquivo chamado ex3cap3.cs, na pasta C:\ExCsharp\cap3. Compile e execute o exemplo da Listagem 3.3. Voc obter os resultados indicados na Figura 3.3. Este exemplo simples serve para ilustrar a criao e utilizao de estruturas. Tambm observe que utilizamos o mtodo ToSingle, da classe Convert Convert.ToSingle. A utilizao deste mtodo foi necessria, porque o valor retornado pelo comando ReadLine do tipo String. Precisamos converter este valor para o tipo Single, para que possamos fazer a operao de adio com os mesmos. O valor retornado por ReadLine armazenado em uma varivel auxiliar do tipo String, conforme o exemplo a seguir:
String Auxreal1=Console.ReadLine();
89
www.juliobattisti.com.br
Os Tipos de Enumerao
Utilizamos tipos de enumerao para criar um conjunto com valores definidos. Alm do valor definido associado um valor numrico para cada elemento do conjunto. Por padro, o valor numrico associado do tipo inteiro e inicia com zero. No exemplo a seguir estamos definindo um tipo de enumerao chamado DiasDaSemana:
enum DiasDaSemana {Domingo, Segunda,Tera,Quarta,Quinta,Sexta,Sbado}
Neste caso temos associados os seguintes valores do tipo int, com cada elemento:
Domingo Segunda Tera Quarta Quinta Sexta Sbado = 0 = 1 = 2 = 3 = 4 = 5 = 6
Tambm podemos modificar o valor associado com o primeiro elemento do conjunto. Os valores dos demais elementos vo sendo incrementados de um em um. Vamos modificar um pouco o exemplo anterior:
enum DiasDaSemana {Domingo=1, Segunda,Tera,Quarta,Quinta,Sexta,Sbado}
www.juliobattisti.com.br
90
Tambm possvel definir valores especficos, associados com cada elemento do conjunto. Considere o exemplo a seguir:
enum DiasDaSemana {Domingo=1, Segunda=3,Tera=4,Quarta=8,Quinta=11,Sexta=15, Sbado=0}
Tambm podemos fazer com que os valores associados com os elementos do conjunto sejam de um tipo diferente de int. Os tipos permitidos so os seguintes: long, int, short e byte. Para fazer com que os valores numricos associados aos elementos do conjunto sejam de um tipo diferente, utilizamos a seguinte sintaxe:
enum nome_do_conjunto: tipo_desejado {Elemento1, Elemento2, ..., Elementon}
Considere o exemplo a seguir, onde definimos o conjunto DiasDaSemana com valores do tipo byte, associados aos elementos do conjunto:
enum DiasDaSemana : byte { Domingo=1, Segunda,Tera,Quarta,Quinta,Sexta,Sbado}
Neste caso os valores do tipo byte associados aos elementos do conjunto so os seguintes:
Domingo Segunda Tera Quarta Quinta Sexta Sbado = 1 = 2 = 3 = 4 = 5 = 6 = 7
Tambm podemos utilizar a seguinte sintaxe, onde fazemos a definio de cada elemento em uma linha separada, o que facilita a visualizao do cdigo:
enum DiasDaSemana { Domingo Segunda Tera = 1, = 2, = 3,
91
www.juliobattisti.com.br
Reference Types
Os tipos de referncia (reference types) no armazenam os dados reais de uma varivel; ao invs disso, armazenam uma referncia (endereo de memria) para o local onde estes dados esto armazenados. Quando uma varivel do tipo reference type passada como parmetro de uma funo, o endereo da varivel passado para a funo e no o seu valor. Se a funo modificar a varivel passada como parmetro, na verdade estar modificando a varivel original. Os tipos de referncia so os seguintes: object class interfaces Delegaes string Arrays Neste captulo vamos tratar dos tipos string e Arrays. Veremos alguns exemplos de utilizao dos mesmos.
O Tipo String
Toda string (valor do tipo texto) no C# uma instncia da classe System.String do .NET Framework Class Library. Por ser uma classe, temos disposio uma srie de mtodos, campos, propriedades, operadores e construtores para manipulao de strings. Tambm cabe reforar que uma string um valor do tipo reference type. Para exemplificar o uso de strings considere o exemplo da Listagem 3.4. Neste exemplo utilizaremos alguns mtodos da classe System.String.
class ex4cap3 {
www.juliobattisti.com.br
92
// Exemplo4 Captulo 3. // Entrada e sado com C# // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
// Agora vamos utilizar o mtodo // String.ToLower() // para converter as strings Texto1 // e Texto2 para minsculas.
Console.WriteLine(*********************************************); Console.WriteLine(Varivel Texto 1-> {0},Texto1.ToLower()); Console.WriteLine(Varivel Texto 2-> {0},Texto2.ToLower()); Console.WriteLine(*********************************************);
// Agora vamos utilizar o mtodo // String.ToUpper() // para converter as strings Texto1 // e Texto2 para MAISCULAS.
} }
93
www.juliobattisti.com.br
Tabela 3.2 Os principais mtodos da classe System.String. Mtodo Compare( ) Descrio Utilizado para comparar o valor de duas strings. Recebe como parmetros duas string: Compare(str1,str2). Retorna um valor inteiro de 32 bits, com sinal. Se for menor do que zero, str1 menor do que str2. Por exemplo: Jos menor do que Pedro, conta a ordem alfabtica. Se for igual a zero str1 igual a str2 e, se for maior do que zero, str1 maior do que str2. Compara strings desconsiderando diferenas entre idiomas, ou seja, faz uma comparao posio a posio da string. Recebe como parmetros duas strings. Compara uma string com a instncia de um objeto recebido como parmetro, sendo que este objeto deve ser capaz de ser avaliado como uma string. Utilizada para verificar se uma substring existe no final de uma string. Concatena duas ou mais strings passadas como parmetros. Tambm podem ser passados objetos como parmetros, desde que os mesmos possam ser avaliados como strings.
www.juliobattisti.com.br
94
Descrio Substitui todas as ocorrncias de um determinado caractere por outro caractere. Converte a string para letras minsculas. Converte a string para letras maisculas. Remove os espaos em branco de uma string.
Uma varivel do tipo string tambm tem duas propriedades interessantes. A primeira a propriedade Length, a qual retorna o tamanho da strings, ou seja, o nmero de caracteres da string. Para exemplificar o uso da propriedade Length considere o exemplo da Listagem 3.5. Neste exemplo o usurio deve digitar uma string de texto e o programa retorna o nmero de caracteres digitados. importante salientar que espaos em branco tambm contam.
class ex5cap3 { // Exemplo5 Captulo 3. // Utilizao da propriedade Lenght. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
Console.WriteLine(+++++++++++++++++++++++++++++++++++++++++++++++++++); Console.WriteLine(Voc digitou o seguinte texto -> {0},Texto); Console.WriteLine(O mesmo tem -> {0} caracteres.,Texto.Length); Console.WriteLine(+++++++++++++++++++++++++++++++++++++++++++++++++++); } }
95
www.juliobattisti.com.br
O Tipo Arrays
Um array uma varivel que contm um conjunto de elementos sendo todos do mesmo tipo. Na poca do Fortran ou do Pascal para DOS o array era chamado de vetor, quando fosse um array de uma nica dimenso, e matriz, para um array de duas dimenses. Temos dois fatos fundamentais a respeito de arrays: Todos os elementos de um array devem ser do mesmo tipo. Acessamos os elementos de um array atravs de seu(s) ndice(s).
www.juliobattisti.com.br
96
Observe que o primeiro elemento do array o elemento de ndice zero. Tambm podemos criar arrays de mais dimenses. Observe o exemplo a seguir, onde estamos criando um array de duas dimenses (uma matriz), com 2 linhas e duas colunas:
int[,] minhamatriz = new int[2,2];
Vamos a um exemplo simples. Onde criamos um array de duas dimenses, com 3 linhas e 3 colunas, atribumos valores para os elementos do array, e depois exibimos os valores no vdeo. Considere o exemplo da Listagem 3.6.
class ex6cap3 { // Exemplo6 Captulo 3. // Um array de duas dimenses. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
97
www.juliobattisti.com.br
minhamatriz[0,0] = 0; minhamatriz[0,1] = 5; minhamatriz[0,2] = 10; minhamatriz[1,0] = 15; minhamatriz[1,1] = 20; minhamatriz[1,2] = 15; minhamatriz[2,0] = 10; minhamatriz[2,1] = 5; minhamatriz[2,2] = 0;
Console.WriteLine(O valor da primeira linha primeira coluna -> {0},minhamatriz[0,0]); Console.WriteLine(O valor da primeira linha segunda coluna -> {0},minhamatriz[0,1]); Console.WriteLine(O valor da primeira linha terceira coluna -> {0},minhamatriz[0,2]); Console.WriteLine(O valor da segunda linha primeira coluna -> {0},minhamatriz[1,0]); Console.WriteLine(O valor da segunda linha segunda coluna -> {0},minhamatriz[1,1]); Console.WriteLine(O valor da segunda linha terceira coluna -> {0},minhamatriz[1,2]); Console.WriteLine(O valor da terceira linha primeira coluna -> {0},minhamatriz[2,0]); Console.WriteLine(O valor da terceira linha segunda coluna -> {0},minhamatriz[2,1]); Console.WriteLine(O valor da terceira linha terceira coluna -> {0},minhamatriz[2,2]);
} }
www.juliobattisti.com.br
98
NOTA: Apresentaremos mais alguns exemplos com arrays mais adiante neste captulo, onde falaremos sobre as estruturas de controle do C#. Veremos alguns exemplos ao apresentarmos a estrutura de controle For, a qual tipicamente utilizada para percorrer todos os elementos de um array.
No C#, as instrues de fluxo de controle so divididas em trs categorias: Instrues de seleo. Instrues de repetio. Instrues de salto (jump). A maioria das instrues tem o seu funcionamento baseado em um teste lgico, o qual retorna True ou False.
99
www.juliobattisti.com.br
Instrues de Seleo
As instrues de seleo executam um entre vrios comandos disponveis. O comando a ser executado selecionado com base no valor de uma expresso.
A Instruo If
Este comando seleciona um comando ou grupos de comando para execuo, com base no valor retornado por uma expresso boleana. Uma expresso boleana somente pode retornar dois valores: True ou False. A forma mais simples deste comando indicada a seguir:
if expresso { comando1; comando2; ... comandon; }
Comando1, Comando2 at Comandon somente sero executados se a expresso for verdadeira. Observe que podemos executar mais do que um comando, caso a expresso seja verdadeira. Para isto basta colocar os diversos comandos entre chaves. Considere o seguinte exemplo:
if (x>y) { Console.WriteLine(X maior do que y) x = x+1 y = y-1 }
Os comandos entre as chaves somente sero executados quando x for maior do que y; caso contrrio, a execuo pula para o primeiro comando aps o fechamento das chaves. Uma outra forma da instruo if a que inclui a clusula else. Com a clusula else podemos definir um conjunto de comandos que devem ser executados se a expresso de teste retornar False. A sintaxe para esta instruo a seguinte:
if (x<y) { comando1_verdadeiro; comando2_verdadeiro; ... comandon_verdadeiro;
www.juliobattisti.com.br
100
Vamos a um exemplo simples, onde o usurio entra com dois valores. O programa devolve diferentes mensagens para o caso de o primeiro ser maior do que o segundo ou para o caso do segundo ser maior ou igual ao primeiro. Considere o exemplo da Listagem 3.7.
class ex7cap3 { // Exemplo7 Captulo 3. // Utilizando a instruo If. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
Console.Write(Digite o primeiro valor inteiro ->); String Aux1=Console.ReadLine(); Console.Write(Digite o segundo valor inteiro ->);
101
www.juliobattisti.com.br
String Aux2=Console.ReadLine();
if (valor1>valor2) { Console.WriteLine(*****************************************); Console.WriteLine(PRIMEIRO VALOR MAIOR DO QUE O SEGUNDO !); Console.WriteLine(*****************************************); Console.WriteLine(O PRIMEIRO VALOR DIGITADO FOI: {0},valor1); Console.WriteLine(O SEGUNDO VALOR DIGITADO FOI: {0},valor2); Console.WriteLine(*****************************************); } else { Console.WriteLine(*****************************************); Console.WriteLine(PRIMEIRO VALOR MENOR OU IGUAL AO SEGUNDO !); Console.WriteLine(*****************************************); Console.WriteLine(O PRIMEIRO VALOR DIGITADO FOI: {0},valor1); Console.WriteLine(O SEGUNDO VALOR DIGITADO FOI: {0},valor2); Console.WriteLine(*****************************************); }
} }
Digite o exemplo da Listagem 3.7 e salve o mesmo em um arquivo chamado ex7cap3.cs, na pasta C:\ExCsharp\cap3. Compile e execute o exemplo da Listagem 3.7. Para o primeiro valor digite 10 e para o segundo digite 5. Voc obter os resultados indicados na Figura 3.7.
www.juliobattisti.com.br
102
103
www.juliobattisti.com.br
Observe que a ltima hiptese (x == 3) no precisamos testar, pois, se a execuo chegou at o ltimo else, porque x no igual a 0, nem igual a 1 e nem igual a 2. Quando um dos testes for verdadeiro, os comandos associados so executados e a execuo pula para o primeiro comando aps o bloco if. Na Tabela 3.3, temos uma descrio dos principais operadores de comparao.
Tabela 3.3 Os principais operadores de comparao. Operador == != > < >= <= Descrio Igual. Retorna verdadeiro se os valores comparados forem iguais. Diferente. Retorna verdadeiro se os valores comparados forem diferentes. Maior do que. Retorna verdadeiro se o primeiro valor for maior do que o segundo (x>y). Menor do que. Retorna verdadeiro se o primeiro valor for menor do que o segundo (x<y). Maior ou igual a. Retorna verdadeiro se o primeiro valor for maior ou igual ao segundo (x>=y). Menor ou igual a. Retorna verdadeiro se o primeiro valor for menor ou igual ao segundo (x<=y).
IMPORTANTE: Observe que o operador para comparao de igualdade no um sinal simples de igual (=); ao invs disso um sinal duplo de igualdade (==). O operador simples (=) utilizado para atribuio de valores para variveis. Para comparao utilizase o operador ==.
www.juliobattisti.com.br
104
A Instruo Switch
A instruo switch tem uma expresso de controle bem no incio do lao. Com base no valor da expresso de controle, diferentes comandos sero executados. Sintaxe para a instruo switch:
switch (expresso_de_controle) { case valor_1: comando1; comando2; ... comandon; comando para sair;
case valor_2: comando1; comando2; ... comandon; comando para sair; ... case valor_n: comando1; comando2; ... comandon; comando para sair; default: comando1; comando2; ... comandon; comando para sair; }
105
www.juliobattisti.com.br
class ex8cap3 { // Exemplo 8 Captulo 3. // Utilizando a instruo switch. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
www.juliobattisti.com.br
106
int dia;
dia = Convert.ToInt32(Aux1);
switch (dia) { case 1: Console.WriteLine(*****************************************); Console.WriteLine(VOC ESCOLHEU O DOMINGO !!); Console.WriteLine(*****************************************); break;
case 4:
107
www.juliobattisti.com.br
Console.WriteLine(*****************************************); Console.WriteLine(VOC ESCOLHEU A QUARTA-FEIRA !!); Console.WriteLine(*****************************************); break; case 5: Console.WriteLine(*****************************************); Console.WriteLine(VOC ESCOLHEU A QUINTA-FEIRA !!); Console.WriteLine(*****************************************); break;
default: Console.WriteLine(*****************************************); Console.WriteLine(VOC NO DIGITOU UM VALOR ENTRE 1 E 7 !!); Console.WriteLine(*****************************************); break; } //Esta chave fecha o lao switch.
} //Esta chave fecha o mtodo Main() } Esta chave fecha a classe ex8cap3.
Digite o exemplo da Listagem 3.8 e salve o mesmo em um arquivo chamado ex8cap3.cs, na pasta C:\ExCsharp\cap3. Compile e execute o exemplo da Listagem 3.8. Digite o valor 5. Voc obter os resultados indicados na Figura 3.9.
www.juliobattisti.com.br
108
Instrues de Repetio
As instrues de repetio, como o prprio nome sugere, permitem que um conjunto de comandos seja executado um nmero definido de vezes ou at que uma determinada condio seja verdadeira. Vamos estudar as seguintes instrues: for while do/while foreach
109
www.juliobattisti.com.br
A Instruo For
Esta instruo utilizada para repetir um ou mais conjuntos, um nmero determinado de vezes. A instruo for do C# praticamente igual ao comando for do C/C++. composta de trs partes, conforme indicado na sintaxe a seguir:
for (inicializao; expresso boleana; incremento) { comando1 comando2 ... comandon }
O nmero de vezes que os comandos da instruo for sero executados determinado por uma varivel de controle. Na primeira parte do lao for, definimos um valor para esta varivel. Na segunda parte fazemos um teste para ver se a varivel j atingiu um valor limite. A terceira e ltima parte informa o incremento da varivel a cada passagem do lao. Enquanto a expresso boleana for verdadeira, os comandos do lao continuam a ser executados. Quando a expresso torna-se falsa, a execuo pula para o primeiro comando aps a chave de fechamento do lao for. Vamos a um exemplo simples, onde so exibidos os nmeros entre 1 e 10 e o valor do nmero elevado ao quadrado e ao cubo. Considere o exemplo da Listagem 3.9
class ex9cap3 { // Exemplo9 Captulo 3. // A instruo for. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
// Declarao da varivel.
www.juliobattisti.com.br
110
int i;
// Lao for que executado dez vezes. Console.WriteLine(Nmero+\t+Quadrado+\t+Cubo); for (i=1;i<=10;i++) { Console.Write(i+\t); Console.Write({0}+\t+\t,i*i); Console.WriteLine({0},i*i*i); }
} }
Digite o exemplo da Listagem 3.9 e salve o mesmo em um arquivo chamado ex9cap3.cs, na pasta C:\ExCsharp\cap3. Compile e execute o exemplo da Listagem 3.9. Voc obter os resultados indicados na Figura 3.11.
111
www.juliobattisti.com.br
Tabela 3.4 Os principais operadores aritmticos. Operador + * / Descrio Adio. Subtrao. Multiplicao. Diviso.
Observe que tambm utilizamos o cdigo de controle \t tabulao. Utilizamos a tabulao para alinhar os resultados. Tambm podemos utilizar instrues for aninhadas, isto , instrues for uma dentro da outra. O uso tpico para instrues for aninhadas para percorrer os valores de uma matriz, onde a instruo for mais externa vai variando o nmero das linhas e a instruo for mais interna vai variando o nmero das colunas. Observe o exemplo a seguir:
for (i=1;i<=6;I++) { for (j=1;j<=5;j++) { Comando1 Comando2 ... Comandon } }
Neste caso primeiro i=1. O programa entra no lao interno e para i=1 o lao interno executado 6 vezes, ou seja: i=1, j=1 e i=1, j=2 e i=1, j=3 e i=1, j=4 e i=1, j=5 . Agora i incrementado e torna-se igual a 2. Para i=2 o j varia de 1 a 5 e a histria se repete. At que i tenha variado at 6 e j at 5. Vamos comprovar estas variaes atravs de um exemplo prtico. Neste exemplo utilizaremos dois laos. No lao externo i varia de 1 at 6. No lao interno i varia de 1 at 5. Dentro do lao colocamos comandos que vo exibindo os valores de i e j respectivamente. Considere o exemplo da Listagem 3.10
www.juliobattisti.com.br
112
CAPTULO 2: ENTENDENDO O CLR Listagem 3.10 Exemplo utilizando instrues For aninhadas ex10cap3.cs
using System;
class ex10cap3 { // Exemplo 10 Captulo 3. // Instrues for aninhadas. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
int i; int j;
Console.WriteLine(i
j+\t+i
j+\t+i
j+\t+i
j+\t+i
j);
Console.Write(\t); } Console.WriteLine(); }
} }
113
www.juliobattisti.com.br
A Instruo While
A instruo while executa um ou mais comandos enquanto uma determinada condio for verdadeira. A condio testada no incio do lao. Se a condio for verdadeira o(s) comando(s) do lao so executados. Ao chegar no final do lao a execuo volta para o teste no incio do lao while. Se a condio continuar verdadeira o(s) comando(s) so executados novamente e o processo se repete, at que a condio no incio do lao se torne falsa. Quando a condio se torna falsa, a execuo pula para o primeiro comando aps o final do lao while. A seguir temos a sintaxe para o comando while:
while (condio) { comando1 comando2 ... comandon }
IMPORTANTE: Os comandos de dentro do lao devem ser capazes de tornar a condio falsa em um determinado momento, pois caso contrrio o lao continuar a ser executado infinitamente. Neste caso teremos criado um lao infinito, no qual o programa ficar executando, normalmente, at congelar.
www.juliobattisti.com.br
114
class ex11cap3 { // Exemplo 11 Captulo 3. // Instruo while. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
Console.Write(Digite um valor inteiro entre 1 e 100 ->); String Aux1 = Console.ReadLine(); n = Convert.ToInt32(Aux1);
// Utilizamos o lao While para determinar a soma dos n // primeiros nmeros inteiros.
115
www.juliobattisti.com.br
soma = 0; i=1;
//Exibio dos resultados. Console.WriteLine(***********************************************); Console.WriteLine(Soma dos nmeros inteiros de 1 a {0},n); Console.WriteLine(***********************************************); Console.WriteLine(SOMA > {0},soma); Console.WriteLine(***********************************************); } }
Note a observao: //IMPORTANTSSIMO. Se no colocssemos essa linha i=i+1, a varivel i no seria incrementada a cada passo do lao e, portanto, o teste (i<=n) nunca se tornaria falso, o que faria com que o lao ficasse executando infinitamente. Digite o exemplo da Listagem 3.11 e salve o mesmo em um arquivo chamado ex11cap3.cs, na pasta C:\ExCsharp\cap3. Compile e execute o exemplo da Listagem 3.11. Digite o valor 50. Voc obter os resultados indicados na Figura 3.13.
www.juliobattisti.com.br
116
A Instruo do/while
Com a instruo do/while deslocamos o teste para o final do lao. Com isso estamos garantindo que os comandos no interior do lao sero executados pelo menos uma vez, j que a condio somente ser avaliada no final do lao, aps os comandos terem sido executados. A sintaxe para a instruo do/while a seguinte:
do { comando1 comando2 ... comandon } while (teste)
117
www.juliobattisti.com.br
IMPORTANTE: Os comandos de dentro do lao devem ser capazes de tornar a condio falsa em um determinado momento, pois caso contrrio o lao continuar a ser executado infinitamente. Neste caso teremos criado um lao infinito, no qual o programa ficar executando, normalmente, at congelar.
class ex12cap3 { // Exemplo 12 Captulo 3. // Instruo do/while. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
// Declarao da varivel.
int i;
do
www.juliobattisti.com.br
118
{ Console.Write(Digite um valor menor do que 10 ->); String Aux1 = Console.ReadLine(); i = Convert.ToInt32(Aux1); } while (i>=10);
Console.WriteLine(***********************************************); Console.WriteLine(AGORA SIM VOC DIGITOU UM VALOR MENOR DO QUE 10); Console.WriteLine(***********************************************); Console.WriteLine(VALOR DIGITADO > {0},i); Console.WriteLine(***********************************************);
} }
Digite o exemplo da Listagem 3.12 e salve o mesmo em um arquivo chamado ex12cap3.cs, na pasta C:\ExCsharp\cap3. Compile e execute o exemplo da Listagem 3.12. Digite o valor 25 e pressione ENTER. Observe que o programa solicita novamente que seja digitado um valor menor do que 10. Digite 50. Mesma coisa. Agora digite 8. Voc obter os resultados indicados na Figura 3.15.
119
www.juliobattisti.com.br
A Instruo Foreach
Esta instruo j uma velha conhecida da turma do Visual Basic. A instruo foreach utilizada para percorrer todos os elementos de uma determinada coleo. Tambm podemos utilizar esta instruo para percorrer todos os elementos de um array de elementos, uma vez que um array no deixa de ser uma coleo de elementos do mesmo tipo. A seguir um exemplo no qual utilizamos a instruo foreach para exibir os elementos de um array de strings. Considere o exemplo da Listagem 3.13.
class ex13cap3 { // Exemplo 13 Captulo 3. // Instruo foreach. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
// Declarao e preenchimento do array. string[] nomes = {jos,maria,pedro,antnio,carlo}; // Utilizo foreach para percorrer todos os elementos do array.
} }
Digite o exemplo da Listagem 3.13 e salve o mesmo em um arquivo chamado ex13cap3.cs, na pasta C:\ExCsharp\cap3. Compile e execute o exemplo da Listagem 3.13. Voc obter os resultados indicados na Figura 3.16.
www.juliobattisti.com.br
120
O primeiro comando percorre os elementos do array nomes. O segundo comando exibe o valor de cada elemento. Vamos a mais um exemplo de utilizao de foreach para percorrer os elementos de uma coleo. Dentro do namespace System, temos a classe System.Environment. Dentro desta classe temos um mtodo chamado GetLogicalDrives. Este mtodo retorna um array de strings contendo o nome dos drives lgicos do computador. Depois utilizaremos foreach para percorrer os elementos do array de strings retornado por GetLogicalDrives.
class ex14cap3 { // Exemplo 14 Captulo 3. // Instruo foreach. // Mtodo Environment.GetLogicalDrives() // Por: Jlio Battisti
121
www.juliobattisti.com.br
} }
Digite o exemplo da Listagem 3.14 e salve o mesmo em um arquivo chamado ex14cap3.cs, na pasta C:\ExCsharp\cap3. Compile e execute o exemplo da Listagem 3.14. Voc obter os resultados indicados na Figura 3.17.
www.juliobattisti.com.br
122
NOTA: Os resultados obtidos podem ser diferentes dos exibidos na Figura 3.17, uma vez que o mesmo depende dos drives configurados no computador que voc estiver utilizando.
Temos as seguintes instrues de salto: break continue goto (No, goto no! Tem sim. Mas no se assuste.) return throw
A Instruo Break
Sintaxe:
break;
A instruo break utilizada para sair de um lao switch, while, do/while, for ou foreach. A execuo passa para o primeiro comando aps o final do lao onde o break foi executado. Se colocarmos o break fora de um dos laos citados, obteremos um erro de compilao.
A Instruo Continue
Dentro de um lao, quando encontrada uma instruo continue, os demais comandos do lao so ignorados e o lao executado novamente, dependendo do valor do teste. A diferena entre a instruo break e a instruo continue que o break sai definitivamente do lao, passando a execuo para o comando imediatamente aps o lao; enquanto o continue apenas suspende os comandos restantes e continua a execuo do lao, at que o mesmo seja encerrado.
A Instruo Goto
A utilizao da instruo goto conhecida de longa data. Podemos utilizar a instruo goto para saltar diretamente para um rtulo definido no cdigo do programa. Um rtulo definido da seguinte maneira:
nome_do_rtulo:
Porm esta prtica altamente desaconselhada. Quem no lembra dos famosos programas macarro da poca do Basic. Um programa macarro o que utiliza muitas instrues goto, onde a execuo fica pulando de uma parte para outra do
123
www.juliobattisti.com.br
A Instruo Return
Esta instruo, normalmente, utilizada dentro de uma funo. A instruo return retorna o controle do programa para o comando seguinte ao que fez a chamada funo e pode tambm retornar um valor calculado pela funo.
A Instruo Throw
Esta instruo utilizada no tratamento de excees e ser vista no prximo captulo.
Concluso
Neste captulo tratamos dos aspectos bsicos da linguagem C#. Como estaremos utilizando o C# para a criao da parte programada das pginas ASP.NET a partir do Captulo 6, este captulo forma uma base importante para o restante do livro. Iniciamos o captulo apresentando as caractersticas gerais do C# e o porqu de mais uma linguagem de programao. Vimos que a proposta do C# ser simples como o Visual Basic porm to poderoso quanto o C++. Em seguida apresentamos a estrutura bsica de um programa C#. Vimos que tudo (ou quase tudo) so classes e objetos. Toda a lgica de programao no C# precisa estar contida dentro de um tipo definido, normalmente uma classe. Em seguida tratamos dos diversos tipos de dados e estruturas existentes no C#. Vimos que existem tipos de valor value type e tipos de referncia reference type. Aprendemos as diferenas entre estes dois tipos. Tambm aprendemos a utilizar alguns mtodos da classe System.Convert para fazer converso entre tipos. Estudamos tipos mais complexos como structs, strings e arrays. Para finalizar o captulo apresentamos as instrues de fluxo de controle. Vimos que existem trs categorias de instrues: Instrues de seleo. Instrues de repetio. Instrues de salto (jump). Analisamos as diversas instrues em cada categoria. Junto com os conceitos tericos apresentamos exemplos simples e completos, que o leitor pode compilar e testar para ver o C# em funcionamento. O objetivo ao criarmos programas simples, de poucas linhas, salientar o tpico em destaque. Desta maneira cada exemplo d nfase a um comando, instruo ou tcnica especficos. Agora que j tratamos dos aspectos bsicos do C# podemos tratar de assuntos mais complexos como por exemplo o tratamento de excees. Mas isso j assunto para o Captulo 4.
www.juliobattisti.com.br
124
Introduo
Neste captulo continuaremos o nosso estudo da linguagem C#, sempre abordando os elementos que sero utilizados para a construo de pginas ASP.NET nos demais captulos do livro. Iniciaremos este captulo apresentando os operadores utilizados no C#. Tambm falaremos sobre a ordem de precedncia dos operadores. Trataremos dos seguintes tipos de operadores: Built-in Aritmticos Relacionais e Lgicos Atribuio (Assignment) Em seguida trataremos da implementao dos conceitos de orientao a objetos no C#. Veremos de que maneira conceitos como classes, herana e polimorfismo so implementados na linguagem C#. Aprenderemos a criar novas classes no C#. Sero apresentados os conceitos de construtores e destrutores. Para que a classe possa fornecer alguma funcionalidade, aprenderemos a criar mtodos e veremos os diferentes tipos de mtodos que podem ser criados. Tambm aprenderemos a criar mtodos que recebem parmetros. Vamos aprender os diferentes tipos de parmetros existentes: in parameters ref parameters out parameters Tambm falaremos sobre os modificadores para classes e membros de uma classe. Um modificador, na prtica, define a visibilidade e o escopo da classe e de cada um dos seus membros. Para que o leitor possa acompanhar e entender os assuntos exemplos referentes a classes, mtodos, propriedades, herana e polimorfismo necessrio que o mesmo conhea a teoria bsica sobre orientao a objetos. Para uma reviso dos conceitos bsicos de orientao a objetos consulte o Captulo 2, no tpico: Conceitos bsicos de orientao a objetos. Novamente estaremos utilizando exemplos simples e curtos, os quais objetivam salientar o tpico que est sendo tratado.
CAPTULO
4
Classes, Mtodos, Herana e Polimorfismo com o C#
125
www.juliobattisti.com.br
NOTA: Os arquivos com o cdigo-fonte dos exemplos deste captulo esto disponveis para download no site da editora Axcel Books no seguinte endereo: www.axcel.com.br.
Operadores unrios: Este tipo de operador atua sobre um nico operando, como por exemplo o sinal de menos (-) para tornar um nmero negativo, como por exemplo: -5. Operadores binrios: Atua sobre dois operandos. O exemplo tpico so os operadores aritmticos, como por exemplo: 2+3, 5*12. Operador ternrio: Atua sobre trs operandos. Temos um nico operador ternrio em C#, que o ponto-deinterrogao: ? Na verdade um ponto-de-interrogao metido a if, conforme veremos no exemplo a seguir. A sintaxe para o operador? a seguinte:
(teste) ? valor_se_verdadeiro : valor_se_falso
Considere o exemplo:
int y; int x;
Neste exemplo x igual a 12. O teste (y<25) avaliado. Como o teste verdadeiro (pois y=22), retornado o valor antes dos dois-pontos. Se o teste fosse falso seria retornado o valor aps os dois-pontos. ou no um if disfarado?
Built-in Operators
Existem operadores chamados Built-in para os tipos de dados int, uint, long, ulong, float, double e decimal. Isso significa que em operaes aritmticas bsicas entre operadores destes tipos no precisamos fazer nenhuma converso explcita. Considere o exemplo a seguir:
www.juliobattisti.com.br
126
Neste caso no precisamos fazer nenhum tipo de converso explcita (ou cast como chamada no C#), uma vez que existe o operador de adio interno do prprio C# (Built-in) para o tipo int. Agora, se tentssemos fazer a seguinte operao teramos problemas:
short nums1 = 10; short nums2 = 17; short soma = nums1+nums2;
Se tentarmos compilar um programa que contm este trecho de cdigo, obteremos a mensagem de erro indicada na Figura 4.1:
Operadores Aritmticos
Temos os operadores bsicos que toda linguagem tem, ou seja, os operadores para as quatro operaes matemticas, conforme descrito na Tabela 4.1.
127
www.juliobattisti.com.br
Tabela 4.1 Os principais operadores aritmticos. Operador + * / % Descrio Adio. Subtrao. Multiplicao. Diviso. Retorna o resto da diviso.
Tambm temos o operador unrio +, o qual simplesmente indica que um nmero positivo. No altera o valor do nmero. Por exemplo, os dois comandos a seguir so exatamente iguais e vlidos:
short nums1 = +10; ou short nums1 = +10;
Neste caso o valor de y ser igual a 10. Isso mesmo, pois o inverte o sinal e, lembrando l do primrio, menos com menos d mais. Outra observao que o operador binrio +, alm da adio, tambm utilizado para concatenar strings. Observe o exemplo da Listagem 4.1.
class ex1cap4 { // Exemplo1 Captulo 4. // Concatenando Strings. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
www.juliobattisti.com.br
128
MessageBox.Show(nomecompleto); } }
Digite o exemplo da Listagem 4.1 e salve o mesmo em um arquivo chamado ex1cap4.cs, na pasta C:\ExCsharp\cap4. Compile e execute o exemplo da Listagem 4.1. Para o nome digite Jos e pressione ENTER. Para o sobrenome digite da Silva e pressione ENTER. Voc obter os resultados indicados na Figura 4.2. D um clique no boto OK para fechar a janela de mensagem. Temos uma novidade neste exemplo: A utilizao do mtodo Show, da classe MessageBox, do namespace System.Windows.Forms. Observe que no incio do programa adicionamos uma referncia ao namespace System.Windows.Forms. Para exibir o nome completo utilizamos MessageBox.Show.
129
www.juliobattisti.com.br
Operador de Incremento: ++
O operador de incremento aumenta o valor de uma varivel em 1. O operador pode ser utilizado antes ou depois da varivel. A melhor maneira de entendermos as diferenas entre o operador estar antes ou depois atravs de um exemplo. Considere o seguinte trecho de cdigo:
int x = 10; int y = x++;
Isso acontece porque, na segunda linha, primeiro y feito igual ao valor atual de x (10) e depois x incrementado passando o seu valor para 11. Agora vamos alterar um pouco o nosso exemplo:
int x = 10; int y = ++x;
Isso acontece porque, na segunda linha, primeiro o x incrementado, passando o seu valor para 11. Em seguida o novo valor de x (11) atribudo para y.
www.juliobattisti.com.br
130
Operador de Decremento
O operador de decremento diminui o valor de uma varivel em 1. O operador pode ser utilizado antes ou depois da varivel. A melhor maneira de entendermos as diferenas entre o operador estar antes ou depois atravs de um exemplo. Considere o seguinte trecho de cdigo:
int x = 10; int y = x;
Isso acontece porque, na segunda linha, primeiro y feito igual ao valor atual de x (10) e depois x decrementado passando o seu valor para 9. Agora vamos alterar um pouco o nosso exemplo:
int x = 10; int y = x;
Isso acontece porque, na segunda linha, primeiro o x decrementado, passando o seu valor para 9. Em seguida o novo valor de x (9) atribudo para y.
Tabela 4.2 Os principais operadores relacionais. Operador == != < > Exemplo x == y x != y x<y x>y Descrio Comparao. Retorna verdadeiro se x for igual a y. Diferente. Retorna verdadeiro se x for diferente de b. Menor do que. Retorna verdadeiro se x for menor do que y. Maior do que. Retorna verdadeiro se x for maior do que y.
131
www.juliobattisti.com.br
Descrio Menor ou igual a. Retorna verdadeiro se x for menor ou igual a y. Maior ou igual a. Retorna verdadeiro se x for maior ou igual a y.
Os operadores lgicos podem ser utilizados para a elaborao de testes mais complexos, inclusive testes compostos, onde temos dois ou mais testes ligados por operadores lgicos. Os dois principais operadores lgicos so && (AND) e o || (OR). Quando temos uma expresso com vrios testes ligados por operadores AND, o resultado somente ser verdadeiro se todos os testes forem verdadeiros. Basta que um nico teste seja falso, para que toda a expresso seja avaliada como falsa False. Considere o trecho de cdigo a seguir:
If (10<11) && (5>3) && (3==3) { Console.WriteLine(Este comando ser executado !); }
Neste exemplo, como todos os testes so verdadeiros, a expresso verdadeira e o comando ser executado. Agora considere o trecho de cdigo a seguir:
If (10<11) && (5<3) && (3==3) & (123<=114) { Console.WriteLine(Este comando NUNCA ser executado !); }
Neste exemplo, como um dos testes falso (5<3), toda a expresso avaliada como False e o comando no interior do lao NUNCA ser executado. Quando temos uma expresso com vrios testes ligados por operadores OR, o resultado somente ser falso se todos os testes forem falsos. Basta que um nico teste seja verdadeiro, para que toda a expresso seja avaliada como verdadeira True. Considere o trecho de cdigo a seguir:
If (10>11) && (5<3) && (3==3) { Console.WriteLine(Este comando ser executado !); }
www.juliobattisti.com.br
132
Neste exemplo, como todos os testes so falsos, toda a expresso avaliada como False e o comando no interior do lao NUNCA ser executado. Na Tabela 4.3 temos os principais operadores lgicos.
Tabela 4.3 Os principais operadores lgicos. Operador & | ^ && || Descrio Faz um AND bit a bit entre dois operandos. Faz um OR bit a bit entre dois operandos. Faz um OR exclusivo (XOR) entre dois operandos. Faz um AND lgico entre dois operandos. Faz um OR lgico entre dois operandos.
Os operadores de atribuio compostos, alm de fazerem a atribuio, realizam, ao mesmo tempo, uma determinada operao. Para entendermos os operadores compostos vamos a um exemplo simples com o operador +=. Considere o trecho de cdigo a seguir:
int x; int y; y = 10; x = 5; x += y;
133
www.juliobattisti.com.br
Tabela 4.4 Os principais operadores de atribuio compostos. Operador += -= *= /= %= Exemplo equivalente : x+=y x- =y x* =y x/ =y x%=y x=x +y x=x - y x=x * y x=x / y x=x % y
Precedncia de Operadores
Em expresses complexas, onde podemos ter diversos operandos e operadores, deve existir uma maneira de decidir quais operaes sero realizadas em primeiro lugar. A ordem em que as operaes so realizadas determinada pelas regras de precedncia de operadores. As regrinhas bsicas so as mesmas das demais linguagens. Uma expresso avaliada da esquerda para a direita. Os operadores de incremento e decremento aps a varivel tm maior prioridade (x++ ou x). Em seguida so avaliados os operadores unrios (+ , -, !) e os operadores de incremento e decremento antes da varivel (++x e x). Na seqncia vm os operadores de multiplicao (*), diviso (/) e resto da diviso (%). Por ltimo, os operadores de adio (+) e subtrao(-). Podemos alterar a ordem de precedncia dos operadores utilizando parnteses. Considere a expresso a seguir:
x = (y+z)*k
Neste caso, a adio (y+z) ser executada em primeiro lugar, pois a mesma est dentro do parnteses. O resultado da adio ento multiplicado por k. Para ilustrar a ordem de precedncia vamos considerar o exemplo da Listagem 4.2
class ex2cap4
{ // Exemplo 2 Captulo 4.
www.juliobattisti.com.br
134
// Precedncia de operadores. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
int i=5; int j=21; int k=10; int l=20; int m=4; int expr1; int expr2; int expr3;
// Alguns clculos
Console.WriteLine(***********************************); Console.WriteLine(Valor de expr1: {0},expr1); Console.WriteLine(Valor de expr2: {0},expr2); Console.WriteLine(Valor de expr3: {0},expr3); Console.WriteLine(***********************************);
} }
135
www.juliobattisti.com.br
Aqui no temos nenhum parnteses. Neste caso vale a ordem de precedncia dos operadores. Em primeiro, na ordem de precedncia esto os operadores de incremento. Porm cabe lembrar que, para a expresso, como o operador de incremento est aps a varivel, utilizado o valor original de cada varivel e somente depois disso que as variveis so incrementadas. Ento, para a primeira expresso sero utilizados os seguintes valores:
i=5 j=21 k=10 l=20 m=4
no que obtemos:
expr1 = 35
www.juliobattisti.com.br
136
Se o operador de incremento estivesse antes das variveis, primeiro as mesmas seriam incrementadas e depois, j com o novo valor, a expresso seria calculada.
Classes
O conceito de Classes fundamental para a orientao a objetos. Como o Framework .NET fortemente baseado nos conceitos de orientao a objetos, bvio que o conceito de Classes igualmente importante para o Framework .NET. Para sair do discurso terico e partir para a prtica basta analisar os exemplos que apresentamos at o momento. No houve um nico exemplo em que no utilizamos pelo menos uma classe do .NET Framework Class Library (biblioteca de classes do .NET). Conforme j havamos salientado, a biblioteca de classes do .NET nos oferece uma infinidade de classes que podem ser utilizadas em nossos programas e pginas. Atravs da utilizao de classes estamos viabilizando, na prtica, os princpios da herana e da reutilizao de cdigo. Ao criarmos uma classe estamos, na verdade, definindo as caractersticas de um novo objeto. A definio da classe contm os mtodos, propriedades, indexadores (novidade no .NET) e Eventos da classe. Tambm contm informao sobre a visibilidade dos elementos da classe. A visibilidade define, por exemplo, se um mtodo da classe somente poder ser utilizado por outros mtodos da prpria classe ou poder ser utilizado externamente classe. Uma vez definida a classe, podemos utiliz-la em nossos programas e pginas. Para utilizar uma classe criamos e instanciamos um objeto como sendo do tipo definido pela classe. A partir deste momento o objeto passa a ter acesso a todos os elementos mtodos, propriedades, etc., da classe. Em outras palavras: o objeto herda todos os elementos da classe. Neste captulo aprenderemos a criar e utilizar classes no C#. Tambm aprenderemos a criar os diversos elementos que compem uma classe.
137
www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB Listagem 4.3 Uma classe bastante simples. Ex4Cap4.cs
using System; class ClasseEx1 { //Definio dos membros da classe.
class Ex3cap4
{ // Exemplo 3 Captulo 4. // Criao de uma classe com dois membros. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
// Agora crio uma varivel do tipo ClasseEx1. // Esta varivel uma instncia da classe ClasseEx1. ClasseEx1 minhaclasse = new ClasseEx1();
//Agora exibo os resultados. Console.WriteLine(**************************************************); Console.WriteLine(VALOR DO MEMBRO INTEIRO: {0},minhaclasse.contador); Console.WriteLine(VALOR DO MEMBRO STRING: {0},minhaclasse.teste);
Console.WriteLine(**************************************************); } }
www.juliobattisti.com.br
138
Neste exemplo definimos dois campos: contador teste Estes campos so tambm chamados de membros da classe (na verdade membro qualquer elemento da classe, quer seja uma propriedade, um campo, um mtodo, etc.). A palavra public faz com que estes campos possam ser acessados fora da classe, isto , dentro do cdigo do programa que estiver utilizando a classe. Aps a definio da classe temos uma segunda classe, chamada Ex3cap4.
class Ex3cap4
139
www.juliobattisti.com.br
Neste caso a novidade o uso do operador new para a instanciao do objeto. Aps termos criado uma objeto baseado na classe ClasseEx1 podemos acessar os seus membros public. Para acessar um membro utilizamos a seguinte sintaxe:
nome_da_classe.nome_do_membro
No trecho de cdigo a seguir alteramos o valor do campo contador e do campo teste, do objeto minhaclasse:
minhaclasse.contador = 125; minhaclasse.teste = PRIMEIRA CLASSE COM O C#;
Campos (Fields)
Um campo um membro do tipo varivel utilizado para armazenar um determinado valor. No exemplo da Listagem 4.3 criamos dois campos: contador e teste. Os campos so os dados do objeto e podem determinar, juntamente com as propriedades, o estado do objeto em um determinado instante. Para cada membro de uma classe podemos aplicar modificadores, os quais descrevem a maneira como um determinado membro pode ser utilizado. Por exemplo, se queremos que um campo possa ser acessado fora da classe, precisamos utilizar o modificador public antes da definio do campo, como fizemos no exemplo da Listagem 4.3. Se quisermos que o campo somente seja acessado de dentro da classe podemos utilizar o modificador private. Outros modificadores para campos so: static, readonly e const. Falaremos sobre estes modificadores mais adiante.
Mtodos (Methods)
Um mtodo contm cdigo que atua sobre os dados do objeto. Os mtodos, falando em termos de orientao a objetos, descrevem as aes que podem ser realizadas pela classe. Na prtica, a funcionalidade de uma classe implementada atravs dos seus mtodos.
IMPORTANTE: Observe que no destrumos o objeto minhaclasse no final do programa. Este procedimento no mais necessrio, como era em verses anteriores do VB, Visual C++ e VBA. Agora, quando a funo Main( ) encerra a sua execuo, a referncia ao objeto minhaclasse deixa de existir. Se a referncia no foi gravada, a instncia da classe estar disposio do coletor de lixo (garbage collector) do .NET, o qual ir liberar os recursos ocupados pela classe, quando necessrio.
www.juliobattisti.com.br
140
Propriedades (Properties)
As propriedades so um pouco diferentes dos campos, pois para definir e ler o valor de uma propriedade so definidos mtodos especficos. Get para obter o valor da propriedade e Set para definir o valor da propriedade. Veremos como criar e utilizar propriedades ainda neste captulo.
Constantes (Constants)
Uma constante um campo cujo valor no pode ser alterado. Aprenderemos a criar constantes ainda neste captulo.
Indexadores (Indexers)
Esta uma novidade do .NET. Um indexador um array. O indexador permite que, facilmente, possamos indexar um objeto para facilitar a definio e obteno dos valores da classe.
Eventos (Events)
Um evento, normalmente, corresponde a uma ao do usurio, ao esta que detectada pela classe e dispara a execuo de algum cdigo em resposta ao evento. o conceito de evento que todos ns j conhecemos. Por exemplo, ao clicar em um boto de comando, disparado o evento Ao Clicar. Agora aprenderemos a criar os diversos membros de uma classe. Mas antes vamos falar um pouco sobre Construtores (Constructs) e Destrutores (Destructors).
O mtodo construtor criado por padro possui o mesmo nome da classe e no possui parmetros ClasseEx1( ). Se tivssemos definido um mtodo construtor com parmetros, os mesmos teriam que ser passados no momento da criao do objeto. Por exemplo, se o mtodo construtor deve receber um parmetro inteiro, a criao do objeto minhaclasse ficaria assim:
ClasseEx1 minhaclasse = new ClasseEx1(10);
141
www.juliobattisti.com.br
public ClasseEx2() { Console.WriteLine(**************************************); Console.WriteLine(EXECUTANDO OS COMANDOS DO CONSTRUTOR !); Console.WriteLine(ESTES COMANDOS SERO EXECUTADOS SEMPRE); Console.WriteLine(QUE UMA INSTNCIA DA CLASSE FOR CRIADA); Console.WriteLine(**************************************); }
class Ex4cap4
www.juliobattisti.com.br
142
// Exemplo 3 Captulo 4. // Criao de uma classe com dois membros. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
// Agora crio uma varivel do tipo ClasseEx2. // Esta varivel uma instncia da classe ClasseEx2.
// A simples criao de um objeto da classe far // com que o seu construtor seja disparado e os // comandos do construtor sero executados.
} }
Digite o exemplo da Listagem 4.4 e salve o mesmo em um arquivo chamado ex4cap4.cs, na pasta C:\ExCsharp\cap4. Compile e execute o exemplo da Listagem 4.4. Voc obter os resultados indicados na Figura 4.5.
143
www.juliobattisti.com.br
www.juliobattisti.com.br
144
public int calcula_cubo(int valor) { // Crio uma varivel local do tipo int. // Atribuo o valor do parmetro valor para a // varivel local.
valor = 6;
return auxint*auxint*auxint; }
class Ex5cap4
145
www.juliobattisti.com.br
// Exemplo 5 Captulo 4. // Criao de uma classe com um mtodo // que calcula o cubo de um nmero inteiro. // Parmetros in. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
// Agora crio uma varivel do tipo ClasseEx3. // Esta varivel uma instncia da classe ClasseEx3.
// Defino uma varivel do tipo int e chamo o mtodo // calcula_cubo, da classe minhaclasse, passando o // valor inteiro como parmetro.
int valor;
// Exibio do resultado.
Console.WriteLine(*****************************************); Console.WriteLine(ELEVADO AO CUBO -> {0},minhaclasse.calcula_cubo(valor)); Console.WriteLine(*****************************************); Console.WriteLine(VALOR ORIGINAL DA VARIVEL VALOR -> {0},valor); Console.WriteLine(*****************************************);
} }
www.juliobattisti.com.br
146
public int calcula_cubo(int valor) { // Crio uma varivel local do tipo int. // Atribuo o valor do parmetro valor para a // varivel local.
valor = 6;
return auxint*auxint*auxint; }
147
www.juliobattisti.com.br
Em seguida modificamos o valor da varivel recebida como parmetro. Fizemos isso para provar que esta modificao no altera o valor da varivel original, definida no programa principal. Este fato pode ser comprovado na Figura 4.6, onde a varivel original continua com o valor digitado pelo usurio, ou seja, a alterao feita no mtodo calcula_cubo no afetou a varivel original. Este o comportamento esperado, uma vez que o parmetro foi passado por valor e no por referncia. A ltima linha do mtodo faz o clculo, retornando o valor passado (agora armazenado na varivel auxint), elevado ao cubo. No programa principal declaramos e instanciamos uma varivel chamada minhaclasse, a qual do tipo ClasseEx3. Isto feito com a seguinte linha de cdigo:
ClasseEx3 minhaclasse = new ClasseEx3();
Uma vez criado um objeto do tipo ClasseEx3 temos acesso ao mtodo calcula_cubo(valor), ou seja: minhaclasse.calcula_cubo(valor), o qual utilizado na seguinte linha de cdigo:
Console.WriteLine(ELEVADO AO CUBO -> {0},minhaclasse.calcula_cubo(valor));
Este um exemplo simples mas que salienta a criao e utilizao de um mtodo pblico. Tambm comprovamos que as alteraes feitas em um parmetro passado por valor no afetam o valor da varivel no programa principal. Parmetros ref: Quando utilizamos parmetros do tipo ref, como o prprio nome sugere, passada uma referncia para o parmetro e no somente o valor do mesmo. Na prtica isto significa que, se o mtodo alterar o valor do parmetro, esta alterao ter efeito na varivel original, no programa principal. Vamos utilizar o mesmo exemplo anterior, porm apenas modificando o tipo de parmetro. A vamos conferir se o valor da varivel original, no programa principal, foi modificado. Considere o exemplo da Listagem 4.6.
www.juliobattisti.com.br
148
// Crio uma varivel local do tipo int. // Atribuo o valor do parmetro valor para a // varivel local.
valor = 6;
return auxint*auxint*auxint; }
class Ex6cap4
{ // Exemplo 6 Captulo 4. // Criao de uma classe com um mtodo // que calcula o cubo de um nmero inteiro. // Parmetros ref. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
// Agora crio uma varivel do tipo ClasseEx4. // Esta varivel uma instncia da classe ClasseEx4.
// Defino uma varivel do tipo int e chamo o mtodo // calcula_cubo, da classe minhaclasse, passando o
149
www.juliobattisti.com.br
int valor;
// Exibio do resultado.
Console.WriteLine(*****************************************); Console.WriteLine(ELEVADO AO CUBO -> {0},minhaclasse.calcula_cubo(ref valor)); Console.WriteLine(*****************************************); Console.WriteLine(VALOR ORIGINAL DA VARIVEL VALOR -> {0},valor); Console.WriteLine(*****************************************);
} }
Digite o exemplo da listagem 4.6 e salve o mesmo em um arquivo chamado ex6cap4.cs, na pasta C:\ExCsharp\cap4. Compile e execute o exemplo da listagem 4.6. Voc obter os resultados indicados na Figura 4.7.
www.juliobattisti.com.br
150
valor = 6;
return auxint*auxint*auxint; }
Neste caso, como o parmetro est sendo passado por referncia, a alterao feita no parmetro valor ter reflexos na varivel valor no programa principal, o que pode ser comprovado pelos resultados exibidos na Figura 4.7. Quando passamos um parmetro por referncia, na verdade estamos passando o endereo da varivel. Por isso quando o mtodo altera o valor da varivel passada como parmetro est, na prtica, alterando o valor da varivel original. Tambm importante salientar que no momento de utilizarmos o mtodo, a palavra ref deve ser colocada antes do parmetro que est sendo passado, conforme indicado na linha de cdigo a seguir:
Console.WriteLine(ELEVADO AO CUBO -> {0},minhaclasse.calcula_cubo(ref valor));
Parmetros out: Um parmetro do tipo out utilizado para que o mtodo possa passar um resultado de volta para o programa que fez a chamada ao mtodo. O programa que est chamando o mtodo no precisa inicializar a varivel que ser retornada. Vamos modificar o exemplo anterior para introduzirmos um parmetro do tipo out. Considere o exemplo da Listagem 4.7.
151
www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB Listagem 4.7 Utilizando parmetro do tipo out. Ex7cap4.cs
using System; public class ClasseEx4 { // Definimos um mtodo para calcular o cubo de // uma varivel passada como parmetro para o mtodo.
class Ex7cap4
{ // Exemplo 7 Captulo 4. // Criao de uma classe com um mtodo // que calcula o cubo de um nmero inteiro. // Parmetros out. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
// Agora crio uma varivel do tipo ClasseEx4. // Esta varivel uma instncia da classe ClasseEx4.
// Defino uma varivel do tipo int e chamo o mtodo // calcula_cubo, da classe minhaclasse, passando o // valor inteiro como parmetro.
www.juliobattisti.com.br
152
// Chamada do mtodo calcula_cubo. // Aps a execuo do mtodo o valor elevado // ao cubo est disponvel na varivel valoraocubo // a qual foi retornada pelo mtodo.
minhaclasse.calcula_cubo(valor,out valoraocubo);
// Exibio do resultado.
Console.WriteLine(*****************************************); Console.WriteLine(ELEVADO AO CUBO -> {0},valoraocubo); Console.WriteLine(*****************************************); Console.WriteLine(VALOR ORIGINAL DA VARIVEL VALOR -> {0},valor); Console.WriteLine(*****************************************);
} }
Digite o exemplo da Listagem 4.7 e salve o mesmo em um arquivo chamado ex7cap4.cs, na pasta C:\ExCsharp\cap4. Compile e execute o exemplo da Listagem 4.7. Voc obter os resultados indicados na Figura 4.8.
153
www.juliobattisti.com.br
valoraocubo = valor*valor*valor; }
Tambm importante salientar a utilizao da palavra void antes do nome do mtodo. O void informa que no ser retornado nenhum valor pelo prprio mtodo. O valor ser retornado atravs da utilizao de um parmetro do tipo out. A utilizao do mtodo calcula_cubo, no programa principal, tambm diferente dos exemplos anteriores. Neste exemplo primeiro declaramos uma varivel do tipo int:
int valoraocubo;
Esta varivel receber o valor retornado pelo mtodo calcula_cubo. Em seguida fazemos uma chamada ao mtodo calcula_cubo, passando como primeiro parmetro o valor digitado pelo usurio e o segundo parmetro o nome da varivel que receber o valor de retorno, conforme indicado no cdigo a seguir:
minhaclasse.calcula_cubo(valor,out valoraocubo);
www.juliobattisti.com.br
154
Para vermos o princpio do polimorfismo em ao vamos a um exemplo prtico. Criaremos uma classe chamada Funcionrios, na qual definimos um mtodo chamado calcula_salario. Depois criaremos uma classe baseada na classe Funcionrios, a qual faz um override do mtodo calcula_salrio. Considere o exemplo da Listagem 4.8.
switch (cargo) { case gerente: return 2500; case diretor: return 4500; case funcionario: return 1500; default: return 1500; } }
155
www.juliobattisti.com.br
// Agora crio uma classe derivada de ClasseFuncionarios // chamada HerdaDeFuncionarios. // Nesta nova classe redefino o mtodo calcula_salario
public override int calcula_salario(string cargo) { switch (cargo) { case gerente: return 3000; case diretor: return 4000; case funcionario: return 2000; default: return 1000; } }
// Agora vamos definir o programa principal, onde // utilizaremos o mtodo que foi redefinido.
class Ex8cap4
www.juliobattisti.com.br
156
Console.WriteLine(********************************************); Console.WriteLine(RESULTADOS DO MTODO ORIGINAL); Console.WriteLine(VALOR DO SALRIO PARA {0}, -> {1},aux1,FuncionarioOriginal.calcula_salario(aux1));
// Chamo o mtodo que foi sobrescrito na classe HerdaDeFuncionarios // Passando como parmetro gerente
String aux2 = gerente; Console.WriteLine(********************************************); Console.WriteLine(RESULTADOS DO MTODO REDEFINIDO); Console.WriteLine(VALOR DO SALRIO PARA {0}, -> {1},aux1,FuncionarioModificado.calcula_salario(aux2));
} }
157
www.juliobattisti.com.br
IMPORTANTE: Alguns comandos aparecem divididos em duas linhas, por questo de espao para exibio. Estes comandos devem ser digitados em uma nica linha. A seguir temos um exemplo de um comando que est dividido em duas linhas por questes de espao:
Console.WriteLine(VALOR DO SALRIO PARA {0}, -> {1},aux1,FuncionarioModificado.calcula_salario(aux2));
Digite o exemplo da Listagem 4.8 e salve o mesmo em um arquivo chamado ex8cap4.cs, na pasta C:\ExCsharp\cap4. Compile e execute o exemplo da Listagem 4.8. Voc obter os resultados indicados na Figura 4.9.
simplesmente colocamos dois-pontos (:) aps o nome da classe e o nome da classe base. Dentro da classe HerdaDeFuncionarios utilizamos a palavra override para redefinir o mtodo calcula_salario, conforme indicado no trecho de cdigo a seguir:
www.juliobattisti.com.br
158
switch (cargo) { case gerente: return 3000; case diretor: return 4000; case funcionario: return 2000; default: return 1000; } }
No programa principal criamos dois objetos. Um do tipo ClasseFuncionarios e um do tipo HerdaDeFuncionarios. Dentro da funo Main chamamos o mtodo calcula_salario das duas classes e comprovamos que realmente eles retornam valores diferentes para o cargo de gerente. Isto comprova que o mtodo calcula_salario foi redefinido na classe herdada HerdaDeFuncionarios.
Concluso
Iniciamos o captulo falando de operadores e precedncia de operadores. Tratamos das diversas categorias de operadores e apresentamos alguns exemplos de utilizao dos mesmos. Em seguida comeamos a aprender como implementar, na prtica, os conceitos de orientao a objetos com o C#. Aprendemos a criar classes. Tambm falamos sobre mtodos construtores e destrutores. Na seqncia tratamos da criao de mtodos, dos diferentes tipos de parmetros que podem ser passados para um mtodo, e para finalizar tratamos do override de mtodos. No prximo captulo finalizaremos o nosso estudo bsico da linguagem C#. Veremos tpicos como o tratamento de excees e classes e mtodos para operaes matemticas e outras operaes bsicas no C#. A partir do Captulo 6 iniciaremos o nosso estudo de ASP.NET.
159
www.juliobattisti.com.br
Introduo
Neste captulo veremos mais alguns tpicos do C#, tpicos estes que sero utilizados na construo de pginas ASP.NET nos demais captulos do livro. Vamos iniciar o captulo apresentando a classe System.Math. Como o nome sugere, esta classe pertence ao namespace System. Atravs dos mtodos desta classe temos disposio uma srie de funes para clculos matemticos. Temos funes para clculos trigonomtricos, logartmicos e numricos. Em seguida aprenderemos a utilizar os mtodos e propriedades da estrutura System.DateTime, a qual pertence ao namespace System. Com o uso da estrutura System.DateTime temos acesso a propriedades que permitem retornar apenas parte de uma hora (hora, minuto ou segundo) e parte de uma data (ano, ms, dia). Operaes como ler ou gravar em um arquivo de texto so bastante comuns. Por isso aprenderemos a realizar estas operaes com o C#. Trabalharemos com as classes File e FileInfo do namespace System.IO. Vamos apresentar exemplos prticos de utilizao de mtodos e propriedades destas classes. Quando acontecem erros, o programa deve ser capaz de tratar os mesmos de uma maneira elegante. Por exemplo, se o usurio der um comando para gravar no disquete e no existir um disquete no drive, o programa deve ser capaz de interceptar e interpretar este erro e emitir uma mensagem para que o usurio insira um disquete e repita o comando. No seria nada elegante se o programa simplesmente fechasse devido a um erro deste tipo. Para fazer com que nossos programas sejam capazes de lidar bem com situaes como a descrita anteriormente devemos fazer o tratamento de excees. Neste captulo vamos aprender a fazer o tratamento de excees com o C#. Com este captulo encerramos o nosso estudo dos aspectos bsicos da linguagem C#. Estudamos algumas das classes disponveis no .NET Framework Class Library. Existem, sem exagero, literalmente, milhares de classes e mtodos no .NET Framework Class Library. Abordamos os elementos bsicos da linguagem, elementos estes que iremos utilizar na construo de pginas ASP.NET nos demais captulos deste livro. Procure entender os conceitos apresentados nos Captulos de 1 a 5. Estes conceitos so fundamentais para o acompanhamento dos demais captulos. Saber quais os componentes do Framework .NET, bem como conhecer as funes de cada um, de fundamental importncia.
CAPTULO
5
Tpicos Diversos em C#
www.juliobattisti.com.br
160
class ex1cap5 { // Exemplo1 - Captulo 5. // Campos da classe System.Math. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
// Exibio dos valores dos campos E e PI. Console.WriteLine(****************************************); Console.WriteLine(VALOR DO CAMPO E -> {0},Math.E); Console.WriteLine(VALOR DO CAMPO PI -> {0},Math.PI); Console.WriteLine(****************************************);
} }
161
www.juliobattisti.com.br
Mtodo Acos System.Math.Acos(nmero): Este mtodo retorna o valor do ngulo em que o coseno o nmero passado como parmetro. O valor passado como parmetro deve estar no intervalo de 1 at +1, que so os valores vlidos para o coseno. O valor do ngulo retornado est em radianos. Em termos de radianos, 3,14 radianos equivalem a 180 graus. Para converter de radiano para graus s utilizar a seguinte frmula: valor_em_graus = (valor_em_radianos*180)/PI
www.juliobattisti.com.br
162
Vamos a um exemplo completo no qual utilizamos os mtodos Abs e Acos. Considere o exemplo da Listagem 5.2
class ex2cap5 { // Exemplo2 - Captulo 5. // Mtodos da classe System.Math. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
Console.WriteLine(*************************************************); Console.WriteLine(NGULO PARA COS = -1 Console.WriteLine(NGULO PARA COS = -0,5 Console.WriteLine(NGULO PARA COS = 0 Console.WriteLine(NGULO PARA COS = 0.5 Console.WriteLine(NGULO PARA COS = 1 -> {0},Math.Acos(-1)); -> {0},Math.Acos(-0.5)); -> {0},Math.Acos(0)); -> {0},Math.Acos(0.5)); -> {0},Math.Acos(1));
163
www.juliobattisti.com.br
Console.WriteLine(*************************************************); Console.WriteLine(CONVERSO DOS NGULOS PARA GRAUS); Console.WriteLine(*************************************************); Console.WriteLine(NGULO PARA COS = -1 Console.WriteLine(NGULO PARA COS = -0,5 Console.WriteLine(NGULO PARA COS = 0 Console.WriteLine(NGULO PARA COS = 0.5 Console.WriteLine(NGULO PARA COS = 1 -> {0},((Math.Acos(-1)*180)/Math.PI)); -> {0},((Math.Acos(-0.5)*180)/Math.PI)); -> {0},((Math.Acos(0)*180)/Math.PI)); -> {0},((Math.Acos(0.5)*180)/Math.PI)); -> {0},((Math.Acos(1)*180)/Math.PI));
Console.WriteLine(*************************************************);
} }
Neste exemplo, primeiro exibimos os valores dos ngulos em radianos, depois utilizamos a frmula para converso de radianos para graus, que simplesmente multiplicar por 180 e dividir por PI. Observe que, para obter o valor do PI, utilizamos o campo PI da classe System.Math. Digite o exemplo da Listagem 5.2 e salve o mesmo em um arquivo chamado ex2cap5.cs, na pasta C:\ExCsharp\cap5. Compile e execute o exemplo da Listagem 5.2. Voc obter os resultados indicados na Figura 5.2. Mtodo Asin System.Math.Asin(nmero): Este mtodo retorna o valor do ngulo em que o seno o nmero passado como parmetro. O valor passado como parmetro deve estar no intervalo de 1 at +1, que so os valores vlidos para o seno. O valor do ngulo retornado est em radianos. Em termos de radianos, 3,14 radianos equivalem a 180 graus. Para converter de radiano para graus s utilizar a seguinte frmula: valor_em_graus = (valor_em_radianos*180)/PI Ex:
System.Math.Asin(-1) System.Math.Asin(-0.5) System.Math.Asin(0) System.Math.Asin(0.5) System.Math.Asin(1)
www.juliobattisti.com.br
164
Figura 5.3: Executando o programa ex2cap5.exe, aps trocar Acos por Asin.
165
www.juliobattisti.com.br
Mtodo Atan2 System.Math.Atan2(nmero,nmero): Este mtodo retorna o valor do ngulo em que a tangente igual diviso dos dois nmeros passados como parmetros. O valor do ngulo retornado est em radianos. Ex:
System.Math.Atan2(6,2) retorna 1,24904577239825 radiano System.Math.Atan2(4,2) retorna 1,10714871779409 radiano
Mtodo Ceiling System.Math.Ceiling(nmero): Este mtodo retorna o menor nmero inteiro que igual ou maior do que o nmero passado como parmetro. O valor do parmetro do tipo double. Ex:
System.Math.Ceiling(2.3498) retorna 3 System.Math.Ceiling(-2.3498) retorna -2 (lembre que 2 maior do que 3) System.Math.Ceiling(5.0001) retorna 6 System.Math.Ceiling(-1.9999) retorna -1 (lembre que 1 maior do que 2)
Mtodo Cos System.Math.Cos(valor em radianos): Este mtodo retorna o coseno do valor que foi passado como parmetro. O valor do parmetro deve estar em radianos. Por exemplo, ao invs de 180 graus, informamos 3,14 radianos (PI radianos). Nos exemplos a seguir utilizamos o campo PI para passar os valores em radianos para o mtodo Cos. Ex:
System.Math.Cos(Math.PI) retorna -1 System.Math.Cos(0) retorna 1
Mtodo Exp System.Math.Exp(nmero): Este mtodo retorna o nmero e (Math.E) elevado no expoente passado como parmetro. Ex:
System.Math.Exp(2) System.Math.Exp(0) retorna 7,38905609893065 retorna 1
Mtodo Floor System.Math.Floor(nmero): Este mtodo retorna o maior nmero inteiro que igual ou menor do que o nmero passado como parmetro. O valor do parmetro do tipo double. Ex:
System.Math.Floor(2.3498) System.Math.Floor(-2.3498) System.Math.Floor(5.0001) System.Math.Floor(-1.9999) retorna retorna retorna retorna 2 -3 (lembre que 3 menor do que 2) 5 -2 (lembre que 2 menor do que 1)
Mtodo IEEERemainder System.Math. IEEERemainder(x,y): Este mtodo retorna o resto da diviso de x por y. Ex:
System.Math. IEEERemainder(10,4)retorna 2 System.Math. IEEERemainder(250,6) retorna 4 System.Math. IEEERemainder(10,5)retorna 0
www.juliobattisti.com.br
166
Mtodo Log10 System.Math. Log10(nmero). O mtodo Log retorna o logaritmo na base 10, do nmero passado como parmetro. Ex:
System.Math. Log10(10) System.Math. Log10(100) System.Math. Log10(1000) retorna 1 retorna 2 retorna 3
Mtodo Max System.Math.Max(nmero,nmero): Este mtodo retorna o maior valor dentre dois valores passados como parmetros. Os dois valores devem ser do mesmo tipo. Os tipos permitidos so os seguintes: Byte, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32 ou UInt64. Ex:
System.Math.Max(-5.-6) retorna -5 System.Math.Max(5,6) retorna 6
Mtodo Min System.Math.Min(nmero,nmero): Este mtodo retorna o menor valor dentre dois valores passados como parmetros. Os dois valores devem ser do mesmo tipo. Os tipos permitidos so os seguintes: Byte, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32 ou UInt64. Ex:
System.Math.Min(-5.-6) System.Math.Min(5,6) retorna -6 retorna 5
Mtodo Pow System.Math.Pow(x,y): Este mtodo retorna o nmero x elevado no expoente y. Ex:
System.Math.Pow(2.2) System.Math.Pow(2,3) System.Math.Pow(2,4) System.Math.Pow(5,2) retorna retorna retorna retorna 4 8 16 25
Mtodo Round System.Math.Round(nmero) Ou System.Math.Round (nmero,preciso): Este mtodo faz o arredondamento para o inteiro mais prximo ou para um nmero de casas decimais especificado. O parmetro nmero pode ser do tipo Double ou do tipo Decimal. O parmetro preciso, se especificado, deve ser do tipo Int32 e define o nmero de casas decimais. Ex:
System.Math.Round(2.49) retorna 2 System.Math.Round(2,4599) retorna 2 System.Math.Round(10.4987564,3) retorna 10,499
Mtodo Sin System.Math.Sin(valor em radianos): Este mtodo retorna o seno do valor que foi passado como parmetro. O valor do parmetro deve estar em radianos. Por exemplo, ao invs de 180 graus, informamos 3,14 radianos (PI radianos).
167
www.juliobattisti.com.br
Mtodo Sign System.Math.Sign(nmero): Este mtodo retorna um valor indicando o sinal do nmero passado como parmetro. O nmero passado como parmetro pode ser de um dos seguintes tipos: Decimal, Double, Int16, Int32, Int64, SByte ou Single. Ex:
System.Math.Sign(-32.15) System.Math.Sign(32.15) retorna -1 retorna 1
Mtodo Sqrt System.Math.Sqrt(nmero): Este mtodo retorna a raiz quadrada do nmero passado como parmetro. Ex:
System.Math.Sqrt(25) System.Math.Sqrt(144) retorna 5 retorna 12
Mtodo Tan System.Math.Tan(valor em radianos): Este mtodo retorna a tangente do valor que foi passado como parmetro. O valor do parmetro deve estar em radianos. Por exemplo, ao invs de 180 graus informamos 3,14 radianos (PI radianos). Nos exemplos a seguir utilizamos o campo PI para passar os valores em radianos para o
IMPORTANTE: No existe a tangente para valores onde o coseno vale 0. Para 90 (PI/2) e 270 graus (3PI/2) no existe o valor da tangente.
Vamos a um exemplo completo no qual utilizamos todos os mtodos matemticos apresentados neste item. Considere o exemplo da Listagem 5.3
class ex3cap5 { // Exemplo 3 - Captulo 5. // Campos e Mtodos da classe System.Math. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
www.juliobattisti.com.br
168
Console.WriteLine(*************************************************); Console.WriteLine(NGULO PARA SIN = -1 Console.WriteLine(NGULO PARA SIN = -0,5 Console.WriteLine(NGULO PARA SIN = 0 Console.WriteLine(NGULO PARA SIN = 0.5 Console.WriteLine(NGULO PARA SIN = 1 -> {0},Math.Asin(-1)); -> {0},Math.Asin(-0.5)); -> {0},Math.Asin(0)); -> {0},Math.Asin(0.5)); -> {0},Math.Asin(1));
Console.WriteLine(*************************************************); Console.WriteLine(NGULO PARA SIN = -1 Console.WriteLine(NGULO PARA SIN = -0,5 Math.PI)); Console.WriteLine(NGULO PARA SIN = 0 Console.WriteLine(NGULO PARA SIN = 0.5 Console.WriteLine(NGULO PARA SIN = 1 -> {0},((Math.Asin(-1)*180)/Math.PI)); -> {0},((Math.Asin(-0.5)*180)/ -> {0},((Math.Asin(0)*180)/Math.PI)); -> {0},((Math.Asin(0.5)*180)/Math.PI)); -> {0},((Math.Asin(1)*180)/Math.PI));
Console.WriteLine(*************************************************); Console.WriteLine(ANGULO PARA TAN = 3 Console.WriteLine(ANGULO PARA TAN = 2 -> {0},Math.Atan2(6,2)); -> {0},Math.Atan2(4,2));
Console.WriteLine(*************************************************);
Console.WriteLine(ARREDONDA UTILIZ. Ceiling -> {0},Math.Ceiling(2.3498)); Console.WriteLine(ARREDONDA UTILIZ. Ceiling -> {0},Math.Ceiling(-2.3498)); Console.WriteLine(ARREDONDA UTILIZ. Ceiling -> {0},Math.Ceiling(5.0001));
169
www.juliobattisti.com.br
Console.WriteLine(*************************************************); Console.WriteLine(COSENO PARA 180 graus PI-> {0},Math.Cos(Math.PI)); Console.WriteLine(COSENO PARA 0 graus -> {0},Math.Cos(0));
Console.WriteLine(*************************************************); Console.WriteLine(e elevado ao quadrado-> Console.WriteLine(e elevado na zero -> {0},Math.Exp(2)); {0},Math.Exp(0));
Console.WriteLine(*************************************************); Console.WriteLine(ARREDONDA UTILIZ. Floor -> {0},Math.Floor(2.3498)); Console.WriteLine(ARREDONDA UTILIZ. Floor -> {0},Math.Floor(-2.3498)); Console.WriteLine(ARREDONDA UTILIZ. Floor -> {0},Math.Floor(5.0001)); Console.WriteLine(ARREDONDA UTILIZ. Floor -> {0},Math.Floor(-1.9999));
Console.WriteLine(*************************************************); Console.WriteLine(RESTO DA DIVISO 10/4 Console.WriteLine(RESTO DA DIVISO 250/6 Console.WriteLine(RESTO DA DIVISO 10/5 -> {0},Math.IEEERemainder(10,4)); -> {0},Math.IEEERemainder(250,6)); -> {0},Math.IEEERemainder(10,5));
Console.WriteLine(*************************************************); Console.WriteLine(LOGARITMO NATURAL DE 10 -> {0},Math.Log(10)); Console.WriteLine(LOG DE 100 NA BASE 10 Console.WriteLine(LOG DE 16 NA BASE 2 -> {0},Math.Log(100,10)); -> {0},Math.Log(16,2));
Console.WriteLine(*************************************************); Console.WriteLine(LOGARITMO DE 10 Console.WriteLine(LOGARITMO DE 100 Console.WriteLine(LOGARITMO DE 1000 -> {0},Math.Log10(10)); -> {0},Math.Log10(100)); -> {0},Math.Log10(1000));
Console.WriteLine(*************************************************);
www.juliobattisti.com.br
170
Console.WriteLine(*************************************************); Console.WriteLine(2 ELEVADO NA 2 Console.WriteLine(2 ELEVADO NA 3 Console.WriteLine(2 ELEVADO NA 4 Console.WriteLine(5 ELEVADO NA 2 -> {0},Math.Pow(2,2)); -> {0},Math.Pow(2,3)); -> {0},Math.Pow(2,4)); -> {0},Math.Pow(5,2));
Console.WriteLine(*************************************************); Console.WriteLine(ROUND EM 2,49 Console.WriteLine(ROUND EM 2,4599 Console.WriteLine(10,4987564 COM 3 CASAS -> {0},Math.Round(2.49)); -> {0},Math.Round(2.4599)); -> {0},Math.Round(10.4987564,3));
Console.WriteLine(*************************************************); Console.WriteLine(SENO Console.WriteLine(SENO PARA 90 graus PI/2-> {0},Math.Sin(Math.PI/2)); PARA 0 graus -> {0},Math.Sin(0));
Console.WriteLine(*************************************************); Console.WriteLine(SINAL PARA -32,15 Console.WriteLine(SINAL PARA 32,15 -> {0},Math.Sign(-32.15)); -> {0},Math.Sign(32.15));
Console.WriteLine(*************************************************); Console.WriteLine(RAIZ QUADRADA DE 25 Console.WriteLine(RAIZ QUADRADA DE 144 -> {0},Math.Sqrt(25)); -> {0},Math.Sqrt(144));
Console.WriteLine(*************************************************); Console.WriteLine(TANENTE PARA 60 Console.WriteLine(TANENTE PARA graus PI-> {0},Math.Tan(Math.PI/3)); -> {0},Math.Tan(0));
0 graus
} }
Digite o exemplo da Listagem 5.3 e salve o mesmo em um arquivo chamado ex3cap5.cs, na pasta C:\ExCsharp\ cap5. Compile e execute o exemplo da Listagem 5.3. Obteremos os resultados indicados a seguir:
171
www.juliobattisti.com.br
************************************************* VALOR ABSOLUTO DE -32.10 -> 32,1 ************************************************* UTILIZAO DO MTODO Asin ************************************************* NGULO PARA SIN = -1 NGULO PARA SIN = -0,5 NGULO PARA SIN = 0 NGULO PARA SIN = 0.5 NGULO PARA SIN = 1 -> -1,5707963267949 -> -0,523598775598299 -> 0 -> 0,523598775598299 -> 1,5707963267949
************************************************* CONVERSO DOS NGULOS PARA GRAUS ************************************************* NGULO PARA SIN = -1 NGULO PARA SIN = -0,5 NGULO PARA SIN = 0 NGULO PARA SIN = 0.5 NGULO PARA SIN = 1 -> -90 -> -30 -> 0 -> 30 -> 90
************************************************* NGULO PARA TAN = 3 NGULO PARA TAN = 2 -> 1,24904577239825 -> 1,10714871779409
************************************************* ARREDONDA UTILIZ. Ceiling -> 3 ARREDONDA UTILIZ. Ceiling -> -2 ARREDONDA UTILIZ. Ceiling -> 6 ARREDONDA UTILIZ. Ceiling -> -1 ************************************************* COSENO PARA 180 graus PI-> -1 COSENO PARA 0 graus -> 1
*************************************************
www.juliobattisti.com.br
172
ARREDONDA UTILIZ. Floor -> 2 ARREDONDA UTILIZ. Floor -> -3 ARREDONDA UTILIZ. Floor -> 5 ARREDONDA UTILIZ. Floor -> -2 ************************************************* RESTO DA DIVISO 10/4 RESTO DA DIVISO 250/6 RESTO DA DIVISO 10/5 -> 2 -> 4 -> 0
************************************************* LOGARITMO NATURAL DE 10 -> 2,30258509299405 LOG DE 100 NA BASE 10 LOG DE 16 NA BASE 2 -> 2 -> 4
************************************************* ROUND EM 2,49 ROUND EM 2,4599 10,4987564 COM 3 CASAS -> 2 -> 2 -> 10,499
173
www.juliobattisti.com.br
SINAL PARA
32,15
-> 1
************************************************* TANENTE PARA TANENTE PARA 60 0 graus PI/3 graus -> 1,73205080756888 -> 0 -> 1,63317787283838E+16
class ex4cap5 { // Exemplo 4 - Captulo 5. // Construtores de System.DateTime. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
DateTime constrex1 = new DateTime(2001,7,21); DateTime constrex2 = new DateTime(0); DateTime constrex3 = new DateTime(2001,7,21,16,30,45);
www.juliobattisti.com.br
174
Console.WriteLine(****************************************);
} }
Digite o exemplo da Listagem 5.4 e salve o mesmo em um arquivo chamado ex4cap5.cs, na pasta C:\ExCsharp\cap5. Compile e execute o exemplo da Listagem 5.4. Voc obter os resultados indicados na Figura 5.4.
Neste exemplo estamos utilizando um construtor no qual so passados trs valores: ano, ms e dia. Os valores para hora, minuto e segundo so inicializados com zero, conforme pode ser confirmado na Figura 5.4.
DateTime constrex2 = new DateTime(0);
Neste exemplo utilizamos um construtor no qual passamos, com nico parmetro, o nmero de milisegundos a partir da menor data suportada pelo Framework .NET. Como passamos um valor zero, o mesmo ir exibir a menor data possvel, que, conforme podemos confirmar pela sada do programa, : 1/1/0001 00:00:00.
175
www.juliobattisti.com.br
Neste exemplo utilizamos um construtor no qual so passados seis valores: ano, ms, dia, hora, minuto e segundo.
Descrio Retorna apenas a parte referente data. Retorna apenas o dia. Retorna um nmero que indica o dia da semana. O nmero varia de zero para o Domingo, 1 para a segunda-feira, 2 para a tera-feira e assim por diante, at 6 para o sbado. Retorna um nmero que indica o dia do ano. Retorna 1 para 1 de Janeiro, 2 para 02 de Janeiro e assim por diante, at 365 (ou 366 se for ano bissexto) para 31 de Dezembro. Retorna apenas a hora. Retorna apenas o minuto. Retorna apenas o ms. Retorna a Data e a Hora do sistema. Retorna os segundos. Retorna apenas o Ano.
www.juliobattisti.com.br
176
class ex5cap5 { // Exemplo 5 - Captulo 5. // Propriedades de System.Date. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
Console.WriteLine(****************************************); Console.WriteLine(HORA DO SISTEMA Console.WriteLine(MINUTO DO SISTEMA Console.WriteLine(SEGUNDOS DO SISTEMA -> {0},constrex1.Hour); -> {0},constrex1.Minute); -> {0},constrex1.Second);
Console.WriteLine(ANO DO SISTEMA-> {0},constrex1.Year); Console.WriteLine(MS DO SISTEMA-> {0},constrex1.Month); Console.WriteLine(DIA DO SISTEMA-> {0},constrex1.Day); Console.WriteLine(DATA COMPLETA Console.WriteLine(DIA DA SEMANA Console.WriteLine(DIA DO ANO {0},constrex1.DayOfYear); -> {0},constrex1.Date); -> {0},constrex1.DayOfWeek); ->
} }
177
www.juliobattisti.com.br
www.juliobattisti.com.br
178
Tabela 5.2 Principais mtodos da classe System.IO.File. Mtodo AppendText Copy Descrio Anexa texto a um arquivo j existente ou cria um novo arquivo se ainda no existir o arquivo passado como parmetro. Efetua a cpia de um arquivo para uma pasta diferente ou para a mesma pasta com um nome diferente. Podemos especificar se o arquivo deve ser substitudo caso o mesmo j exista. Cria um arquivo em uma pasta especificada como parmetro. Exclui um arquivo passado como parmetro. Caso o arquivo no exista, ser gerada uma exceo. Determina se o arquivo passado como parmetro existe. Obtm os atributos do arquivo passado como parmetro. Retorna a data e a hora em que o arquivo foi criado. Retorna a data e a hora em que o arquivo foi acessado pela ltima vez. Retorna a data e a hora em que foram gravadas informaes no arquivo, pela ltima vez. Move o arquivo para uma nova localizao. Define os atributos de um arquivo. Define a informao sobre a hora e a data em que o arquivo foi criado. Define a informao sobre a ltima data e hora em que o arquivo foi acessado. Define a informao sobre a ltima data e hora em que foram feitas gravaes no arquivo.
Create Delete Exists GetAttributes GetCreationTime GetLastAccessTime GetLastWriteTime Move SetAttributes SetCreationTime SetLastAccessTime SetLastWriteTime
Vamos apresentar um exemplo no qual utilizamos alguns mtodos da classe System.IO.File. Neste exemplo vamos criar um arquivo chamado teste.txt. Este arquivo ser criado na pasta C:\. Depois utilizaremos alguns mtodos da classe System.IO.File.
179
www.juliobattisti.com.br
class ex6cap5 { // Exemplo 6 - Captulo 5. // Mtodos de System.IO.File // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
File.Copy(C:\\autoexec.bat,C:\\teste.bat);
// Exibe os atributos do arquivo teste.bat Console.WriteLine(Atributos de teste.bat -> {0},File.GetAttributes(C:\\teste.bat)); // Exibe a data e hora de criao do arquivo teste.bat Console.WriteLine(teste.bat foi criado em -> {0},File.GetCreationTime(C:\\teste.bat)); // Exibe a data e hora do ltimo acesso ao arquivo teste.bat Console.WriteLine(teste.bat foi acessado em -> {0},File.GetLastAccessTime(C:\\teste.bat));
www.juliobattisti.com.br
180
} }
Digite o exemplo da Listagem 5.6 e salve o mesmo em um arquivo chamado ex6cap5.cs, na pasta C:\ExCsharp\cap5. Compile e execute o exemplo da Listagem 5.6. Voc obter os resultados indicados na Figura 5.6.
IMPORTANTE: Se o arquivo C:\teste.bat j existir, ser gerado o erro de execuo indicado nas Figuras 5.7 e 5.8.
181
www.juliobattisti.com.br
Se no tivssemos feito esta referncia, ao invs de utilizar simplesmente File, teramos que utilizar o caminho completo:
System.IO.File
Tabela 5.3 Principais propriedades da classe System.IO.FileInfo. Propriedade Name Length Descrio Retorna o nome do arquivo. Retorna o tamanho do arquivo ou pasta passado como parmetro.
www.juliobattisti.com.br
182
Descrio Retorna uma instncia de um objeto do tipo Directory, a qual aponta para a pasta onde est o arquivo. Retorna o caminho completo para o arquivo passado como parmetro.
Vamos apresentar um exemplo no qual utilizamos as propriedades da classe System.IO.FileInfo. Considere o exemplo da Listagem 5.7.
class ex7cap5 { // Exemplo 7 - Captulo 5. // Propriedades de System.IO.FileInfo // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
// Vamos criar uma varivel meuarquivo, do tipo FileInfo, // a qual aponta para o arquivo C:\autoexec.bat
183
www.juliobattisti.com.br
Digite o exemplo da Listagem 5.7 e salve o mesmo em um arquivo chamado ex7cap5.cs, na pasta C:\ExCsharp\cap5. Compile e execute o exemplo da Listagem 5.7. Voc obter os resultados indicados na Figura 5.9.
O Tratamento de Excees
Tratar excees de fundamental importncia para que um programa no seja encerrado inesperadamente. Uma exceo pode acontecer durante o processamento do programa, quando algo inesperado acontece e deve ser tratado pelo programa, para que o mesmo no seja encerrado sem que o usurio saiba o que est acontecendo. Dois exemplos tpicos de excees: O programa tenta fazer uma leitura no disquete e no existe disquete no drive. Uma diviso por zero. As excees devem ser detectadas e opes devem ser oferecidas para o usurio do programa. Por exemplo, no caso do disquete que no est no drive, a exceo deve ser detectada e o programa deve exibir uma mensagem solicitando que o usurio insira um disquete no drive. Este procedimento muito mais amigvel do que simplesmente encerrar o programa.
www.juliobattisti.com.br
184
class ex8cap5 { // Exemplo 8 - Captulo 5. // Tratamento de excees com try e catch. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
try
185
www.juliobattisti.com.br
int divisao;
// Exibio dos resultados. Console.WriteLine(O valor da DIVISO } // Final do bloco try. -> {0},divisao);
// Incio do bloco catch. // Cdigo que ser executado se uma exceo // for gerada no bloco try. catch (Exception e) { Console.WriteLine(FOI GERADA A SEGUINTE EXCEO: + e.Message); }
Digite o exemplo da Listagem 5.8 e salve o mesmo em um arquivo chamado ex8cap5.cs, na pasta C:\ExCsharp\cap5. Compile e execute o exemplo da Listagem 5.8. Digite 10 para o numerador e 2 para o denominador. Voc obter os resultados indicados na Figura 5.10.
www.juliobattisti.com.br
186
187
www.juliobattisti.com.br
www.juliobattisti.com.br
188
CAPTULO 5: TPICOS DIVERSOS EM C# Listagem 5.9 Tratamento de excees com try e finally ex9cap5.cs
using System;
class ex9cap5 { // Exemplo 9 - Captulo 5. // Tratamento de excees com try e finally. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main() { // Bloco try. // Contm o cdigo que pode gerar a exceo.
try
int divisao;
// Clculo da diviso.
189
www.juliobattisti.com.br
-> {0},divisao);
// Incio do bloco finally. // Cdigo que ser executado mesmo que nenhuma exceo // seja gerada no bloco try.
finally
Digite o exemplo da Listagem 5.9 e salve o mesmo em um arquivo chamado ex9cap5.cs, na pasta C:\ExCsharp\cap5. Compile e execute o exemplo da Listagem 5.9. Digite 10 para o numerador e 2 para o denominador. Voc obter os resultados indicados na Figura 5.12. Observe que o cdigo do bloco finally foi executado, mesmo sem ter sido gerada nenhuma exceo.
www.juliobattisti.com.br
190
191
www.juliobattisti.com.br
class ex10cap5 { // Exemplo10 - Captulo 5. // Tratamento de excees com try - catch - finally. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main() { // Bloco try. // Contm o cdigo que pode gerar a exceo.
try
int divisao;
www.juliobattisti.com.br
192
// Clculo da diviso.
-> {0},divisao);
// Incio do bloco catch. // Cdigo que ser executado se uma exceo // for gerada no bloco try.
catch (Exception e)
// Incio do bloco finally. // Cdigo que ser executado mesmo que nenhuma exceo // seja gerada no bloco try.
finally
} }
193
www.juliobattisti.com.br
www.juliobattisti.com.br
194
Concluso
Neste captulo encerramos nosso estudo sobre os aspectos bsicos do C#. Estudamos os elementos da linguagem C# que sero utilizados no restante do livro. Com esse captulo encerramos a Parte I do livro, na qual falamos sobre o Framework .NET e sobre a linguagem C#. Estes captulos formam a base para o restante do livro. A partir do Captulo 6, com o qual iniciamos a Parte II deste livro, estaremos tratando da criao de pginas ASP.NET.
195
www.juliobattisti.com.br
PARTE
2
Fundamentos do ASP.NET
www.juliobattisti.com.br
196
Introduo
Na Parte I deste livro (Captulos de 1 a 5) tratamos dos conceitos bsicos do Framework .NET e da linguagem C#. Neste captulo iniciamos a Parte II do livro, na qual vamos apresentar esta nova verso da tecnologia ASP (Active Server Pages) ASP.NET. Vamos iniciar o captulo fazendo um rpido histrico sobre as vrias verses do ASP, desde o seu lanamento com o IIS 3.0 at a nova verso ASP.NET que faz parte do Framework .NET. Em seguida vamos falar sobre as vantagens e novas caractersticas e o porqu de precisarmos de uma nova verso, sendo que a ltima verso nem completou dois anos. Falaremos sobre as diversas novidades do ASP.NET e como cada uma poder ajudar no desenvolvimento mais rpido de aplicaes Web melhores, mais confiveis e mais seguras. Dentre as principais novidades que vamos apresentar neste captulo e detalhar nos demais, podemos destacar as seguintes: Separao entre lgica e apresentao. Mais fcil de implementar. Suporte a mltiplas linguagens. Web Form Controls controles mais avanados e inteligentes. Todas as vantagens oferecidas pelo Framework .NET. Uma vez feita a propaganda do ASP.NET vamos verificar se todo o suporte ao ASP.NET j est instalado, para que voc possa acompanhar os exemplos deste livro. Para finalizar o captulo apresentaremos alguns exemplos simples, apenas para termos uma idia de como uma pgina ASP.NET. Ao final deste captulo voc dever estar apto a relacionar as principais melhorias do ASP.NET em relao s verses anteriores. Voc tambm ser capaz de entender a estrutura de uma pgina ASP.NET bem como a maneira com que as mesmas so processadas pelo servidor IIS Internet Information Services.
CAPTULO
6
Uma Introduo ao ASP.NET
197
www.juliobattisti.com.br
www.juliobattisti.com.br
198
199
www.juliobattisti.com.br
www.juliobattisti.com.br
200
201
www.juliobattisti.com.br
www.juliobattisti.com.br
202
203
www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB Listagem 6.1 Uma pgina ASP cdigo ASP e HTML misturado.
<%@ Language=VBScript %> <HTML> <HEAD> <TITLE>Listagem de Clientes</TITLE> </HEAD>
<%
O Primeiro passo criar a conexo com o Banco de dados Para isto crio um objeto do tipo Connection Cria um Objeto do Tipo ADODB.Connection
O cdigo a seguir aparece em duas linhas por questo de espao, porm o mesmo deve ser digitado em uma nica linha.
O prximo passo criar uma instruo SQL a qual utilizada para criar a listagem de Clientes. O cdigo a seguir aparece em duas linhas por questo de espao, porm o mesmo deve ser digitado em uma nica linha.
Esta instruo SQL retorna os campos CodigoCliente, Cargo, Endereco e Fone, da tabela Clientes. Agora criamos um Objeto RecordSet. Este Objeto ir executar a instruo SQL e receber o resultado da Consulta.
www.juliobattisti.com.br
204
Neste ponto j tenho todos os registros retornados pela instruo SQL. Estes registros esto armazenados no objeto Clientes, que um objeto do tipo Recordset.
Agora passo a montar a pgina que ser retornada para o Navegador do Cliente. Vamos montar uma tabela com o resultado da consulta.
%>
<P> <HR>
<TR> <TD align=middle bgColor=gray>Cdigo</TD> <TD align=middle bgColor=gray>Cargo</TD> <TD align=middle bgColor=gray>Endereo</TD> <TD align=middle bgColor=gray>Fone</TD> </TR> <% Inicio um Loop para percorrer todos os registros do RecordSet Clientes, exibindo um Registro em cada Linha da tabela. Do Until Clientes.eof %>
<TR> <TD align=middle bgColor=gray><%=Clientes.Fields(CodigoCliente)%></TD> <TD align=middle bgColor=gray><%=Clientes.Fields(Cargo)%></TD> <TD align=middle bgColor=gray><%=Clientes.Fields(Endereco)%></TD> <TD align=middle bgColor=gray><%=Clientes.Fields(Fone)%></TD> </TR>
205
www.juliobattisti.com.br
Na Figura 6.4 temos esta pgina carregada no IE Internet Explorer. Observe que por mais organizados que sejamos, inserindo comentrios e endentaes no cdigo, no nada fcil a leitura e interpretao de uma pgina ASP. Isso acontece devido, principalmente, intercalao de cdigo ASP e cdigo HTML. Em uma mesma pgina ASP posso ter vrias sees de cdigo ASP. Cada seo inicia com <% e encerra com %>. Tudo o que no estiver entre estes dois marcadores cdigo HTML.
www.juliobattisti.com.br
206
207
www.juliobattisti.com.br
Tabela 6.1 Pastas criadas no Home Directory do servidor IIS Captulo Captulo6 Captulo7 Captulo8 Captulo9 Captulo10 Captulo11 Captulo12 Captulo13 Captulo14 Captulo15 Pasta D:\Inetpub\wwwroot\chap6 D:\Inetpub\wwwroot\chap7 D:\Inetpub\wwwroot\chap8 D:\Inetpub\wwwroot\chap9 D:\Inetpub\wwwroot\chap10 D:\Inetpub\wwwroot\chap11 D:\Inetpub\wwwroot\chap12 D:\Inetpub\wwwroot\chap13 D:\Inetpub\wwwroot\chap14 D:\Inetpub\wwwroot\chap15
Criarei os exemplos de cada captulo dentro da respectiva pasta. Por exemplo, ao criar o exemplo 1 deste captulo, vou salv-lo na pasta D:\Inetpub\wwwroot\chap6, com o nome de chap6ex1.aspx. O exemplo 2 deste captulo ser salvo como chap6ex2.aspx e assim por diante.
www.juliobattisti.com.br
208
NOTA: As pginas ASP.NET tm a extenso .aspx ao invs de .asp. Falaremos mais sobre as diferenas do ASP.NET em relao ao ASP, no prximo item.
IMPORTANTE: Se voc estiver utilizando uma configurao diferente para testar os exemplos deste livro, utilize as configuraes do equipamento que estiver utilizando em substituio s descritas neste item. Por exemplo, sempre que for solicitado acesso http://www.groza.com, substitua este endereo pelo endereo que voc estiver utilizando.
209
www.juliobattisti.com.br
Na Listagem 6.2 colocamos a estrutura bsica de uma pgina ASP.NET, onde temos uma seo de cdigo e uma seo com os elementos que formam a parte visual, ou de apresentao da pgina.
<body> controles e demais elementos da interface - Server controls - Web Forms - etc </body> </html>
Toda pgina ASP.NET tem esta estrutura. Uma parte inicial onde temos o cdigo, responsvel pela lgica da pgina. Na seo de cdigo, como chamada, podemos colocar comandos para fazer a conexo com um banco de dados, para realizar clculos, para responder a eventos que acontecem na pgina, como por exemplo um clique do usurio em um
www.juliobattisti.com.br
210
Na segunda parte da pgina, a partir da tag <body>, colocamos os elementos de apresentao da interface. Nesta parte podemos colocar desde cdigo HTML bsico, at controles mais avanados como os disponibilizados pelo ASP.NET. Nos Captulos 7, 8 e 9 estaremos estudando os controles disponveis com o ASP.NET. Tudo o que voc j conhece de HTML pode ser utilizado na seo de apresentao da pgina. Se ao invs de utilizarmos o VB quisssemos utilizar a linguagem C#, teramos que definir a tag <script>, da seguinte maneira:
<script language=C# runat=server> comando1 comando2 ... comandon </script>
Observe que a estrutura de uma pgina ASP.NET deixa bem clara a separao entre cdigo ASP.NET e cdigo de apresentao, bem diferente do que acontecia com o ASP 3.0 onde sees de cdigo ASP so intercaladas com sees de cdigo HTML. A estrutura apresentada na Listagem 6.2 o que chamamos de Code Inline, ou seja, o cdigo na prpria pgina ASP.NET, embora em uma seo de cdigo, separada da seo de apresentao. Outra maneira de procedermos a separao entre cdigo e apresentao atravs da tcnica chamada de Code Behind. Com esta tcnica colocamos o cdigo em um arquivo separado da pgina ASP.NET. Na pgina ASP.NET colocamos um comando para acessar o arquivo onde est o cdigo. Para utilizar Code Behind utilizamos o seguinte comando:
<%@Page Inherits=nome_da_classe Src=Caminho para o arquivo com o cdigo %>
NOTA: Nos exemplos deste livro estaremos utilizando o C#. Para uma introduo linguagem C# consulte os Captulos 3, 4 e 5.
Por exemplo, vamos criar o cdigo utilizando a linguagem C# e salvar o cdigo em um arquivo chamado codex1.cs, na mesma pasta onde est a pgina ex1.aspx. No incio da pgina ex1.aspx, devemos colocar o seguinte comando, para termos acesso ao cdigo do arquivo codex1.cs:
211
www.juliobattisti.com.br
Esta deve ser a primeira linha da pgina, antes inclusive da tag <html>. A utilizao de Code Behind facilita o reaproveitamento de cdigo. Vamos supor que estejamos criando uma srie de pginas que acessam um banco de dados no SQL Server 2000. Podemos colocar o cdigo de acesso ao banco de dados em um arquivo separado e utilizar a diretiva @Page para ter acesso a este cdigo em cada pgina onde o acesso ao SQL Server 2000 for necessrio. Se por algum motivo a forma de acesso tiver que ser modificada, basta alterar o arquivo com o cdigo e, pronto, as pginas que fazem uso deste arquivo passaro a acessar a verso atualizada. Se a pgina j tiver sido acessada anteriormente e estiver no cache de pginas no servidor IIS, o Framework .NET detecta que houve mudanas em um dos elementos da pgina. Na primeira vez que a pgina for solicitada aps as mudanas, uma nova verso da pgina ser compilada e enviada para o usurio. A nova verso ser mantida no cache para melhorar o desempenho. Se novas mudanas forem detectadas, o processo todo se repete.
Exemplo 1
Vamos criar um exemplo bastante simples. A nossa pgina contm dois controles do tipo texto, onde o usurio pode digitar informaes. A pgina tambm contm um boto de comando. Ao clicar no boto de comando, gerado o evento Click do respectivo boto. Vamos utilizar este evento. No evento Click do boto de comando vamos verificar os valores digitados nos campos usurio e senha e compar-los com valores previamente definidos, no prprio cdigo do evento. Se os valores digitados forem iguais aos valores previamente definidos, emitimos uma mensagem: LOGON EFETUADO COM SUCESSO !!!!; caso contrrio emitimos a mensgem LOGON FALHOU, TENTE NOVAMENTE!!!. Na Listagem 6.3 temos o cdigo para a criao da pgina proposta.
public void {
Botao_Click(Object sender,EventArgs e)
if (Nome.Value == user1 && Senha.Value == senha123) { Message.InnerHtml = LOGON EFETUADO COM SUCESSO !!!!;
www.juliobattisti.com.br
212
<body>
<form method=post runat=server> <h3>Digite o nome: <input id=Nome type=text size=40 runat=server>
<h3>Digite a senha: <input id=Senha type=password size=40 runat=server> <input type=submit value=Enter OnServerClick=Botao_Click runat=server>
</body> </html>
Digite o cdigo da Listagem 6.3 e salve o mesmo em um arquivo chamado chap6ex1.aspx, na pasta chap6, dentro da pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo:
http://localhost/chap6/chap6ex1.aspx
Ao carregarmos esta pgina no Internet Explorer obtemos o resultado indicado na Figura 6.5. Digite user1 para o nome e senha123 para a senha. D um clique no boto Enter. Voc receber uma mensagem dizendo que o logon foi efetuado com sucesso. Agora digite jose para o nome e senha123 para a senha. D um clique no boto Enter. Voc receber uma mensagem informando que o logon falhou e que voc deve tentar novamente, conforme indicado na Figura 6.6. Sem detalhar o cdigo vamos comentar os principais componentes do nosso exemplo.
213
www.juliobattisti.com.br
Cdigo para responder a um evento. A lgica do exemplo da Listagem 6.2 pode ser resumida da seguinte maneira: Quando o usurio clica no boto Enter disparado o evento Click deste boto, o qual dispara o cdigo contido no procedimento Botao_Click. Na prpria definio do controle indicamos o nome do procedimento e do evento, conforme indicado a seguir:
<input type=submit value=Enter OnServerClick=Botao_Click runat=server>
www.juliobattisti.com.br
214
No procedimento Botao_Click testamos os valores digitados pelo usurio nos campos Nome (Nome.Value) e Senha (Senha.Value). Dependendo dos valores utilizados retornamos uma ou outra mensagem. Observe que o cdigo no procedimento Botao_Click cdigo C# padro. Temos um teste if, no qual so feitos dois testes ligados pelo operador lgico AND (&&). Em resumo acontece o seguinte: 1. 2. 3. 4. A pgina chap6ex1.aspx carregada. O usurio preenche os campos Nome e Senha e d um clique no boto Enter. O evento Click do boto disparado. Em resposta ao evento Click, o procedimento Botao_Click executado.
NOTA: Na prtica, se estivssemos criando um formulrio para logon, o nosso evento Botao_Click deveria fazer conexo com um banco de dados ou com o Active Directory do Windows 2000, para verificar as credenciais fornecidas. Se o nome de usurio e senha estiver correto, o acesso liberado; caso contrrio uma mensagem de erro retornada para o usurio. Embora sem utilidade prtica, o exemplo chap6ex1.aspx serve, didaticamente, para
215
www.juliobattisti.com.br
Agora que apresentamos um exemplo bastante simples, apenas para comearmos com o ASP.NET, vamos ver um exemplo que faz conexo com um banco de dados do SQL Server 2000.
Se o computador que voc est utilizando tem o nome SERVNET, para fazer referncia a instncia NETSDK voc deve utilizar a seguinte nomenclatura:
SERVNET\NETSDK
NOTA: Para um curso completo de SQL Server 2000 consulte o livro: SQL SERVER 2000 Administrao & Desenvolvimento Curso Completo, de minha autoria, publicado pela editora Axcel Books (www.axcel.com.br).
Listagem 6.4 O segundo exemplo: conectando com o banco de dados pubs chap6ex2.aspx.
<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.SqlClient %> <html>
NOTA: A partir do Captulo 10 estaremos tratando em detalhes da conexo de pginas ASP.NET com banco de dados.
www.juliobattisti.com.br
216
// Conectamos com o banco de dados utilizando um comando SQL, // o qual retorna todos os dados da tabela Authors, do banco de // dados pubs.
// Criamos e preenchemos um objeto DataSet. // Observe que no temos mais o objeto Recordset, // como era de praxe com o ASP 3.0.
// Conectamos um controle DataGrid com o DataSet criado anteriormente. // MyDataGrid o id (nome) de um controle do tipo // DataGrid que est na seo de apresentao da pgina.
</script>
<h3><font face=Verdana>Registros da tabela Authors!</font></h3> <% Os registros da tabela Authors so exibidos no DataGrid. %>
217
www.juliobattisti.com.br
<ASP:DataGrid id=MyDataGrid runat=server Width=700" BackColor=#ccccff BorderColor=black ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Verdana Font-Size=8pt HeaderStyle-BackColor=#aaaadd MaintainState=false /> </body>
</html>
www.juliobattisti.com.br
218
Observe que estamos fazendo referncia a dois namespaces: System.Data e System.Data.SqlCliente. Vamos tratar exaustivamente dos membros destes namespaces nos captulos 10 e 11.
Observe que utilizamos duas barras invertidas ao invs de uma nica barra. Isto necessrio porque a barra invertida considerada um caractere de escape com significado especial para a linguagem C#. Quando, ao invs do caractere de escape, queremos que o C# entenda o mesmo como um caractere normal, temos que preced-lo de uma barra invertida. Na prtica as duas barras invertidas so interpretadas, pelo C#, como uma nica barra, o que produz o resultado desejado: SERVIDOR\NETSDK. Neste exemplo utilizamos as seguintes classes do namespace System.Data.SqlClient: SqlConnection SqlDataAdapter Tambm utilizamos as seguintes classes do namespace System.Data:
219
www.juliobattisti.com.br
Veja que no precisamos utilizar um lao While para percorrer todos os registros da tabela Authors, como tnhamos que fazer com o objeto RecordSet. O controle DataGrid faz parte dos chamados Web Server Controls. No Captulo 8 aprenderemos a utilizar os diversos Web Server Controls disponveis.
Vamos alterar o comando SQL para introduzir uma condio. Queremos que sejam retornados somente os registros para os autores em que a cidade (city) Oakland. Para isso basta que seja utilizada uma clusula where para especificar a condio city=Oakland, conforme indicado a seguir:
www.juliobattisti.com.br
220
Faa esta alterao na pgina chap6ex2.aspx e salve a nova verso da pgina na pasta chap6, com o nome de chap6ex3.aspx. Ao carregar esta nova verso, obteremos o resultado indicado na Figura 6.8.
Concluso
Neste captulo apresentamos o ASP.NET. Iniciamos o captulo justificando o porqu de mais uma verso para a tecnologia ASP Active Server Pages. Vimos que ASP.NET no apenas mais uma verso, mas sim uma mudana de paradigma, uma vez que com ASP.NET temos acesso a todas as vantagens do Framework .NET. Dentre as principais vantagens do ASP.NET, destacamos: O Framework .NET. Suporte a mltiplas linguagens. O programador precisa escrever menos cdigo. Separao entre o cdigo HTML e o cdigo ASP.NET. Maior facilidade na criao e utilizao de componentes, o que facilita a reutilizao de cdigo. Um conjunto de controles avanados: 1. 2. 3. HTML Server Controls. Web Server Controls. Validation Server Controls.
NOTA: No Anexo III apresento uma reviso dos conceitos bsicos da linguagem SQL Structured Query Language. Antes de estudar os captulos 10 e 11 seria interessante dar uma olhada no Anexo II O modelo de dados relacionais, e no Anexo III Fundamentos da linguagem SQL.
221
www.juliobattisti.com.br
www.juliobattisti.com.br
222
Introduo
Uma das inovaes mais bem-vindas do ASP.NET a disponibilizao de uma srie de controles mais poderosos, flexveis e inteligentes. Com ASP.NET temos acesso a diversos controles que permitem a criao de pginas com uma aparncia grfica mais parecida com os programas tradicionais do Windows, alm de termos acesso a um rico modelo de eventos, o que j estava disponvel em aplicaes tradicionais do Windows, a um bom tempo. Com as verses anteriores, criar pginas com uma aparncia grfica mais elaborada no era tarefa das mais fceis. Para alcanar uma aparncia mais profissional, tnhamos que lanar mo de uma srie de tecnologias diferentes, o que era bastante trabalhoso. Com o ASP.NET temos uma srie de elementos, conhecidos como controles de servidor, que nos ajudam na tarefa de criar pginas com uma aparncia mais profissional, e que so exibidas da mesma maneira nos diferentes navegadores. Com as tags HTML tradicionais, o que temos so elementos estticos em uma pgina. Em outras palavras, uma tag do tipo HTML <INPUT>, colocada em um formulrio HTML tradicional, utilizada para que o usurio faa uma entrada de texto, um elemento esttico. No existem eventos para este campo e no temos como acessar as propriedades do campo atravs de programao. Com o modelo de pgina das verses anteriores do ASP, tnhamos algumas limitaes. O exemplo de limitao mais tpico que tnhamos na criao de pginas ASP era a situao na qual precisvamos que a pgina fosse recarregada em perodos determinados. Por exemplo, uma pgina que fornece informaes sobre cotaes de aes precisa ser atualizada de minuto em minuto. Para atualizar a pgina, o usurio precisava utilizar o comando de atualizao do seu Browser. J com ASP.NET e o modelo baseado em eventos podemos fazer com que seja disparado um evento, por exemplo, de minuto em minuto. No cdigo do evento podemos inserir os comandos necessrios para que a pgina seja recarregada, automaticamente, com a verso mais atualizada, de minuto em minuto. Com a utilizao dos controles de servidor (Server Controls) temos uma mudana na maneira como criamos nossas pginas. O novo modelo utiliza a programao baseada em eventos. Aes que acontecem em um ou mais controles da pgina podem ser detectadas pelo servidor e uma ao pode ser tomada em resposta ao evento. Conforme voc j deve ter notado, o tradicional modelo de programao baseado em eventos, s que agora trazido para o mundo do desenvolvimento de aplicaes e pginas Web. Existem diversos tipos de controles de servidor, dentre os quais podemos destacar os seguintes tipos:
CAPTULO
7
HTML Server Controls
223
www.juliobattisti.com.br
www.juliobattisti.com.br
224
A Classe Page
Toda pgina .aspx acessada a partir de um servidor onde est instalado o Framework .NET, quer a pgina contenha cdigo ASP.NET ou somente cdigo HTML, compilada e criado um objeto do tipo Page, o qual fica armazenado no cache de memria do servidor. Em outras palavras, ao acessarmos uma pgina .aspx, a mesma compilada, sendo gerada uma instncia da classe Page, sendo esta instncia armazenada no cache do servidor para melhorar a velocidade de acesso pgina. Qualquer alterao na pgina , automaticamente, detectada pelo Framework .NET, a nova verso compilada e armazenada no cache de memria do servidor, em substituio verso anterior. Na classe Page esto definidos as propriedades, mtodos e eventos comuns a todas as pginas processadas pelo Runtime do ASP.NET. A classe Page funciona como um Conteiner para todos os componentes que fazem parte da pgina. Como analogia, nas aplicaes Windows, temos a figura do Formulrio (Form), o qual um Container para todos os elementos da aplicao.
Tabela 7.1 Eventos da classe Page. Evento AbortTransaction CommitTransaction DataBinding Error Init Load PreRender Unload Descrio Ocorre quando uma transao cancelada. Ocorre quando uma transao finalizada com sucesso. Ocorre quando um controle de servidor (Server Control) vinculado a uma fonte de dados. Ocorre quando detectada uma exceo que no foi tratada. Ocorre quando a pgina inicializada. Ocorre quando a pgina carregada e todos os seus controles tiverem sido carregados. Ocorre antes que qualquer informao seja enviada para o navegador do cliente. Ocorre quando o processamento da pgina finalizado. Isto ocorre aps todas as informaes terem sido enviadas para o navegador do cliente.
Vamos a um exemplo no qual utilizamos o evento Load da pgina, para emitir uma mensagem. Na Listagem 7.1 temos um exemplo de pgina, onde definimos o valor de um controle da pgina controle Mensagem, durante o evento Load da pgina.
225
www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB Listagem 7.1 Utilizando o evento Load chap7ex1.aspx.
<html>
void Page_Load(Object Src, EventArgs E) { Mensagem.Value = ltimo acesso em: + DateTime.Now; } </script>
</html>
Digite o cdigo da Listagem 7.1 e salve o mesmo em um arquivo chamado chap7ex1.aspx, na pasta chap7, dentro da pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/ chap7/chap7ex1.aspx Ao carregarmos esta pgina no Internet Explorer obtemos o resultado indicado na Figura 7.1.
www.juliobattisti.com.br
226
Observe a propriedade runat=server definindo que este um controle de servidor e que, portanto, temos acesso s suas propriedades atravs do cdigo da pgina. Foi exatamente isto que fizemos no evento Load, quando definimos o valor da propriedade Load do evento Mensagem, conforme indicado a seguir:
void Page_Load(Object Src, EventArgs E) { Mensagem.Value = ltimo acesso em: + DateTime.Now; }
Podemos utilizar os eventos da classe Page, para uma srie de funes, tais como: Cdigo para conexo com banco de dados. Cdigo para verificao das permisses de acesso. Cdigo para configurao dos controles da pgina.
Tabela 7.2 Propriedades da classe Page. Propriedade Application Descrio Faz referncia a um objeto do tipo Application. Um nico objeto do tipo Application criado para cada aplicao Web. A instncia do objeto Application compartilhada por todos os clientes que acessam pginas da aplicao Web. Retorna uma referncia a um objeto do tipo Cache, o qual pode ser utilizado para armazenar dados que so utilizados nas prximas solicitaes da pgina. O objeto cache utiliza campos do tipo oculto para manter o estado dos elementos de uma pgina entre uma chamada e outra da pgina. Esta propriedade permite alterar a deteco automtica do Browser do cliente, que feita pelo Framework .NET, e especificar o Browser que deve ser considerado para a montagem da pgina de retorno para o usurio. um valor Boleano (True ou False). O valor desta propriedade indica se os controles da pgina devem ou no manter o seu estado entre uma chamada e outra da pgina. Esta propriedade afeta todos os controles da pgina. Por padro definida em True.
Cache
ClientTarget
EnableViewState
227
www.juliobattisti.com.br
Descrio Pode ser utilizada para retornar ou definir a pgina que deve ser carregada, caso seja detectada uma exceo no tratada. um valor Boleano. Se for verdadeiro (True), indica que a pgina est sendo recarregada pelo usurio, o que conhecido como um round-trip (ida e volta). Quando for False, significa que a pgina est sendo carregada pela primeira vez e, conseqentemente, no existem valores de estado armazenados no cache do servidor, para os controles da pgina. Podemos utilizar esta propriedade para detectar se est sendo feita a carga inicial da pgina e, em caso afirmativo, utilizar o evento Page_Load para definir os valores iniciais, para os controles da pgina. Com o ASP.NET temos os chamados Validation Controls. Estes controles so capazes de fazer a validao dos dados digitados em um formulrio. Se a validao de todos os controles ocorrer com sucesso, a propriedade IsValid definida como True; caso contrrio, a propriedade ser definida como False. Se a pgina no tiver nenhum controle de validao, a propriedade retornar True. Permite que tenhamos acesso aos dados enviados com a requisio HTTP da pgina. Esta propriedade retorna uma referncia ao objeto Request. Estudaremos este objeto em detalhes, ainda neste captulo. Permite que tenhamos acesso aos dados enviados com HTTP response da pgina. Esta propriedade retorna uma referncia ao objeto Response. Um Response est, geralmente, associado com um formulrio. Estudaremos este objeto em detalhes, ainda neste captulo. Retorna uma referncia ao objeto Server. Retorna uma referncia ao objeto Session. uma propriedade Boleana. Retorna True se o Trace para a pgina estiver habilitado e False, em caso contrrio. O objeto Trace utilizado para depurao de pginas. Retorna uma referncia ao objeto Trace, caso o mesmo tenha sido habilitado. Obtm informaes a respeito do usurio que est fazendo a requisio da pgina. Retorna uma coleo que contm todos os controles de validao da pgina.
IsValid
Request
Response
Vamos a um exemplo no qual exibimos o valor de diversas propriedades da classe Page. Na Listagem 7.2 temos um exemplo de pgina, onde so exibidos os valores de diversas propriedades da classe page.
www.juliobattisti.com.br
228
Convert.ToString(Page.Cache); = Convert.ToString(Page.ClientTarget); Convert.ToString(Page.EnableViewState); http://localhost/erros/erro.aspx; Convert.ToString(Page.ErrorPage); Convert.ToString(Page.IsPostBack); Convert.ToString(Page.IsValid); Convert.ToString(Page.Request); Convert.ToString(Page.Response); Convert.ToString(Page.Server); Convert.ToString(Page.Session);
PrClientTarget.Value
PrEnableViewState.Value = Page.ErrorPage PrErrorPage.Value PrIsPostBack.Value PrIsValid.Value PrRequest.Value PrResponse.Value PrServer.Value PrSession.Value PrTrace.Value PrUser.Value = = = = = = = = = =
Convert.ToString(Page.Trace); Convert.ToString(Page.User);
} </script> <body>
!!! </H1>
<TABLE>
229
www.juliobattisti.com.br
<TR> <TD> <B>Cache: </B> </TD> <TD> <input id=PrCache type=text size=60 runat=server> </TD> </TR>
<TR> <TD> <B>ClientTarget: </B> </TD> <TD> <input id=PrClientTarget type=text size=60 runat=server> </TD> </TR>
<TR> <TD> <B>EnableViewState: </B> </TD> <TD> <input id=PrEnableViewState type=text size=60 runat=server> </TD> </TR>
www.juliobattisti.com.br
230
<TR> <TD> <B>IsPostBack: </B> </TD> <TD> <input id=PrIsPostBack type=text size=60 runat=server> </TD> </TR>
<TR> <TD> <B>IsValid: </B> </TD> <TD> <input id=PrIsValid type=text size=60 runat=server> </TD> </TR>
<TR> <TD> <B>Request: </B> </TD> <TD> <input id=PrRequest type=text size=60 runat=server> </TD> </TR> <TR> <TD> <B>Response: </B> </TD> <TD> <input id=PrResponse type=text size=60 runat=server>
231
www.juliobattisti.com.br
<TR> <TD> <B>Server: </B> </TD> <TD> <input id=PrServer type=text size=60 runat=server> </TD> </TR>
<TR> <TD> <B>Session: </B> </TD> <TD> <input id=PrSession type=text size=60 runat=server> </TD> </TR>
<TR> <TD> <B>Trace: </B> </TD> <TD> <input id=PrTrace type=text size=60 runat=server> </TD> </TR>
<TR> <TD> <B>User: </B> </TD> <TD> <input id=PrUser type=text size=60 runat=server>
www.juliobattisti.com.br
232
</TABLE>
</body> </html>
Digite o cdigo da Listagem 7.2 e salve o mesmo em um arquivo chamado chap7ex2.aspx, na subpasta chap7, dentro da pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http:// localhost/chap7/chap7ex2.aspx Ao carregarmos esta pgina no Internet Explorer obtemos o resultado indicado na Figura 7.2.
233
www.juliobattisti.com.br
Utilizamos esta diretiva para termos acesso classe Convert, do namespace System. Utilizamos o mtodo ToString da classe Convert Convert.ToString, para converter os valores retornados pelas propriedades da classe Page, em valores de texto, e atribuir os valores de texto para controles do tipo input na seo de apresentao da pgina. Na seo de cdigo acessamos os valores para as propriedades da classe page. Por exemplo, para a propriedade Application, utilizamos o seguinte cdigo:
PrApplication.Value = Convert.ToString(Page.Application);
Page.Application retorna o valor da propriedade Application. O valor retornado convertido para String pelo mtodo Convert.ToString. O valor j convertido para String atribudo propriedade Value do controle PrApplication, na seo de apresentao da pgina. O resultado prtico disso tudo que o valor da propriedade Application ser exibido no controle PrApplication, na seo de apresentao. Na seo de apresentao utilizamos uma tabela para exibir os controles melhor alinhados. Para isso utilizamos as tags do HTML para construo de tabelas: <TABLE> </TABLE> para a criao da tabela. <TR> </TR> para a criao de uma nova linha. <TD> </TD> para a criao de uma nova clula em cada linha. Para acessar as propriedades do objeto page, utilizamos a sintaxe padro para acesso aos componentes de um objeto:
nome_do_objeto.nome_componente
NOTA: Para maiores detalhes sobre os comandos bsicos da linguagem HTML consulte o Anexo I.
Por exemplo, para acessar a propriedade Cache, do objeto page, utilizamos a seguinte sintaxe:
Page.Cache.
IMPORTANTE: Quando uma pgina .aspx carregada, a mesma compilada como um objeto que uma instncia da classe Page. Sendo um objeto, temos acesso a suas propriedades, mtodos e eventos.
www.juliobattisti.com.br
234
Tabela 7.3 Mtodos da classe Page. Mtodos DataBind FindControl MapPath Validate Descrio Executa uma operao de DataBind para todos os controles da pgina. Permite que localizemos um determinado controle, na pgina. Retorna o caminho fsico para um determinado diretrio virtual. Faz com que os controles de validao da pgina faam a validao de seus contedos.
235
www.juliobattisti.com.br
Com o mecanismo de round-trip e ViewState, o ASP.NET traz para o mundo stateless do protocolo HTTP um modelo capaz de fazer a manuteno de estado para aplicaes Web. Este um grande avano, pois com as verses anteriores o programador era obrigado a fazer verdadeiros malabarismos para conseguir uma manuteno de estado eficiente.
IMPORTANTE:Tambm podemos desabilitar o mecanismo de ViewState em nvel de controle. Veremos isso mais adiante.
Com ASP.NET o prprio Framework .NET nos disponibiliza mecanismos eficientes para a manuteno de estado. Esta mais uma das caractersticas que comprovam o objetivo do Framework .NET em oferecer o mximo de funcionalidade, deixando para o desenvolvedor apenas o cdigo relacionado com a lgica e a apresentao da aplicao.
www.juliobattisti.com.br
236
A propriedade runat=server faz com que o controle seja compilado juntamente com a pgina e executado, no servidor, cada vez que a pgina requisitada. Observe que esta forma de processamento demanda mais recursos do servidor do que os controles HTML tradicionais. Em segundo lugar os controles disponibilizam um modelo de programao baseado em eventos. Esta uma mudana importante em relao s verses anteriores. Por exemplo, quando o usurio clica em um boto Enviar, os valores do formulrio so enviados para o servidor e o evento Click do boto disparado. Podemos escrever o cdigo que executa quando o evento disparado. Ns j fizemos uso desta tcnica no Exemplo da Listagem 6.1 chap6ex1.aspx. Na seo de apresentao do exemplo citado, temos um controle do tipo Submit um boto de comando. Este controle criado com a linha de cdigo a seguir:
<input type=submit value=Enter OnServerClick=Botao_Click runat=server>
Observe a propriedade OnServerClick=Botao_Click. Esta propriedade define o nome do procedimento que ser executado, no servidor, em resposta ao evento Click do boto. Na seo de cdigo da pgina criamos um procedimento chamado Botao_Click, o qual executado em resposta ao evento Click do boto de comando, conforme indicado no cdigo a seguir:
<script language=C# runat=server> public void { if (Nome.Value == user1 && Senha.Value == senha123) { Message.InnerHtml = LOGON EFETUADO COM SUCESSO !!!!; } else { Message.InnerHtml = LOGON FALHOU, TENTE NOVAMENTE !!!; } } </script> Botao_Click(Object sender,EventArgs e)
Cada controle de servidor considerado, pelo Framework .NET, como um objeto da pgina. Como um objeto, o controle possui propriedades, mtodos e eventos, os quais so acessveis atravs do cdigo de programao.
237
www.juliobattisti.com.br
Tabela 7.4 Principais propriedades da classe System.Web.UI.HtmlControls.HtmlControl. Propriedade Attributes ClientID Disabled EnableViewState ID Page Descrio Retorna uma coleo de todos os atributos do tipo pares de nome/valor contidos na pgina .aspx, na qual est o controle. Retorna a identificao do controle. Esta identificao gerada pelo ASP.NET e utilizada, dentre outras coisas, para manter o estado do controle. Utilizado para retornar ou definir um valor que indica se o controle est ou no desabilitado. Utilizado para retornar ou definir um valor boleano que indica se o controle de estado est habilitado (true) ou desabilitado (false), para o controle. Utilizado para retornar ou definir um nome associado ao controle. Este nome utilizado no cdigo para acessar as propriedades e mtodos do controle. Retorna uma referncia para a pgina que contm o controle.
www.juliobattisti.com.br
238
Descrio Retorna informao a respeito do Web site. Utilizado para retornar ou definir um valor que indica se o controle ou no visvel.
HTMLForm Control
Este controle utilizado para a criao de formulrios. o tradicional <form> </form>. Na prtica, todo controle de servidor deve ser colocado dentro de um formulrio. O que define o controle como um Server Control o atributo runat=server. Sintaxe para o controle Form:
<form runat=server id=identificao_no_cdigo method=POST | GET action=endereo > Controles que definem os elementos do formulrio </form>
NOTA: Para uma referncia a todas as propriedades e mtodos da classe System.Web.UI.HtmlControls.HtmlControl, consulte a documentao do Framework .NET, no item .NET Framework Reference.
Onde temos as seguintes propriedades: runat=server: Define que um controle de servidor, ou seja, que ser processado no servidor. id=identificao_no_cdigo: Um nome que atribumos ao controle, nome este que ser usado para acessar as propriedades e mtodos do controle, atravs de programao. method: Existem dois mtodos para enviar um formulrio para o servidor: POST e GET. O mtodo GET mais limitado, sendo que na grande maioria das vezes utilizamos o mtodo POST. action: O endereo de uma pgina que ir receber os dados digitados no formulrio e realizar alguma ao com os dados. Por exemplo, podemos criar um formulrio de cadastro, onde o formulrio digita os seus dados para o cadastramento. O formulrio de cadastro criado como uma pgina ASP.NET chamada cadastro.aspx. O usurio preenche os dados e clica em um boto Enviar. Ao clicar no boto Enviar, os dados digitados pelo usurio sero passados para a pgina definida na propriedade action vamos cham-la de insere.aspx. A pgina insere.aspx recebe os dados digitados pelo usurio, insere os mesmos em uma tabela de um banco de dados do SQL Server 2000 e retorna uma mensagem para o usurio. As etapas do exemplo descrito esto ilustradas na Figura 7.3.
239
www.juliobattisti.com.br
NOTA: No podemos incluir mais do que um controle HtmlForm em uma pgina. Se voc inserir mais do que um HtmlForm, uma exceo ser gerada. Por padro, method definido como POST e a propriedade action definida com o endereo da prpria pgina.
} </script> <body>
www.juliobattisti.com.br
240
<tr> <td><h3>Voc digitou: </h3> </td> <td><input id=Voltou type=text size=40 runat=server> </td> </tr>
<tr> <td><h3>Clique no boto ></h3></td> <td><input type=submit value=Enviar OnServerClick=Enviar_Click runat=server></td> </tr> </table> </form> </body> </html>
Digite o cdigo da Listagem 7.3 e salve o mesmo em um arquivo chamado chap7ex3.aspx, na pasta chap7, dentro da pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/ chap7/chap7ex3.aspx Ao carregarmos esta pgina no Internet Explorer obtemos um formulrio com dois campos para digitao de texto. Digite a mensagem: Exemplo de formulrio, no primeiro controle e d um clique no boto Enviar. A mensagem Exemplo de formulrio ser exibida no segundo campo, conforme indicado na Figura 7.4.
241
www.juliobattisti.com.br
NOTA: Apenas para lembrar, voc pode desabilitar a manuteno automtica de estado utilizando a seguinte diretiva, no incio da pgina: <%@Page EnableViewState=false %>
Algumas observaes sobre o cdigo do nosso exemplo. No definimos a propriedade action do formulrio. Com isso, ao clicar no boto Enviar, a pgina chama a si mesma, pois, conforme descrito, o valor padro para a propriedade action o endereo da prpria pgina, onde est o formulrio. No formulrio definimos um evento a ser disparado em resposta ao clique no boto enviar. Esta definio feita na seguinte linha de cdigo:
<td><input type=submit value=Enviar OnServerClick=Enviar_Click runat=server></td>
Neste caso definimos que, ao ocorrer o evento Click (OnServerClick), deve ser executado o procedimento Enviar_Click. O procedimento enviar Click, atribui o valor digitado no campo Digitou propriedade Value do campo Voltou. Isto equivalente a copiar o contedo do campo Digitou para o campo Voltou. O procedimento Enviar_Click est na seo de cdigo da pgina, conforme indicado na figura a seguir:
<script language=C# runat=server> public void { Voltou.Value = Digitou.Value; } </script> Enviar_Click(Object sender,EventArgs e)
HTMLInputText Control
utilizado para a criao de campos, em um formulrio, onde o usurio pode digitar texto. Este controle utilizado para criar controles que rodam no servidor, para os tipos e funes indicados na Tabela 7.5. O que define o controle como sendo de servidor a propriedade runat=server.
www.juliobattisti.com.br
242
Tabela 7.5 HTMLInputText Control Tipo Texto Senha Descrio <input type=text>. Para a digitao de informaes como por exemplo: nome, endereo, telefone, e-mail, etc. <input type=password>. Para a digitao de senhas. Ao ser digitada uma senha, so exibidos somente asteriscos (*) no Windows 95, 98, NT ou 2000; j no Windows XP so exibidos pontos grandes.
runat=server: Define que um controle de servidor, ou seja, que ser processado no servidor. id=identificao_no_cdigo: Um nome que atribumos ao controle, nome este que ser usado para acessar as propriedades e mtodos do controle, atravs de programao. maxlength: tamanho mximo de caracteres para o campo. size: tamanho da caixa que exibida para o campo. Se for menor que o tamanho mximo do campo, ao digitar informao, quando o texto digitado atingir o tamanho mximo de exibio, o texto ser deslocado para a esquerda, para que o usurio continue digitando. value: Valor padro associado ao campo. Ao carregarmos a pgina o controle exibido em branco, a menos que exista um valor padro para o mesmo, caso em que ser exibido o valor padro. No exemplo da pgina chap7ex3.aspx, utilizamos dois controles do tipo <input type=text>, conforme indicado pelo trecho de cdigo a seguir:
... <td><h3>Digite um texto:</h3> </td> <td><input id=Digitou type=text size=40 runat=server></td> ... <td><h3>Voc digitou: </h3> </td> <td><input id=Voltou type=text size=40 runat=server> </td> ...
243
www.juliobattisti.com.br
Faa estas alteraes no cdigo da Listagem 7.3 e salve a mesma com o nome de chap7ex4.aspx, na subpasta chap7, da pasta wwwroot descrita anteriormente. Para acessar esta nova verso da pgina, utilize o seguinte endereo: http:/ /localhost/chap7/chap7ex4.aspx Ao carregar esta pgina voc obter os resultados indicados na Figura 7.5.
HTMLInputCheckBox
utilizado para a criao de controles de seleo em um formulrio. Os controles do tipo CheckBox so exibidos como pequenos quadradinhos. So controles do tipo marcado/desmarcado. Se o controle estiver marcado, ao clicarmos ele ser desmarcado. Se o controle estiver desmarcado, ao clicarmos ele ser marcado. Normalmente utilizado em grupos. Em um grupo de controles do tipo CheckBox podemos selecionar mais do que um controle. Por exemplo, para
www.juliobattisti.com.br
244
Onde temos: runat=server: Define que um controle de servidor, ou seja, que ser processado no servidor. id=identificao_no_cdigo: Um nome que atribumos ao controle, nome este que ser usado para acessar as propriedades e mtodos do controle, atravs de programao. checked: Valor boleano que indica se o controle est marcado (True) ou no (False). Vamos apresentar um exemplo. Exemplo: Vamos criar um formulrio onde o cliente digita o Nome, o E-mail e seleciona as res de preferncia, nas quais deseja receber informaes por e-mail. Utilizaremos o evento Click do boto Enviar, para exibir os valores digitados pelo usurio. Para exibio dos valores vamos utilizar um controle do tipo caixa de texto HtmlTextArea control; mais adiante falaremos em detalhes sobre este controle. Na Listagem 7.4 temos a pgina do exemplo proposto.
String Aux;
// Comeo a montar uma string que ser atribuda // propriedade Value do controle Dados.
245
www.juliobattisti.com.br
if (Administrao.Checked==true) { Aux= Aux +\n +Administrao; } if (Informtica.Checked==true) { Aux= Aux +\n +Informtica; }
Dados.Value = Aux;
</script>
<body> <form method=post runat=server> <table> <tr> <td><h3>Nome:</h3> </td> <td><input id=Nome type=text size=40 runat=server></td> </tr>
www.juliobattisti.com.br
246
<tr> <td><h3>Dados do cliente:</h3> </td> <td><textarea id=Dados cols=60" rows=10" visible=false runat=server></textarea> </td> </tr>
<tr> <td><h3>Clique no boto ></h3></td> <td><input type=submit value=Enviar OnServerClick=Enviar_Click runat=server></td> </tr>
</table>
247
www.juliobattisti.com.br
www.juliobattisti.com.br
248
NOTA: Para maiores informaes sobre os comandos bsicos da linguagem HTML consulte o Anexo I.
249
www.juliobattisti.com.br
String Aux;
// Comeo a montar uma string que ser atribuda // propriedade Value do controle Dados.
Lembrando do Captulo 3, o + o operador de concatenao e o \n o cdigo para troca de linha. Na seqncia utilizamos a instruo if para determinar se o controle Negcios foi selecionado. Em caso afirmativo concatenamos Negcios varivel Aux, conforme indicado no trecho de cdigo a seguir:
if (Negocios.Checked==true) { Aux= Aux +\n +Negcios; }
O mesmo procedimento utilizado para determinar se as demais opes foram ou no selecionadas. Na ltima linha da seo de cdigo definimos a propriedade Value do controle Dados (controle do tipo textarea) como sendo igual varivel Aux, conforme indicado no seguinte comando:
Dados.Value = Aux;
HtmlTextArea Control
Utilizamos este controle no exemplo da Listagem 7.4. Vamos apresentar mais alguns detalhes sobre este controle. O controle textarea utilizado para a digitao ou exibio de grandes quantidades de texto. A sua funo semelhante funo dos campos do tipo memo no Microsoft Access. Sintaxe para o controle CheckBox:
<textarea runat=server id=identificao_no_cdigo cols=nmero de colunas name=nome enviado para o navegador rows=nmero de linhas onserverchange=onserverchangehandler
www.juliobattisti.com.br
250
A propriedade onserverchange utilizada para definir um evento que ser executado em resposta ao envio da pgina para processamento no servidor. Observe que este controle possui uma tag de abertura <textarea> e uma de fechamento </textarea>. Utilizamos esta sintaxe no exemplo do item anterior:
<td><textarea id=Dados cols=60" rows=10" visible=false runat=server></textarea>
Observe que simplesmente colocamos uma barra antes do sinal de fechamento >. Podemos utilizar qualquer uma das duas sintaxes.
HTMLInputRadioButton Control
utilizado para a criao de controles de seleo em um formulrio. Os controles do tipo RadioButton so exibidos como pequenos crculos. So controles do tipo marcado/desmarcado. Se o controle estiver marcado, ao clicarmos ele ser desmarcado. Se o controle estiver desmarcado, ao clicarmos ele ser marcado. Normalmente utilizado em grupos. Em um grupo de controles do tipo RadioButton podemos selecionar somente um controle. Ao clicarmos em um controle, se outro controle do grupo estava marcado, ser desmarcado. Para criar um grupo de controles do tipo RadioButton definimos todos os controles com o mesmo valor para a propriedade name. Sintaxe para o controle CheckBox:
<input type=checkbox runat=server id=identificao_no_cdigo checked name=nome do grupo >
Onde temos: runat=server: Define que um controle de servidor, ou seja, que ser processado no servidor. id=identificao_no_cdigo: Um nome que atribumos ao controle, nome este que ser usado para acessar as propriedades e mtodos do controle, atravs de programao. checked: Valor boleano que indica se o controle est marcado (True) ou no (False). name: nome do grupo. Para criar um grupo de controles do tipo RadioButton basta definir o mesmo nome para todos os controles do grupo.
251
www.juliobattisti.com.br
www.juliobattisti.com.br
252
<p> <input id=Exibe type=text size=60 runat=server> <p> <input type=submit id=Enviar value=Enviar runat=server> </form> </body> </html>
Digite o cdigo da Listagem 7.5 e salve o mesmo em um arquivo chamado chap7ex6aspx, na pasta chap7, dentro da pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/ chap7/chap7ex6aspx Ao carregarmos esta pgina no Internet Explorer, obtemos um formulrio com trs controles do tipo RadioButton. Podemos selecionar um dos controles. D um clique na opo Visa. Agora d um clique na opo Master Card. Observe que a opo Visa foi, automaticamente, desmarcada. D um clique no boto Enviar. Voc obter o resultado indicado na Figura 7.8. A novidade neste exemplo que, ao invs de utilizar o evento Click do boto de comando, utilizamos um evento definido pela propriedade OnServerChange dos controles do tipo RadioButton.
253
www.juliobattisti.com.br
O Controle HtmlTable
Temos a seguinte sintaxe para este controle:
<table runat=server id=identificao_no_cdigo align=left | center | right bgcolor=cor de fundo border=tamanho da borda em pixels
www.juliobattisti.com.br
254
Observe que, alm de definir uma coleo de linhas, no parmetro rows, tambm podemos acrescentar linhas e clulas utilizando as tags tradicionais: <tr> </tr> para adicionar linhas e <td> </td> para adicionar clulas dentro de uma linha (colunas da tabela). Quando utilizamos um server control HtmlTable para criar uma tabela, podemos imaginar a tabela como sendo formada por uma coleo de linhas. Podemos adicionar ou remover itens desta coleo, atravs do cdigo de programao. Tambm podemos imaginar cada linha, como uma coleo de clulas. Podemos adicionar ou remover itens desta coleo, utilizando cdigo de programao. No final deste item veremos um exemplo prtico de adio de linhas e clulas utilizando cdigo de programao.
O Controle HtmlTableRow
Temos a seguinte sintaxe para este controle:
<tr runat=server id=identificao_no_cdigo align=alinhamento para o contedo da linha bgcolor=cor de segundo plano bordercolor=cor da borda height=altura da linha cells=um objeto do tipo HtmlTableCellCollection valign=alinhamento vertical do contedo da linha > <td>Contedo da clula</td> <td> Contedo da clula </td> <td> Contedo da clula </td> </tr>
255
www.juliobattisti.com.br
O Controle HtmlTableCell
Temos a seguinte sintaxe para este controle:
<td ou th runat=server id=identificao_no_cdigo align=alinhamento para o contedo da linha bgcolor=cor de segundo plano bordercolor=cor da borda height=altura da clula nowrap=true | false rowspan ou colspan=nmero de linhas ou clulas para mesclar valign=alinhamento vertical do contedo da linha width=largura da clula > Contedo da clula. </td or /th>
Duas propriedades merecem maiores comentrios. nowrap: Pode ter o seu valor definido como true; neste caso ocorre o retorno automtico do texto ao alcanar o final da clula, caso o contedo da clula no caiba no tamanho definido para a clula. Se o valor for definido em false, no ocorrer o retorno automtico. colspan ou rowspan: Esta propriedade utilizada para mesclar clulas. Por exemplo, se temos uma tabela com duas colunas, porm em uma das linhas queremos mesclar as duas colunas, utilizamos o seguinte cdigo:
<tr> <td width=100% colspan=2">Contedo da Clula</td> </tr>
Um Exemplo Prtico
Vamos apresentar um exemplo, no qual demonstramos a capacidade de adicionar linhas e clulas, dinamicamente, a uma tabela, utilizando cdigo de programao. Ao carregar a pgina, exibida uma tabela de uma nica clula. Vamos criar um formulrio onde so apresentados dois campos para o usurio. No primeiro, o usurio digita o nmero de linhas para a tabela. No segundo campo, o usurio digita o nmero de colunas. Ao clicar no boto Enviar, utilizaremos o evento Load da pgina, para criar uma tabela com o nmero de linhas e colunas especificadas pelo usurio. Na Listagem 7.6 temos a pgina do exemplo proposto.
www.juliobattisti.com.br
256
CAPTULO 7: HTML SERVER CONTROLS Listagem 7.6 Adicionando linhas e clulas, dinamicamente chap7ex7.aspx.
<html> <head> <script language=C# runat=server>
int row = 0;
// Vamos gerar, dinamicamente, uma tabela // com o nmero de linhas e clulas, especificado // pelo usurio.
// O lao de fora define o nmero de linhas. // para cada linha, isto , para cada passagem do lao // de fora, o lao mais interno executado tantas vezes // quantas forem o nmero de colunas especificadas.
for (int j=0; j<numrows; j++) { //Declaramos uma varivel do tipo HtmlTableRow HtmlTableRow r = new HtmlTableRow();
// Define a cor de segundo plano, alternadamente // para linhas pares e mpares. if (row%2 == 1) r.BgColor=Gainsboro; row++;
257
www.juliobattisti.com.br
// Defino o contedo da clula que foi recm criada. c.Controls.Add(new LiteralControl(Linha + j.ToString() + , Coluna + i.ToString()));
<form runat=server> <font face=Verdana size=-1"> <p> <table id=Table1" CellPadding=5 CellSpacing=0 Border=1" BorderColor=black runat=server /> <p> Nmero de linhas : <input id=Linhas type=text size=10 value=1" runat=server> <BR>
www.juliobattisti.com.br
258
</form>
</body> </html>
Digite o cdigo da Listagem 7.6 e salve o mesmo em um arquivo chamado chap7ex7aspx, na pasta chap7, dentro da pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/ chap7/chap7ex7aspx Ao carregarmos esta pgina no Internet Explorer, obtemos uma tabela com uma linha e uma coluna e um formulrio com dois campos para digitao. O valor padro destes campos definido como 1, conforme indicado na Figura 7.9. Digite 3 para o nmero de linhas e 3 para o nmero de colunas. D um clique no boto Gerar a tabela dinamicamente. Uma tabela com trs linhas e trs colunas por linha ser automaticamente gerada, conforme indicado na Figura 7.10.
259
www.juliobattisti.com.br
A varivel row utilizada para definir se estamos em uma linha mpar (1, 3, etc.) ou em uma linha par (2, 4, etc). Para as linhas pares definiremos uma cor de fundo diferente, para dar um efeito especial na apresentao da tabela.
IMPORTANTE: Uma tabela dinmica formada por uma coleo de linhas, onde cada linha formada por uma coleo de clulas. Com esta idia em mente que, atravs do cdigo do evento Load, vamos criar uma tabela com o nmero de linhas e colunas digitado pelo usurio.
www.juliobattisti.com.br
260
if (row%2 == 1) r.BgColor=Gainsboro;
row++;
// Defino o contedo da clula que foi recm criada. c.Controls.Add(new LiteralControl(Linha + j.ToString() + , Coluna + i.ToString()));
// Adiciono a clula coleo de clulas da linha. r.Cells.Add(c); } // Adiciono a linha coleo de linhas da tabela. Table1.Rows.Add(r); }
261
www.juliobattisti.com.br
Em seguida um teste para definir se estamos em uma linha par ou mpar. O teste divide o nmero da linha por 2 e retorna o resto da diviso. Se este resto for igual a 1 estamos em uma linha mpar e a cor de segundo plano alterada. Observe que, para alterar a cor de segundo plano, utilizamos a propriedade BgColor do objeto r, que um objeto do tipo HtmlTableRow( ). Isto feito pelo seguinte trecho de cdigo:
if (row%2 == 1) r.BgColor=Gainsboro; row++;
Gainsboro o nome de uma cor. Ao invs do nome poderamos utilizar os tradicionais cdigos de seis dgitos hexadecimais. Por exemplo: #000000 para preto, #FFFFFF para branco, #FF0000 para vermelho e assim por diante. Aps definirmos o nome da cor, incrementamos a varivel inteira row. Observe que com ASP.NET e a biblioteca de classes do Framework .NET, a programao para Web ficou muito mais parecida com a programao tradicional para Windows, orientada a eventos. Na seqncia do cdigo entramos no lao for interno. Neste lao declarada e inicializada uma varivel c, do tipo HtmlTableCell( ). Para cada passagem do lao interno vamos adicionar uma clula, a coleo de clulas do objeto HtmlTableRow atual. Na prtica estamos adicionando as colunas para a linha atual. Tambm feita a definio do contedo para a clula. A declarao da varivel do tipo HtmlTableCell( ) feita com o seguinte comando:
HtmlTableCell c = new HtmlTableCell();
Para cada passada do lao interno uma nova clula adicionada linha. Ao final, a linha ter tantas clulas quantas forem as colunas especificadas pelo usurio. Uma vez que adicionamos vrias clulas coleo de clulas da linha, o passo final adicionar a linha coleo de linhas da tabela. Isto feito no seguinte comando:
Table1.Rows.Add(r);
Para cada passada do lao externo uma nova linha adicionada coleo de linhas da tabela. Ao final teremos uma tabela com tantas linhas quantas especificadas pelo usurio e, em cada linha, tantas clulas quantas o nmero de colunas especificado pelo usurio. Em resumo: exatamente o resultado proposto pelo exemplo.
www.juliobattisti.com.br
262
HTMLSelect Control
utilizado para a criao de controles do tipo caixa de seleo, onde so apresentados diversos itens em uma lista, onde o usurio pode selecionar um determinado item. A funcionalidade idntica tag <SELECT> </ SELECT) do HTML. Sintaxe para o controle Select:
<select runat=server id=identificao_no_cdigo OnServerChange=onserverchangehandler DataSource=fonte de dados DataTextField=descrio do campo ao qual vinculada a caixa de seleo DataValueField=valor do campo ao qual vinculada a caixa de seleo Multiple Items=coleo de elementos do tipo options SelectedIndex=ndice do elemento atualmente selecionado Size=nmero de itens visveis ao mesmo tempo. Por padro 1" Value=Valor do item atualmente selecionado > <option>Texto para a opo 1</option> <option>Texto para a opo 2</option> ... <option>Texto para a opo n</option> </select>
Eu no me canso de repetir: Sendo este um controle de servidor, o mesmo criado como um objeto no momento da compilao da pgina ASP.NET. Sendo um objeto, temos acesso a suas propriedades e mtodos. Temos duas maneiras de definir os elementos da lista: Utilizando a maneira tradicional, onde cada elemento definido atravs de um conjunto de tags <option> Texto </option>, com uma tag para cada elemento da lista. Utilizando a coleo Items, qual podemos adicionar dinamicamente, atravs de programao, elementos do tipo options. Esta coleo uma instncia da classe ListItemCollection, a qual pertence ao namespace System.Web.UI.WebControls. Esta classe possui mtodos para adicionar e remover elementos, utilizando programao. Vamos apresentar um exemplo.
263
www.juliobattisti.com.br
</script> </head>
<body>
www.juliobattisti.com.br
264
<p>
<span id=Span1" runat=server> Clique no boto Aplicar para definir a cor de segundo plano! </span>
</form>
</body> </html>
Digite o cdigo da Listagem 7.7 e salve o mesmo em um arquivo chamado chap7ex8aspx, na pasta chap7, dentro da pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/ chap7/chap7ex8.aspx Na lista de cores selecione SkyBlue e d um clique no boto Aplicar. Observe que a cor de segundo plano do texto, no final do formulrio, alterada, conforme indicado na Figura 7.11. Agora vamos adicionar uma cor lista. No campo para digitao de texto digite Red e d um clique no boto AdicionaALista. Abra a lista e observe que a cor Red (vermelho) j faz parte das opes da Lista, conforme indicado na Figura 7.12.
265
www.juliobattisti.com.br
www.juliobattisti.com.br
266
Para adicionar um elemento lista de cores, utilizamos o evento Click do boto AdicionaALista. Neste procedimento utilizamos o mtodo Add da coleo Items da lista, conforme indicado no trecho de cdigo a seguir:
void AdicionaALista_Click(object Source, EventArgs e) { ColorSelect.Items.Add(Text1.Value); }
Passamos para o mtodo Add o valor digitado no campo Text1 do formulrio: Text1.Value. Vou repetir mais uma vez: Observe o quanto o modelo de programao para o ASP.NET se parece com a programao tradicional de aplicaes Windows orientada a eventos.
HTMLAnchor Control
utilizado para a criao de links em pginas ASP.NET. A funcionalidade idntica tag <a> </a) do HTML. A diferena que, por ser um controle de servidor, o mesmo processado pelo Framework .NET no servidor IIS, o que nos disponibiliza uma srie de mtodos e propriedades para o controle HtmlAnchor. Sintaxe para o controle HtmlAnchor:
<a runat=server id=identificao_no_cdigo href=enereo absoluto ou relativo name=nome quando adicionado lista de favoritos do navegador
NOTA: A propriedade Style utilizada para definir aspectos visuais dos elementos, como cor da fonte, tamanho, negrito, itlico, etc. Existe uma definio para os vrios atributos visuais possveis de serem alterados. Estes atributos fazem parte das chamadas CSS Cascading Style Sheets. Para maiores informaes sobre CSS e uma referncia completa sobre os diversos atributos disponveis, consulte um dos seguintes endereos: www.w3.org ou www.wdsl.com.
OnServerClick=nome do procedimento a ser executado em resposta a um click no link target=abre na mesma janela, em uma nova janela, em um frame da janela atual, etc title=ttulo a ser exibido na janela de ttulo do navegador > Texto do link. </a>
267
www.juliobattisti.com.br
<TABLE>
</TD>
</TR>
</TD> </TR>
</TABLE>
</body> </html>
www.juliobattisti.com.br
268
HtmlInputButton Control
utilizado para a criao de um boto de comando em um formulrio. O boto de comando normalmente utilizado para enviar os dados do formulrio para processamento. J tivemos diversos exemplos de utilizao deste controle. Para v-lo em funcionamento, inclusive com cdigo para responder ao evento Click do boto, consulte os seguintes exemplos deste captulo: chap7ex3.aspx chap7ex4.aspx chap7ex5.aspx chap7ex8.aspx Sintaxe para o controle HtmlInputButton:
<input type=button | submit | reset
269
www.juliobattisti.com.br
HtmlButton Control
utilizado para a criao de botes de comandos mais sofisticados dos que os criados pelo controle HtmlInputButton. Com este controle temos acesso a uma srie de mtodos e eventos, os quais permitem a criao de alguns efeitos interessantes. Alm do texto podemos associar uma determinada figura com o boto de comando. Sintaxe para o controle HtmlButton:
<button runat=server id=identificao_co_cdigo OnServerClick=procedimento a ser executado ao clicarmos no boto > texto ou image </button>
Este elemento bastante rico em funcionalidade. Podemos aplicar uma srie de efeitos interessantes ao mesmo. Vamos criar um formulrio, baseado em um exemplo da documentao do Framework .NET, onde temos dois controles HtmlButton. Vamos utilizar o evento Click de cada controle para informar quando um dos controles foi clicado. Tambm vamos utilizar a propriedade Style para definir algumas caractersticas visuais de cada controle. Em um dos controles alm do texto, adicionaremos uma pequena imagem. A imagem est em um arquivo chamado seta.gif, o qual deve estar gravado na pasta Chap7. Para o segundo boto vamos aplicar um efeito onmouseover, ou seja, quando o usurio estiver com o mouse sobre alguma parte do boto, faremos com que a cor de segundo plano do boto seja modificada. Quando o mouse sair da rea do boto, volta a cor de segundo plano original. Na Listagem 7.9 temos a pgina do exemplo proposto.
www.juliobattisti.com.br
270
<button id=Button1" OnServerClick=Button1_OnClick style=font: 8pt verdana; background-color:lightgreen; border-color:black; height=30; width:110" runat=server> <img src=seta.gif> Clique em mim! </button>
<button id=Button2 OnServerClick=Button2_OnClick style=font: 8pt verdana; background-color:lightgreen; border-color:black; height=30; width:110" onmouseover=this.style.backgroundColor=yellow onmouseout=this.style.backgroundColor=lightgreen runat=server>
271
www.juliobattisti.com.br
<p> <p> <b><span id=Span1 runat=server /></b> </font> </form> </body> </html>
Digite o cdigo da Listagem 7.9 e salve o mesmo em um arquivo chamado chap7ex10aspx, na pasta chap7, dentro da pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/ chap7/chap7ex10.aspx Clique no primeiro boto. Observe que o texto Voc clicou no boto 1 exibido. Agora passe o mouse sobre o segundo boto. Observe que a cor de fundo trocou para amarelo. Afaste o mouse do segundo boto. Observe que a cor de fundo voltou ao normal. Agora clique no segundo boto. O texto Voc clicou no boto 2 exibido, conforme indicado na Figura 7.14.
www.juliobattisti.com.br
272
Observe que atravs da propriedade style podemos definir uma srie de elementos visuais para o boto. Neste exemplo estamos definindo as seguintes propriedades: font: tamanho e tipo da fonte. background-color: cor de segundo plano. border-color: cor das bordas do boto. height: altura do boto, em pixels. width: largura do boto, em pixels. Para o segundo boto, utilizamos os eventos onmouseover para definir uma cor diferente quando o mouse estiver sobre o boto e onmouseout para retornar a cor original, quando o mouse fosse afastado do boto, conforme indicado no trecho de cdigo a seguir:
onmouseover=this.style.backgroundColor=yellow onmouseout=this.style.backgroundColor=lightgreen
NOTA: Para uma referncia completa a todas as definies de estilo existentes, consulte www.w3.org ou www.wdvl.com.
HtmlImage Control
utilizado para Inserir figuras em uma pgina ASP.NET. A sua funcionalidade idntica tag <img> da linguagem HTML, com a diferena de que, em sendo um controle de servidor, temos acesso a uma srie de mtodos e eventos do controle. Sintaxe para o controle HtmlImage:
<img id=identificao_no_cdigo runat=server
IMPORTANTE: Algumas destas definies fazem parte do HTML 4.0 e somente funcionaro corretamente com o Internet Explorer 4.0 ou superior.
alt=texto exibido quando o usurio aponta o mouse para a imagem align= top | middle | bottom | left | right border=largura da borda
273
www.juliobattisti.com.br
Vamos a um exemplo adaptado da documentao do Framework .NET. Exemplo: Vamos criar um formulrio onde exibida uma imagem. Tambm exibimos uma lista de seleo com nomes de outras imagens. Esta lista criada utilizando o controle HtmlSelect explicado anteriormente. O usurio seleciona um nome de imagem na lista e clica no boto Aplicar. O evento Click do boto faz com que a imagem associada opo selecionada na lista seja exibida. Na Listagem 7.10 temos a pgina do exemplo proposto.
</script> </head>
<form runat=server>
<img ID=Image1" src=cereal1.gif runat=server/> <p> <p> Selecione a Imagem a ser exibida e clique em Aplicar:
<select id=Select1" runat=server> <option Value=Cereal1.gif>Healthy Grains</option> <option Value=Cereal2.gif>Corn Flake Cereal</option> <option Value=Cereal3.gif>U.F.O.S</option> <option Value=Cereal4.gif>Oatey Os</option>
www.juliobattisti.com.br
274
<p> <p>
</body> </html>
Digite o cdigo da Listagem 7.10 e salve o mesmo em um arquivo chamado chap7ex11aspx, na pasta chap7, dentro da pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/ chap7/chap7ex11.aspx Ser exibida a figura para o cereal Healthy Grains, conforme indicado na Figura 7.15.
275
www.juliobattisti.com.br
NOTA: Para que este exemplo funcione, as figuras devem estar na pasta Chapt7. Se as figuras estiverem em outra pasta, voc precisa fornecer o caminho ao definir o valor da propriedade Src, do controle HtmlImage.
Tambm interessante observarmos o cdigo que retornado, como resultado do processamento da pgina. Por exemplo, quando voc seleciona U.F.O.S e clica em aplicar, a figura associada a opo U.F.O.S exibida. Agora vamos dar uma olhada no cdigo HTML que foi enviado pelo servidor, como resultado do processamento da pgina. Para visualizar o cdigo HTML correspondente, utilize o seguinte comando no Internet Explorer: Exibir -> Cdigofonte. Selecionando este comando ser exibido o cdigo a seguir:
<html> <head>
</head>
<body> <h3><font face=Verdana>Exemplo do controle HtmlImage!!!</font></h3> <form name=ctrl0" method=post action=chap7ex11.aspx id=ctrl0">
<img src=/chap7/Cereal3.gif id=Image1" /> <p> <p> Selecione a Imagem a ser exibida e clique em Aplicar:
www.juliobattisti.com.br
276
Este um campo oculto (type=hidden), o qual utilizado para manter o estado dos controles do formulrio entre uma chamada e outra da pgina. Para maiores informaes sobre a manuteno de estado consulte os tpicos iniciais deste captulo.
Concluso
Quando uma pgina .aspx acessada, o servidor compila a pgina em um objeto derivado da classe Page. Cada elemento da pgina compilado como um objeto. Desta forma temos acesso a mtodos e propriedades dos diversos elementos. Iniciamos o captulo estudando a classe page. Apresentamos as principais propriedades, eventos e mtodos desta classe. Tambm falamos sobre o processamento de uma pgina .aspx. Falamos sobre os conceitos de PostBack e round-trip. Em seguida passamos definio do que so Html Server controls e quais as vantagens em utiliz-los em substituio s tags HTML tradicionais. Uma vez entendidos os conceitos tericos necessrios, passamos ao estudo dos principais HTML Server Controls. Estudamos e apresentamos exemplos dos seguintes controles:
277
www.juliobattisti.com.br
www.juliobattisti.com.br
278
Introduo
Para explicarmos mais esta novidade do ASP.NET: Validation Server Controls, vamos novamente fazer uma analogia com as verses anteriores do ASP. O assunto em pauta validao da entrada de dados em formulrio. Vamos imaginar que voc cria um formulrio onde o internauta deva preencher os seguintes dados: Nome Endereo e-mail Fone Profisso Data de Nascimento Valor do crdito pretendido Renda mensal Empresa onde trabalha Endereo do site da empresa Os campos Nome, Endereo e e-mail e Fone so obrigatrios. Alm disso, o valor do crdito pretendido no pode ser superior a 20% da Renda mensal. Para criarmos um formulrio que funcione de acordo com estes critrios, vamos precisar de uma boa quantidade de cdigo. Quando o usurio preenche os dados e clica no boto enviar, os dados so enviados, para processamento, para a pgina especificada na propriedade action do formulrio. Esta pgina deve, em primeiro lugar, verificar se os campos obrigatrios foram preenchidos e, em segundo lugar, verificar se o valor do crdito no est acima de 20% da renda mensal. Se as informaes digitadas pelo usurio atenderem estes critrios, o processamento continua e os dados so gravados em um banco de dados, como o SQL Server ou o ORACLE. Mas basta que um nico campo obrigatrio no tenha sido preenchido, para que o formulrio tenha que ser enviado de volta para o navegador do cliente, mantendo as informaes j digitadas e solicitando que sejam feitas as correes necessrias. Explicar a lgica que est por trs deste processo de validao j no uma tarefa simples. Implementar toda esta validao bastante trabalhoso e exige muita codificao. Para facilitar a vida do desenvolvedor, o ASP.NET apresenta uma srie de controles que j vm com funcionalidades, no prprio controle, as quais facilitam a validao dos dados digitados pelo usurio. Estes controles so conhecidos como: Validation Controls ou Server Validation Controls, uma vez que so controles de servidor, a exemplo dos HTML Server Controls que vimos no Captulo 7.
CAPTULO
8
Validation Server Controls
279
www.juliobattisti.com.br
Outra diferena quanto localizao das classes bases, ou seja, das classes das quais
so derivados os controles. Os HTMLServer controls so derivados de classes do namespace System.Web.UI.HtmlControls; j os Web Server Controls, dos quais fazem parte os controles de validao, so derivados de classes contidas no namespace System.Web.UI.WebControls.
www.juliobattisti.com.br
280
IMPORTANTE: Mesmo que o cdigo para validao no cliente tenha sido gerado, quando a pgina enviada para o servidor, a validao feita pelos Validation Controls, para garantir que resultados incorretos sejam inseridos no banco de dados. Pode acontecer de a pgina ter sido modificada no caminho entre o navegador do cliente e o servidor IIS. Neste caso os dados que foram digitados e passaram na validao foram modificados por um hacker e no so os mesmos que chegaram no servidor. Por isso, a validao no servidor funciona como uma proteo extra. Claro que isso no dispensa o uso de outras tcnicas de segurana como por exemplo a criptografia e Certificados Digitais. Falaremos um pouco mais sobre Segurana, no ltimo captulo deste livro.
281
www.juliobattisti.com.br
Vamos ao estudo das principais propriedades. ControlToValidate: Define ou retorna o nome do controle que ser associado ao controle de validao. EnableClientScript: Habilita/desabilita a gerao automtica de cdigo de validao no cliente, quando o navegador suporta tal funcionalidade. Esta propriedade do tipo Boleana, podendo assumir os valores True ou False. Pode ser utilizada para retornar ou definir o valor desta propriedade. Enabled: Propriedade do tipo Boleana (True ou False) que pode ser utilizada para definir ou retornar um valor que indica se a validao est habilitada (True) ou desabilitada (False), para o controle. ErrorMessage: utilizada para definir o texto da mensagem de erro associada ao controle de validao. Tambm pode ser utilizada para obter o texto da mensagem de erro associada. ForeColor: Utilizada para definir ou retornar a cor da mensagem de erro que ser exibida quando a validao falhar. ID: Define um identificador associado ao controle, identificador este que utilizado no cdigo para acessar as propriedades e mtodos do controle. IsValid: Propriedade do tipo Boleana (True ou False), que indica se a validao ocorreu com sucesso ou no. Por exemplo, se o controle de validao do tipo que exige uma entrada obrigatria (RequiredFieldValidator) e o usurio no digita nada no campo associado ao controle de validao, o teste de validao ir falhar e esta propriedade conter o valor False, indicando que o controle no passou no teste de validao.
www.juliobattisti.com.br
282
283
www.juliobattisti.com.br
} </script>
</head> <body>
<form runat=server>
<h3>Exemplo de validao.</h3>
<asp:RequiredFieldValidator id=Require1" ControlToValidate=TextBox1" Type=Integer ErrorMessage=Voc no digitou nenhum nmero!! Text=* runat=server/>
<asp:CompareValidator id=Compare1" ControlToValidate=TextBox1" ValueToCompare=0" EnableClientScript=False Type=Integer ErrorMessage=Nmero Incorreto!! Text=* runat=server/> <br>
www.juliobattisti.com.br
284
<br> <br>
<br> <br>
</form>
</body> </html>
Digite o cdigo da Listagem 8.1 e salve o mesmo em um arquivo chamado chap8ex1.aspx, na pasta chap8, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap8/chap8ex1.aspx D um clique no boto Enviar, sem digitar nenhum valor no campo para digitao. Voc obter o resultado indicado na Figura 8.1. Agora digite um nmero entre 1 e 10 e clique no boto Enviar. Se voc acertar o nmero gerado pelo cdigo do evento Button_Click, ser exibida a mensagem: Parabns, voc acertou!!!; caso contrrio ser exibida a mensagem indicada na Figura 8.2.
285
www.juliobattisti.com.br
www.juliobattisti.com.br
286
A varivel rand_number baseada na classe Random, do namespace System. Em seguida utilizamos o mtodo Next da classe Random, para gerar um nmero aleatrio entre 1 e 10. Agora vamos estudar, em detalhes, os diversos controles de validao do ASP.NET.
O Controle RequiredFieldValidator
Este controle utilizado para garantir que um determinado campo seja preenchido, ou seja, no podemos deixar o campo em branco. Conforme descrito anteriormente, os controles de validao so utilizados em conjunto com outros controles do formulrio. Por exemplo, se tivermos um campo Nome, em um formulrio, podemos associar um controle RequiredFieldValidator com o campo Nome, para garantir que o usurio seja obrigado a preencher o campo Nome. A sintaxe para este controle a seguinte:
<asp:RequiredFieldValidator id=identificao no cdigo runat=server ControlToValidate=nome do controle associado ErrorMessage=Mensagem de erro. ForeColor=Red BackColor=Grey > </asp:RequiredFieldValidator>
<asp:RequiredFieldValidator id=identificao no cdigo runat=server ControlToValidate=nome do controle associado ErrorMessage= Mensagem de erro. ForeColor=Red BackColor=Grey />
Observe que, ao invs de fechar a tag desta maneira: </asp:RequiredFieldValidator>, simplesmente utilizamos um />. As duas sintaxes so vlidas. Onde podemos utilizar os seguintes atributos:
287
www.juliobattisti.com.br
void Enviar_Click(Object sender, EventArgs e) { // Cdigo para gravar os dados recebidos no // banco de dados. }
</script>
</head> <body>
www.juliobattisti.com.br
288
<asp:RequiredFieldValidator id=Requer_email ControlToValidate=email Type=String ErrorMessage=O email de preenchimento obrigatrio, por favor fornea o seu email e clique no boto Enviar Text=O e-mail obrigatrio!! ForeColor=Red runat=server/>
<table>
<tr> <td><h3>Digite o e-mail:</h3> </td> <td><input id=email type=text size=40 runat=server></td> </tr>
<tr> <td><h3>Digite o nome:</h3> </td> <td><input id=nome type=text size=40 runat=server></td> </tr>
<tr> <td><h3>Cadastrar -></h3></td> <td><input type=submit value=Enviar OnServerClick=Enviar_Click runat=server> </td> </tr>
</table>
<asp:ValidationSummary
289
www.juliobattisti.com.br
</form>
</body> </html>
Digite o cdigo da Listagem 8.2 e salve o mesmo em um arquivo chamado chap8ex2.aspx, na pasta chap8, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap8/chap8ex2.aspx No campo e-mail digite: jose@abc.com.br. No campo Nome digite: Jos da Silva. D um clique no boto Enviar. Voc obter o resultado indicado na Figura 8.3.
www.juliobattisti.com.br
290
291
www.juliobattisti.com.br
Com a definio deste atributo estamos informando que o campo a ser validado, ou seja, o campo que de preenchimento obrigatrio o campo e-mail do formulrio. Neste atributo (ControlToValidate) informamos o ID do campo a ser validado. O texto do atributo ErrorMessage vai ser exibido em um controle do tipo ValidationSumary. Por isso que inclumos um controle deste tipo, no final do formulrio; caso contrrio o texto definido no atributo ErrorMessage no seria exibido. No trecho de cdigo a seguir temos a definio do controle ValidationSumary:
<asp:ValidationSummary id=Summary1" runat=server/>
O atributo Text define o texto que ser exibido no local onde o controle de validao est definido, caso a validao falhe. Aqui podemos fazer um teste interessante, para comprovar que realmente gerado cdigo para validao no Cliente, quando o navegador o Internet Explorer, conforme descrito no incio do captulo. Para provar isto vamos fazer o seguinte teste: Clique no campo e-mail e apague o que estiver neste campo. Pressione a tecla <TAB> para ir para o campo Nome. Observe que o texto O e-mail obrigatrio!! (conforme definido no atributo Text do controle de validao) aparece acima do campo e-mail, sem que tenhamos clicado no boto Enviar, conforme indicado na Figura 8.5.
www.juliobattisti.com.br
292
O Controle CompareValidator
Este controle utilizado para comparar o valor digitado em um campo associado com o controle CompareValidator, com um valor constante, com um valor de outro campo (atravs da utilizao da propriedade value deste outro campo) ou com o valor de um campo de uma tabela em um banco de dados. Se o valor digitado ou selecionado para o campo no for igual ao valor de comparao, o controle no passar no teste de validao. A sintaxe para este controle a seguinte:
<asp:CompareValidator id=identificao no cdigo runat=server ControlToValidate=nome do controle associado ValueToCompare=um valor constante Type=Tipo do valor a ser comparado: string, Int32, Double, etc. Operator=Operador de comparao: maior do que, menor do que, etc. ErrorMessage=Mensagem de erro. ForeColor=Cor da fonte. BackColor=Cor de segundo plano > </asp:CompareValidator>
293
www.juliobattisti.com.br
Observe que, ao invs de fechar a tag desta maneira: </asp:CompareValidator>, simplesmente utilizamos um />. As duas sintaxes so vlidas. Onde podemos utilizar os seguintes atributos: id: um nome que identifica o controle. Este nome utilizado no cdigo para acessar as propriedades e mtodos do controle. runat=server: identifica como sendo um controle de servidor. Todos os controles asp: so controles de servidor. ControlToValidate: Neste atributo definimos o nome do controle que ser validado pelo controle de validao. Por exemplo, se o controle de validao est associado com um campo Nome do formulrio, nesta propriedade devemos informar a identificao do controle Nome. A identificao o valor definido na propriedade id do controle Nome. Esta frase foi repetitiva e enfadonha, novamente, de propsito, para que voc no esquea esta associao. ValueToCompare: Define o valor de comparao. Pode ser uma constante, o valor contido em um outro campo ou em um banco de dados. Type: Define o tipo de dados do valor de comparao. Operator: Define o operador de comparao. ErrorMessage: Podemos definir uma mensagem de erro que ser exibida, caso a validao do campo falhe. Por exemplo, o usurio no preencheu um campo de preenchimento obrigatrio. ForeColor: Utilizado para definir a cor do texto da mensagem de erro. BackColor: Utilizado para definir a cor de segundo plano do texto da mensagem de erro. Vamos a um exemplo simples. Vamos criar um formulrio onde temos um campo para digitao, onde deve ser digitado um valor menor do que 100. Vamos utilizar um controle CompareValidator para verificar se o nmero digitado atende o critrio de ser menor do que 100. Na Listagem 8.3 temos o cdigo para o exemplo proposto.
www.juliobattisti.com.br
294
</head> <body>
<form runat=server>
<BR> <B> <asp:CompareValidator id=valida_valor runat=server ControlToValidate=valor ValueToCompare=100" Type=Double Operator=LessThan ErrorMessage=Digite um valor menor do que 100. ForeColor=Blue BackColor=Cyan > </asp:CompareValidator> </B> <BR> <BR>
</form>
</body> </html>
295
www.juliobattisti.com.br
Tabela 8.1 Valores para a propriedade Operator Valor Equal GreaterThan GreaterThanEqual Descrio Igual a. Maior do que. Maior ou igual a.
www.juliobattisti.com.br
296
Ao invs de especificar um valor constante de comparao, utilizando a propriedade ValueToCompare, podemos utilizar a propriedade ControlToCompare, para utilizar, para comparao, o valor contido em outro controle do formulrio. Por exemplo, se tivssemos um campo chamado ValorDeReferncia, no formulrio do exemplo da Listagem 8.3, poderamos definir o controle CompareValidator da seguinte maneira:
<asp:CompareValidator id=valida_valor runat=server ControlToValidate=valor ControlToCompare=ValorDeReferncia Type=Double Operator=LessThan ErrorMessage=Digite um valor menor do que 100. ForeColor=Blue BackColor=Cyan > </asp:CompareValidator>
NOTA: Estes valores esto definidos em uma estrutura do tipo Enumeration, chamada ValidationCompareOperator. Esta estrutura faz parte do namespace System.Web.UI.WebControls.
Com esta modificao, o valor digitado no campo valor ser comparado com o valor do controle ValorDeReferncia, devendo ser menor do que este valor, conforme definio da propriedade Operator=LessThan.
O Controle RangeValidator
No item anterior estudamos o controle CompareValidator, o qual permite fazer validaes com base em um determinado valor e um operador de comparao. Para comparaes que envolvem uma faixa de valores (com limites inferior e superior), precisamos utilizar o controle RangeValidator. Por exemplo, com o controle RangeValidator podemos verificar se os valores digitados no campo Salrio esto entre 1000 e 5000. A sintaxe para este controle a seguinte:
<asp:RangeValidator id=identificao no cdigo runat=server
297
www.juliobattisti.com.br
Observe que, ao invs de fechar a tag desta maneira: </asp:RangeValidator>, simplesmente utilizamos um />. As duas sintaxes so vlidas. Vamos destacar os seguintes atributos: MinimumValue: Define o limite inferior da faixa. MaximumValue: Define o limite superior da faixa. Vamos a um exemplo simples. Vamos criar um formulrio onde temos um campo para digitao, onde deve ser digitado um valor maior ou igual a 50 e menor ou igual a 100. Vamos utilizar um controle RangeValidator para verificar se o nmero digitado atende o critrio de estar na faixa entre 50 e 100. Na Listagem 8.4 temos o cdigo para o exemplo proposto.
NOTA: Os valores definidos em MinimumValue e MaximumValue tambm fazem parte da faixa de valores permitidos. Por exemplo, se MinimumValue for definido em 20 e MaximumValue for definido em 50; os valores permitidos so: Maior ou igual a 20 e Menor ou igual a 50.
www.juliobattisti.com.br
298
void Enviar_Click(Object sender, EventArgs e) { // Cdigo para gravar os dados recebidos no // banco de dados. } </script>
</head> <body>
<form runat=server>
<BR> <B> <asp:RangeValidator id=valida_valor runat=server ControlToValidate=valor MinimumValue=20" MaximumValue=50" Type=Double ErrorMessage=Digite um valor entre 20 e 50!! ForeColor=Blue BackColor=Cyan > </asp:RangeValidator> </B> <BR> <BR>
299
www.juliobattisti.com.br
</body> </html>
Digite o cdigo da Listagem 8.4 e salve o mesmo em um arquivo chamado chap8ex4.aspx, na pasta chap8, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap8/chap8ex4.aspx No campo valor digite 35, que um valor dentro da faixa definida no controle RangeValidator: entre 20 e 50. D um clique no boto Enviar. Observe que nenhuma mensagem de erro emitida. Agora digite 15 no campo valor. D um clique no boto Enviar. Voc obter uma mensagem de erro, conforme indicado na Figura 8.7.
O Controle CustomValidator
Este controle permite que criemos nossas prprias regras de validao. Por exemplo, podemos precisar de um controle de validao para verificar se o nmero digitado em um controle divisvel por 5. Outro exemplo poderia ser a criao de um controle para fazer a validao do dgito verificador de um campo CPF ou CNPJ. Para validaes complexas,
www.juliobattisti.com.br
300
A validao pode ser definida para acontecer no cliente, sem que a pgina tenha sido enviada para processamento ou no servidor, quando a pgina enviada para processamento. Para a validao no cliente, especificamos o nome da funo de validao, no atributo ClientValidationFunction. A funo deve ser escrita em uma linguagem suportada pelo navegador do cliente, como por exemplo VBScript ou JScript. Para a validao no servidor, especificamos o nome de um procedimento de validao, no atributo OnServerValidate. A funo no servidor pode ser escrita em qualquer linguagem suportada pelo Framework .NET, como por exemplo: VB.NET, C#, JScript.NET, C++, etc. Outro detalhe importante que podemos utilizar mais do que um controle de validao associado com o mesmo campo. Vamos imaginar um campo quantidade em um formulrio de compra. Podemos utilizar um controle RequiredFieldValidator para fazer com que o usurio seja obrigado a digitar um valor neste campo e um controle CustomValidator para garantir que o valor digitado no seja maior do que o valor em estoque. A funo de validao do controle CustomValidator pode buscar no banco de dados de estoque a quantidade de itens disponveis e no aceitar que o usurio digite um valor maior do que o disponvel em estoque. A seguir apresentamos um exemplo da documentao do Framework .NET, onde foi utilizado um controle CustomValidator para fazer com que seja digitado um nmero par em um campo do formulrio. Observe que, embora seja uma funo simples de validao, no temos um controle especfico para esta funo. Por isso precisamos criar uma funo de validao. No exemplo apresentado, temos a validao no servidor. O nome do procedimento que far
301
www.juliobattisti.com.br
onde ServerValidation o nome do procedimento, na seo de cdigo da pgina, que far a validao para determinar se o nmero par ou mpar. O procedimento ServerValidation recebe, como primeiro parmetro, uma referncia para o controle de validao e como segundo parmetro um objeto que contm o valor do campo a ser validado, valor este que acessvel atravs da propriedade Value deste segundo argumento. Na listagem do exemplo, antes da funo de validao, coloquei vrios comentrios que explicam detalhadamente a utilizao dos parmetros da funo de validao. Na Listagem 8.5 temos o cdigo para o exemplo proposto.
void ValidateBtn_OnClick(object sender, EventArgs e) { if (Page.IsValid) { lblOutput.Text = A pgina foi validada com sucesso.; } else { lblOutput.Text = Pgina no validada!; } }
// Procedimento que faz a validao do controle. // Este procedimento recebe dois argumentos. // O argumento source, do tipo object, uma referncia ao prprio controle de // validao. // O segundo argumento do tipo ServerValidateEventArgs. // a sua propriedade Value contm o valor digitado no campo associado // ao controle de validao do tipo CustomValidator.
www.juliobattisti.com.br
302
void ServerValidation (object source, ServerValidateEventArgs args) { try { int i = int.Parse(args.Value); args.IsValid = ((i%2) == 0); } catch { args.IsValid = false; } } </script>
</head>
<body>
<form runat=server>
<asp:Label id=lblOutput runat=server Text=Digite um nmero par: Font-Name=Verdana Font-Size=10pt /><br> <p>
303
www.juliobattisti.com.br
</body> </html>
Digite o cdigo da Listagem 8.5 e salve o mesmo em um arquivo chamado chap8ex5.aspx, na pasta chap8, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap8/chap8ex5.aspx No campo de digitao digite 2. D um clique no boto Enviar. Observe que nenhuma mensagem de erro emitida, uma vez que dois um nmero par. Agora digite 5 no campo de digitao. D um clique no boto Enviar. Voc obter uma mensagem de erro, conforme indicado na Figura 8.8. Algumas observaes sobre o exemplo. Na funo de validao ServerValidation, utilizamos a estrutura Try Catch para fazer o tratamento de excees. Dentro da funo ServerValidation, utilizamos o seguinte comando para determinar se o nmero par:
args.IsValid = ((i%2) == 0);
Neste caso, se o resto da diviso por 2 for zero, significa que o nmero par e a propriedade IsValid definida como True, significando que o valor digitado par. Se o resto da diviso por dois no for igual a zero, a propriedade IsValid definida como False, significando que o nmero digitado mpar. Lembre que o operador % retorna o resto da diviso entre dois nmeros inteiros.
www.juliobattisti.com.br
304
NOTA: Para maiores informaes sobre o tratamento de excees e sobre os operadores do C#, consulte os Captulos 3, 4 e 5.
O Controle RegularExpressionValidator
Este controle utilizado para garantirmos que a entrada digitada est em um determinado formato. Por exemplo, podemos utilizar este controle para fazer com que o usurio digite o CPF no seguinte formato: 111.111.111-11. Ou que digite o CEP no seguinte formato: 11111-111. A sintaxe para este controle a seguinte:
<asp:RegularExpressionValidator id=identificao_no_cdigo runat=server ControlToValidate=Controle a ser validado ValidationExpression=Uma expresso do tipo Regular Expression. ErrorMessage=Mensagem de erro. ForeColor=Cor da fonte da mensagem de erro.
305
www.juliobattisti.com.br
A maior dificuldade de utilizarmos este controle a definio correta do atributo ValidationExpression. Para voc ter uma idia da complexidade da criao de expresses regulares existe um livro somente sobre este assunto: Mastering Regular Expressions: Powerful Techniques for Perl and Other Tools. Editora: (OReilly Nutshell). Pginas: 368 Para uma lista de artigos sobre expresses regulares, consulte o seguinte endereo: http://www.4guysfromrolla.com/ webtech/RegularExpressions.shtml Vamos apresentar um exemplo, onde vamos utilizar o controle RegularExpressionValidator para verificar o formato do CPF digitado pelo usurio. O CPF tem o seguinte formato padro:
nnn.nnn.nnn-nn
Onde n significa nmero. Na Listagem 8.6 temos o cdigo para o exemplo proposto.
void Enviar_Click(Object sender, EventArgs e) { // Cdigo para gravar os dados recebidos no // banco de dados.
</script>
</head> <body>
<form runat=server>
www.juliobattisti.com.br
306
<asp:RegularExpressionValidator id=valida_valor runat=server ControlToValidate=cpf ValidationExpression=[0-9]{3}\.[0-9]{3}\.[0-9]{3}\-[0-9]{2} ErrorMessage=Digite um CPF no formato 111.111.111-11" ForeColor=Blue BackColor=Cyan />
</body> </html>
Digite o cdigo da Listagem 8.6 e salve o mesmo em um arquivo chamado chap8ex6.aspx, na pasta chap8, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap8/chap8ex6.aspx No campo de digitao digite 111.111.111-11, ou seja, um CPF no formato correto. D um clique no boto Enviar. Observe que nenhuma mensagem de erro emitida, uma vez que o CPF est no formato definido pelo controle RegularExpressionValidator. Agora digite 11111111111 no campo de digitao, ou seja, sem os pontos e o trao. D um clique no boto Enviar. Voc obter uma mensagem de erro, conforme indicado na Figura 8.9. A def inio do formato aceito para o campo CPF feita atravs de uma expresso regular, no atributo ValidationExpression, conforme indicado a seguir:
ValidationExpression=[0-9]{3}\.[0-9]{3}\.[0-9]{3}\-[0-9]{2}
307
www.juliobattisti.com.br
Concluso
Neste captulo aprendemos a utilizar os controles de validao do ASP.NET. Aprendemos a utilizar os seguintes controles: RequiredFieldValidator Control CompareValidator Control RangeValidator Control CustomValidator Control RegularExpressionValidator Control Tambm apresentamos diversos exemplos para ilustrar o funcionamento destes controles. No prximo captulo vamos aprender a utilizar uma srie de Web Server Controls.
www.juliobattisti.com.br
308
Introduo
No Captulo 7 estudamos os HTML Server Controls, os quais so, basicamente, os controles HTML para a criao de formulrios, porm processados no servidor. Ao ser processado no servidor, cada controle compilado como um objeto incorporado pgina ASP.NET. Por ser um objeto temos acesso, via cdigo de programao, a uma srie de propriedades e mtodos de cada controle. Com este novo modelo, o Framework .NET traz para o desenvolvimento Web um modelo baseado em eventos, muito parecido com o modelo de desenvolvimento baseado em eventos de aplicaes Windows tradicionais.
CAPTULO
9
Web Form Controls
Em seguida, no Captulo 8 tratamos dos controles de validao Validation Server Controls. Estes controles tambm so processados no servidor, porm no existem controles HTML correspondentes. Os controles de validao fazem parte de um conjunto de controles maior, conhecido como Web Server Controls. Salientamos que os Web Server Controls so definidos pela tag <asp: ... No presente captulo vamos continuar o nosso estudo sobre os controles de servidor. Vamos aprender a utilizar um conjunto de controles que nos permitem criar uma interface visual mais aprimorada, com maior riqueza de detalhes, dando um aspecto mais profissional a nossas pginas ASP.NET. Estes controles so chamados de Web Form Controls. Os controles que estudaremos neste captulo so, a exemplo dos controles de validao, Web Server Controls. Vamos aprender a utilizar controles para a criao de interface, onde o usurio pode digitar informaes, e interagir com a pgina. Na prtica estudaremos controles que podem ser utilizados no lugar dos HTML Server Controls, para a criao de pginas com uma interface mais profissional. Todos os Web Form Controls so derivados de uma classe bsica: WebControl. Esta classe pertence ao namespace System.Web.UI.WebControls. Iniciaremos o captulo estudando as propriedades e mtodos desta classe. Por serem derivados desta classe bsica, os Web Form Controls herdam as propriedades e mtodos da classe bsica. Em seguida passaremos ao estudo dos seguintes Web Form Controls: TextBox Label CheckBox RadioButton Button
309
www.juliobattisti.com.br
NOTA: Para acompanhar os exemplos deste captulo importante que voc tenhas estudado os Captulos 3, 4 e 5, os quais tratam dos aspectos bsicos da Linguagem C#.
Tabela 9.1 Propriedades da classe WebControl. Propriedade AccessKey BackColor BorderColor BorderStyle BorderWidth ControlStyle Descrio utilizada para definir ou retornar uma combinao de teclas (tecla de atalho) utilizada para colocar o foco no controle. utilizada para definir ou retornar a cor de segundo plano, do controle. utilizada para definir ou retornar a cor das bordas do controle. utilizada para definir ou retornar o estilo das bordas do controle. utilizada para definir ou retornar a largura das bordas do controle. utilizada para definir ou retornar o estilo (aspectos visuais) do controle, como por exemplo: com ou sem preenchimento, com sombra, etc.
www.juliobattisti.com.br
310
Propriedade Enabled
Descrio Propriedade do tipo Boleana (True ou False), utilizada para definir ou retornar um valor que indica se o controle est habilitado: True = habilitado e False=desabilitado. Propriedade do tipo Boleana (True ou False), utilizada para definir ou retornar um valor que indica se o controle de estado est habilitado (True) ou desabilitado (False). Retorna informaes sobre a fonte utilizada para o controle. utilizada para definir ou retornar informaes sobre a cor do texto do controle. utilizada para definir ou retornar a altura do controle. Faz referncia a uma coleo de propriedades do tipo CSS Cascading Style Sheets, associadas com o controle. utilizada para definir ou retornar informaes sobre o ndice de tabulao do controle. O ndice de tabulao define a ordem de deslocamento do cursor, dentro de um formulrio, quando pressionamos a tecla TAB. Por exemplo, se estamos em um campo com ndice de tabulao 2 e pressionamos a tecla TAB, o cursor ir para o controle com ndice de tabulao 3. utilizada para definir ou retornar um pequeno texto que ser exibido quando o usurio apontar o mouse para o controle. Propriedade boleana, utilizada para retornar ou definir um valor que indica se o controle deve ser exibido (True) ou no (False). utilizada para definir ou retornar a largura do controle.
EnableViewState
Estas propriedades esto disponveis para todos os controles derivados da classe WebControl; em outras palavras, os controles que tm a classe WebControl como base iro herdar estas propriedades.
Tabela 9.2 Mtodos da classe WebControl. Propriedade CopyBaseAttributes Descrio Copia o valor das propriedades AccessKey, Enabled, TabIndex e Attributes para o controle atual, a partir de um controle especificado como parmetro para o mtodo. semelhante ao que faz a ferramenta pincel nos aplicativos do Microsoft Office, quando copia uma srie de caractersticas de formatao de um pargrafo para outro.
311
www.juliobattisti.com.br
Descrio Faz a associao de uma fonte de dados com o controle e com todos os seus controles filhos. Determina se duas instncias de um controle so iguais. Procura um determinado controle no Conteiner atual. Normalmente o Conteiner atual a pgina ASP.NET onde est o controle. Retorna um valor Boleano indicando se o controle possui controles filhos (True) ou no (False). Retorna uma representao do controle, no formato String.
Tabela 9.3 Eventos da classe WebControl. Evento DataBinding Disposed Init Load Descrio Ocorre quando o controle ligado (associado) a uma fonte de dados. Ocorre quando o controle descarregado da memria, o qual o ltimo estgio no ciclo de vida do controle quando a pgina ASP.NET carregada. Ocorre quando o controle inicializado, o que o primeiro estgio no seu ciclo de vida. Ocorre quando o objeto, que representa uma instncia do controle, carregado no objeto Page, que representa a pgina sendo carregada. Lembre que toda pgina ASP.NET ao ser carregada compilada em um objeto que uma instncia da classe Page.
www.juliobattisti.com.br
312
A propriedade AutoPostBack do tipo Boleana, podendo assumir os valores True ou False. Se o valor desta propriedade estiver definido em True, um PostBack ser gerado para o servidor, toda vez que o valor do controle for alterado. Por padro, o valor desta propriedade definido como False. Se for definida para True, toda vez que o valor do controle for alterado, o controle reenvia para o servidor (postback) o seu valor e o valor de todos os controles do formulrio. Algo parecido com disparar um evento Aps alterar, para um campo de um formulrio criado com o Microsoft Access ou com o VB. A propriedade Wrap define se deve ser feita uma quebra automtica de linha, cada vez que o texto atinge o limite da caixa de texto. OnTextChanged um mtodo que dispara o evento TextChanged, para o qual podemos definir um procedimento que ser executado em resposta ao evento. Vamos a um exemplo simples. Vamos criar um formulrio onde temos trs campos: Nome Senha Comentrios O usurio preenche os dados e clica no boto Enviar. Vamos criar um procedimento para o evento Click do boto Enviar. Este procedimento ir exibir, em um controle HtmlTextArea, os valores digitados pelo usurio, com exceo da senha. Na Listagem 9.1 temos o cdigo para o exemplo proposto.
313
www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB Listagem 9.1 O controle TextBox chap9ex1.aspx.
<html> <script language=C# runat=server>
public void {
Enviar_Click(Object sender,EventArgs e)
</script>
<body>
<table> <tr> <td><h3>Nome:</h3> </td> <td> <asp:TextBox runat=server id=Nome Text= Font_Face=Arial Font_Size=3" BackColor=Cyan ForeColor=Blue BorderColor=Red TextMode=SingleLine Columns=40" />
</td> </tr>
<tr>
www.juliobattisti.com.br
314
</td> </tr>
<tr> <td><h3>Comentrios:</h3> </td> <td> <asp:TextBox runat=server id=Comentrios Text= Font_Face=Arial Font_Size=2" BackColor=Silver ForeColor=Blue BorderColor=Green TextMode=MultiLine Rows=10" Columns=30" /> </td> </tr>
315
www.juliobattisti.com.br
<tr> <td><B>Clique no boto></B></td> <td> <input type=submit value=Enviar OnServerClick=Enviar_Click runat=server> </td> </tr>
</table>
</form>
</body> </html>
Digite o cdigo da Listagem 9.1 e salve o mesmo em um arquivo chamado chap9ex1.aspx, na pasta chap9, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex1.aspx No campo Nome digite: Jos abc da silva. No campo Senha digite: 123456. No campo de comentrios digite o seguinte texto: Estudo dos Web Form Controls do ASP.NET. Controles avanados e com melhor interface visual, com acesso a uma variedade de mtodos, propriedades e eventos. D um clique no boto Enviar. Voc obter o resultado indicado na Figura 9.1. Observe que o controle que exibe os valores digitados pelo usurio no consegue exibir todo o contedo digitado; por isso uma barra de rolagem vertical disponibilizada. No evento Click do boto Enviar, definimos a propriedade Value do controle Exibe como sendo a concatenao dos valores digitados nos campos Nome e Comentrios. Para concatenar strings, apenas para lembrar, utilizamos o operador +. O \n define uma quebra de linha. Tambm importante salientar que, para obter o valor digitado nos controles, utilizamos a propriedade Text. Nos controles do tipo HtmlServer, utilizvamos a propriedade Value, ao invs da
www.juliobattisti.com.br
316
Figura 9.1: Utilizando o controle TextBox com as opes SingleLine, Password e MultiLine.
propriedade Text. Alis estamos fazendo isto neste exemplo, pois o controle que exibe os valores digitados pelo usurio um controle do tipo HtmlServer. Para definir o que o controle ir exibir, estamos definindo a sua propriedade Value, conforme indicado no trecho de cdigo a seguir:
public void { Exibe.Value = Nome.Text + \n + Seus comentrios: + \n + Comentrios.Text; } Enviar_Click(Object sender,EventArgs e)
317
www.juliobattisti.com.br
ou
<asp:Label id=Identificao_no_cdigo runat=server> Text a ser exibido </asp:Label>
IMPORTANTE: Voc deve estar lembrado de que, nas verses anteriores do ASP, no podamos quebrar um comando em vrias linhas, sem colocar um caractere especial, no final de cada linha. Com ASP.NET, no temos mais esta limitao; observe que podemos dividir o comando em diversas linhas, sem maiores problemas.
Para definir o texto a ser exibido em um controle Label, utilizamos a propriedade Text do controle. A seguir um exemplo que adiciona um controle do tipo Label, com o texto inicial Este o texto original do controle. Ao clicarmos no boto Enviar, o evento Click deste boto altera o texto do Label para Este o texto modificado. Na Listagem 9.2 temos o cdigo para o exemplo proposto.
public void {
Enviar_Click(Object sender,EventArgs e)
</script>
<body>
www.juliobattisti.com.br
318
<b> <asp:Label id=Rotulo1" Text=Este o texto original do controle BackColor=Black ForeColor=White runat=server /> </b>
<BR> <BR>
<table> <tr> <td><B>Clique no boto></B></td> <td> <input type=submit value=Enviar OnServerClick=Enviar_Click runat=server> </td> </tr> </table>
</form>
</body> </html>
Digite o cdigo da Listagem 9.2 e salve o mesmo em um arquivo chamado chap9ex2.aspx, na pasta chap9, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex2.aspx Ao carregar a pgina ser exibido o texto Este o texto original do controle. Observe que o texto est com cor de fundo preta e cor de fonte branco, conforme definimos nas propriedades do controle Label. D um clique no boto Enviar. O texto do controle do tipo Label alterado para Este o texto modificado, conforme indicado na Figura 9.2.
319
www.juliobattisti.com.br
NOTA: Para criar mltiplos controles do tipo CheckBox, de uma s vez, ligados a uma fonte de dados, devemos utilizar o controle CheckBoxList. Aprenderemos a utilizar este controle nos Captulos 10 e 11.
www.juliobattisti.com.br
320
public void {
Enviar_Click(Object sender,EventArgs e)
// Comeo a montar uma string que ser atribuda // propriedade Value do controle Dados.
Exibe.Text = Aux;
321
www.juliobattisti.com.br
</script>
<body>
<form method=post runat=server> <table> <tr> <td colspan=2"><H2>Selecione as reas de interesse:</H2></td> </tr>
<tr> <td><B>Opo 1:</B> </td> <td> <asp:CheckBox id=Negcios runat=server Text=Negcios AutoPostBack=True />
</td> </tr>
<tr> <td><B>Opo 2:</B> </td> <td> <asp:CheckBox id=Direito runat=server Text=Direito AutoPostBack=True /> </td> </tr>
www.juliobattisti.com.br
322
<tr> <td><B>Clique no boto ></B></td> <td> <input type=submit value=Enviar OnServerClick=Enviar_Click runat=server> </td> </tr>
<tr> <td><B>Dados do cliente:</B> </td> <td> <b> <asp:Label id=Exibe Text= BackColor=Black ForeColor=White runat=server /> </b> </td> </tr>
</table>
323
www.juliobattisti.com.br
NOTA: Para criar mltiplos controles do tipo RadioButton, de uma s vez, ligados a uma fonte de dados, devemos utilizar o controle RadioButtonList. Aprenderemos a utilizar este controle nos Captulos 10 e 11.
www.juliobattisti.com.br
324
Neste trecho criamos um grupo chamado GrupoPagamento, o qual possui trs controles do tipo RadioButton: Carto Transferncia Boleto Ao carregarmos a pgina, o controle Carto j vem selecionado, pois definimos a sua propriedade Checked=True. Este trecho de cdigo gera a sada indicada na Figura 9.4.
325
www.juliobattisti.com.br
Neste exemplo estamos definindo o texto a ser exibido em um controle do tipo Label (Label1), com base na opo selecionada. A propriedade Text do controle RadioButton (Carto.Text, Transferncia.Text e Boleto.Text) retorna o valor definido na propriedade Text do controle. Por exemplo, para o controle Carto, Carto.Text=Carto de Crdito:.
NOTA: Para uma referncia completa sobre todas as propriedades do controle RadioButton, consulte a documentao do Framework .NET. Mais especificamente, consulte a classe RadioButton do namespace System.Web.UI.WebControls.
www.juliobattisti.com.br
326
NOTA: O Controle Button Web Server Control derivado da classe base Button, do namespace System.Web.UI.WebControls. Para uma referncia completa a todas as propriedades e mtodos deste controle, consulte a documentao do Framework .NET.
No trecho de cdigo a seguir, temos o exemplo da criao de um controle Button, do tipo Submit, em uma pgina .aspx:
<asp:Button id=Enviar Text=Enviar OnClick=Enviar_Click runat=server />
No trecho de cdigo a seguir, temos o exemplo da criao de um controle Button, do tipo Command, em uma pgina .aspx:
<asp:Button id=SortAscendingButton Text=Sort Ascending CommandName=Sort CommandArgument=Ascending OnClick=CommandBtn_Click runat=server />
327
www.juliobattisti.com.br
Observe que os aspectos visuais so definidos aos pares: aspecto:valor;. Por exemplo, a definio da cor das bordas do boto feita da seguinte maneira:
border-color:Red;
www.juliobattisti.com.br
328
NOTA: As definies dos elementos visuais fazem parte de uma especificao conhecida como CSS Cascading Style Sheets. O estudo da definio CSS est fora do escopo deste livro. Para maiores informaes sobre CSS, consulte os seguintes endereos: www.w3.org www.wdvl.com www.internet.com e www.developer.com
NOTA:O Controle ListBox Web Server Control derivado da classe base ListBox, do namespace System.Web.UI.WebControls. Para uma referncia completa a todas as propriedades e mtodos deste controle, consulte a documentao do Framework .NET.
</asp:ListBox>
Vamos apresentar um exemplo de utilizao do controle ListBox. O nosso exemplo constitudo de um formulrio no qual colocamos um controle ListBox, com seis elementos. O controle permite selees mltiplas e seu tamanho definido em 4 linhas. Ao clicar no boto Enviar, o evento Click deste boto informa qual foi o primeiro elemento a ser selecionado. Na Listagem 9.4 temos o cdigo para o exemplo proposto.
329
www.juliobattisti.com.br
<asp:ListBox id=ListBox1" Rows=4" SelectionMode=Multiple Width=100px runat=server style=color:White; background-color:Black; > <asp:ListItem>Item 1</asp:ListItem> <asp:ListItem>Item 2</asp:ListItem> <asp:ListItem>Item 3</asp:ListItem> <asp:ListItem>Item 4</asp:ListItem> <asp:ListItem>Item 5</asp:ListItem> <asp:ListItem>Item 6</asp:ListItem> </asp:ListBox> <asp:button id=Enviar Text=Enviar OnClick=Enviar_Click runat=server /> <p>
www.juliobattisti.com.br
330
</body> </html>
Digite o cdigo da Listagem 9.4 e salve o mesmo em um arquivo chamado chap9ex4.aspx, na pasta chap9, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo:
http://localhost/chap9/chap9ex4.aspx
Para selecionar mltiplas opes na lista de opes, mantenha a tecla Ctrl pressionada e v clicando nas opes a serem selecionadas. Selecione as opes 1, 2 e 3 e d um clique no boto Enviar, conforme indicado na Figura 9.6.
NOTA: Nos Captulos 10 e 11 veremos exemplos de utilizao das propriedades DataSource, DataTextField e DataValueField, onde os items do controle ListBox sero obtidos a partir de uma fonte de dados.
recarregada. Se o nmero de modificaes for grande, devemos utilizar os controles DataList e DataGrid, ao invs do controle Table. Aprenderemos a utilizar os controles DataList e DataGrid nos Captulos 10 e 11.
331
www.juliobattisti.com.br
NOTA: O Controle Table Web Server Control derivado da classe base Table, do namespace System.Web.UI.WebControls. Para uma referncia completa a todas as propriedades desta classe, consulte a documentao do Framework .NET.
</asp:TableRow>
</asp:Table>
Para criar uma nova linha da tabela, utilizamos o controle TableRow. Uma tabela formada por uma coleo de linhas, onde cada linha definida por uma coleo de clulas Cells Colection. Podemos definir o conjunto de linhas da tabela estaticamente, atravs da utilizao de uma srie de controles TableRow, ou dinamicamente, atravs de cdigo de programao. Sintaxe para o controle TableRow:
<asp:TableRow id=Identificao_co_cdigo HorizontalAlign=Center|Justify|Left|NotSet|Right VerticalAlign=Bottom|Middle|NotSet|Top runat=server >
</asp:TableRow>.
www.juliobattisti.com.br
332
NOTA: O Controle TableRow Web Server Control derivado da classe base TableRow, do namespace System.Web.UI.WebControls. Para uma referncia completa a todas as propriedades desta classe, consulte a documentao do Framework .NET.
A propriedade Wrap define se deve haver o retorno automtico de texto dentro da clula (Wrap=True) ou no (Wrap=False). Vamos apresentar um exemplo, no qual uma tabela criada dinamicamente, atravs de cdigo executado no evento Load da pgina (Page_Load). O cdigo do evento Load adiciona trs linhas, com trs clulas em cada linha. A tabela criada na seo de apresentao da pgina, porm sem nenhuma linha ou coluna, elementos estes que so adicionados pelo cdigo do evento Load. Na Listagem 9.5 temos o cdigo para o exemplo proposto.
NOTA: O Controle TableCell Web Server Control derivado da classe base TableCell, do namespace System.Web.UI.WebControls. Para uma referncia completa a todas as propriedades desta classe, consulte a documentao do Framework .NET.
333
www.juliobattisti.com.br
// O lao externo cria uma nova linha a cada passagem do lao. // O lao interno vai adicionando clulas a linha criada pela // passada do lao externo. for (int j=0; j<numrows; j++) {
, coluna
</head> <body>
<form runat=server>
www.juliobattisti.com.br
334
</form>
</body> </html>
Digite o cdigo da Listagem 9.5 e salve o mesmo em um arquivo chamado chap9ex5.aspx, na pasta chap9, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex5.aspx Voc vai obter o resultado indicado na Figura 9.7. Alguns comentrios sobre o exemplo: No evento load utilizamos dois laos for. O lao externo adiciona uma nova linha tabela, a cada passada do lao; j o lao interno adiciona uma nova clula a cada passada do lao. Para definir o contedo da clula, utilizamos o seguinte comando:
c.Controls.Add(new LiteralControl(linha + j.ToString() + i.ToString())); , coluna +
Esta tcnica diferente da utilizada com os HtmlServer Controls para a criao de tabelas, quando utilizamos a propriedade InnerHtml do controle HtmlTableCell. No podemos utilizar esta tcnica com o controle TableCell, pois ele no possui uma propriedade InnerHtml. Para resolver este problema, utilizamos um controle do tipo LiteralControl. Quando esta pgina compilada, o controle LiteralControl retorna exatamente o que foi passado como parmetro. No nosso exemplo, ao carregar a pgina, tudo o
335
www.juliobattisti.com.br
quando a pgina processada, o parmetro passado para o controle LiteralControl fica da seguinte maneira:
linha 0, coluna 0
j.ToString substitudo pela string correspondente ao valor de j 0. i.ToString substitudo pela string correspondente ao valor de i 0. Com isso, o nosso comando fica:
c.Controls.Add(new LiteralControl(linha 0, coluna 0));
que exatamente o contedo que ser exibido na clula. Embora parea um pouco complicado, primeira vista, este exemplo demonstra o poder e a flexibilidade que temos disposio com o uso dos Web Server Controls e da biblioteca de classes do Framework .NET. Qualquer elemento da pgina tratado como um objeto. Atravs de programao temos um controle total sobre os mtodos, propriedades e eventos destes objetos.
www.juliobattisti.com.br
336
IMPORTANTE: O controle Panel Web Server Control derivado da classe base Panel, do namespace System.Web.UI.WebControls. Para uma referncia completa a todas as propriedades e mtodos deste controle, consulte a documentao do Framework .NET.
337
www.juliobattisti.com.br
if (Check1.Checked) { Panel1.Visible=false; } else { Panel1.Visible=true; } // Adiciona controles do tipo Label ao controle Panel.
www.juliobattisti.com.br
338
Label l = new Label(); l.Text = Rtulo + (i).ToString(); l.ID = Rtulo + (i).ToString(); Panel1.Controls.Add(l); Panel1.Controls.Add(new LiteralControl(<br>)); } // Adiciona controles do tipo Caixa de Texto ao controle Panel.
for (int i=1; i<=numtexts; i++) { TextBox t = new TextBox(); t.Text = Caixa de Texto + (i).ToString(); t.ID = Caixa de Texto + (i).ToString(); Panel1.Controls.Add(t); Panel1.Controls.Add(new LiteralControl(<br>)); } } </script> </head> <body> <h3><font face=Verdana>Exemplo do controle Panel!!</font></h3>
<form runat=server>
<asp:Panel id=Panel1" runat=server BackColor=gainsboro Height=200px Width=400px style=color:White; background-color:Black; border-color:Red; border-width:6px; border-style:Double;
339
www.juliobattisti.com.br
<asp:DropDownList id=DropDown1 runat=server> <asp:ListItem Value=0">0</asp:ListItem> <asp:ListItem Value=1">1</asp:ListItem> <asp:ListItem Value=2">2</asp:ListItem> <asp:ListItem Value=3">3</asp:ListItem> <asp:ListItem Value=4">4</asp:ListItem> </asp:DropDownList>
<asp:DropDownList id=DropDown2 runat=server> <asp:ListItem Value=0">0</asp:ListItem> <asp:ListItem Value=1">1</asp:ListItem> <asp:ListItem Value=2">2</asp:ListItem> <asp:ListItem Value=3">3</asp:ListItem> <asp:ListItem Value=4">4</asp:ListItem> </asp:DropDownList>
<p> <asp:CheckBox id=Check1" Text=Ocultar o Painel runat=server/> <p> <asp:Button Text=Atualiar o Painel runat=server/> </font> </form>
</body> </html>
Digite o cdigo da Listagem 9.6 e salve o mesmo em um arquivo chamado chap9ex6.aspx, na pasta chap9, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
www.juliobattisti.com.br
340
341
www.juliobattisti.com.br
www.juliobattisti.com.br
342
Em primeiro lugar declaramos e inicializamos uma varivel numlabels, do tipo int. Atribumos o valor selecionado na lista DropDown1 para a varivel numlabels. Observe a utilizao do mtodo Parse, da estrutura Int32. Este mtodo utilizado para converter a String retornada pelo controle DropDown1, em um nmero Int32, equivalente. Em seguida iniciamos um lao for. A cada passada do lao um controle l, do tipo Label, criado. Depois definimos as suas propriedades Rtulo e ID. Em seguida utilizamos o mtodo Add, da coleo Controls, do controle Panel, para adicionar o rtulo recm-criado Panel1.Controls.Add(l). Para finalizar, utilizamos LiteralControl para enviar uma tag <br>, para fazer uma quebra de linha. Sem esta tag <br>, os rtulos seriam colocados um ao lado do outro e no um em cada linha. As mesmas observaes so vlidas para a adio dos controles do tipo Caixa de texto. Este exemplo salienta os recursos que temos disposio, quando utilizamos os Web Server Controls. Observe que temos acesso a uma infinidade de mtodos e propriedades, todas bem definidas e documentadas na documentao do Framework .NET, no item .NET Framework Class Library.
IMPORTANTE: O Controle Image Web Server Control derivado da classe base Image, do namespace System.Web.UI.WebControls. Para uma referncia completa a todas as propriedades e mtodos deste controle, consulte a documentao do Framework .NET.
343
www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB Listagem 9.7 O controle Image chap9ex7.aspx.
<html> <head> </head> <body> <form runat=server> <h2><font face=Verdana>SQL Server 2000 - Curso Completo!!</font></h2> <h3><font face=Verdana>Por: Jlio Battisti</font></h3> <h3><font face=Verdana><a hrehttp://www.axcel.com.br> Editora Axcel Books</a></font></h3>
<asp:Image id=image1" runat=server AlternateText=SQL Server 2000 Curso Completo ImageAlign=left ImageUrl=livrosql2000.jpg />
</form>
</body> </html>
Digite o cdigo da Listagem 9.7 e salve o mesmo em um arquivo chamado chap9ex7.aspx, na pasta chap9, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex7.aspx Voc vai obter o resultado indicado na Figura 9.10. Observe que, embora no tenhamos nenhum cdigo na seo de cdigo (na verdade nem temos seo de cdigo neste exemplo), mesmo assim utilizamos a extenso .aspx e a pgina foi processada normalmente.
www.juliobattisti.com.br
344
NOTA: O Controle HyperLink Web Server Control derivado da classe base HyperLink, do namespace System.Web.UI.WebControls. Para uma referncia completa a todas as propriedades e mtodos deste controle, consulte a documentao do Framework .NET.
345
www.juliobattisti.com.br
Texto do Link.
</asp:HyperLink>
</body> </html>
www.juliobattisti.com.br
346
347
www.juliobattisti.com.br
ou
<asp:LinkButton id=Identificao_no_cdigo Command= Nome de comando. Define o controle como sendo do tipo Command CommandArgument=CommandArgument
NOTA:O Controle LinkButton Web Server Control derivado da classe base LinkButton, do namespace System.Web.UI.WebControls. Para uma referncia completa a todas as propriedades e mtodos deste controle, consulte a documentao do Framework .NET.
OnClick=Mtodo que executa em resposta ao evento Click do controle. runat=server > Texto do LinkButton </asp:LinkButton>
www.juliobattisti.com.br
348
</script>
<asp:LinkButton id=LinkButton1" Text=Clique, por favor! Font-Name=Verdana Font-Size=14pt OnClick=LinkButton1_Click runat=server /> <BR> <BR>
Digite o cdigo da Listagem 9.9 e salve o mesmo em um arquivo chamado chap9ex9.aspx, na pasta chap9, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex9.aspx Na pgina que carregada, d um clique no link Clique, por favor!. Voc obter o resultado indicado na Figura 9.12.
349
www.juliobattisti.com.br
NOTA: O Controle ImageButton Web Server Control derivado da classe base ImageButton, do namespace System.Web.UI.WebControls. Para uma referncia completa a todas as propriedades e mtodos deste controle, consulte a documentao do Framework .NET.
www.juliobattisti.com.br
350
<script runat=server>
<br> <br>
351
www.juliobattisti.com.br
<br> <br>
</form>
</body> </html>
Digite o cdigo da Listagem 9.10 e salve o mesmo em um arquivo chamado chap9ex10.aspx, na pasta chap9, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex10.aspx Na pgina que carregada, d um clique em qualquer ponto da imagem; sero informadas as coordenadas do ponto onde voc clicou, conforme indicado na Figura 9.13. O mtodo ImageButton_Click executado em resposta ao evento Click do controle ImageButton. Um dos argumentos (argumento e) deste mtodo do tipo ImageClickEventArgs. Este argumento um objeto baseado na classe ImageClickEventArgs. Esta classe possui dois campos: X: Retorna a coordenada horizontal, em relao origem. Y: Retorna a coordenada vertical, em relao origem. Com estes dois campos podemos acessar as coordenadas do ponto onde o usurio clicou. Para acessar a coordenada X, utilizamos o seguinte comando:
e.X.ToString( )
www.juliobattisti.com.br
352
Concluso
Iniciamos o captulo estudando a classe base para todos os Web Server Controls: WebControl. Em seguida, aprendemos a utilizar controles pertencentes aos chamados Web Server Controls. Estudamos e apresentamos exemplos sobre os seguintes controles: TextBox Label CheckBox RadioButton Button ListBox Table, TableCell e TableRow Panel Image HyperLink
NOTA: Utilizamos o mtodo ToString, para converter o valor inteiro, retornado pelos campos X e Y, na string correspondente.
353
www.juliobattisti.com.br
www.juliobattisti.com.br
354
Introduo
Voc lembra do tempo em que para construir um site era s criar um monte de pginas HTML? Eu lembro. Se eu tenho saudades? Sinceramente, no. Embora fosse muito mais simples e fcil, o que se pode fazer apenas com HTML muito pouco. Hoje, a realidade bem diferente. Vivemos em um mundo com milhes de pessoas conectadas Internet. O comrcio eletrnico entre empresas (B2B Business To Business) e o comrcio eletrnico entre empresas e consumidores finais (B2C Business To Consumer) j uma realidade. Mas a Internet no utilizada apenas para comrcio eletrnico. Sistemas de gerenciamento das relaes com o cliente CRM Customer Relationship Management, software para ser utilizado pela Internet, mediante o pagamento de uma taxa mensal ASP Application Services Providers, so apenas alguns exemplos dos servios que se tornaram realidade graas utilizao da Internet. Novas ofertas e servios surgem diariamente. Mas o que tm em comum todos estes sites? A tecnologia? De maneira alguma. Existem tecnologias para os mais variados gostos, desde solues 100% Java, passando pelo software livre, com a utilizao do servidor Apache, Linux e da linguagem PHP, at o mundo Microsoft, antes com a tecnologia ASP e o padro COM/COM+ e agora com o Framework .NET. O que todos estes sites e aplicaes Web tm em comum a necessidade, cada vez maior, do acesso a dados das mais variadas fontes. Existem exemplos de aplicaes Web que apresentam, na mesma pgina, dados oriundos do Mainframe, de um servidor SQL Server ou ORACLE e de uma planilha do Excel. O fato que o acesso aos dados uma necessidade. Com o uso da Informtica um volume cada vez maior de dados gerado, diariamente, nas empresas. Para transformar todos estes dados, em informaes teis, geradoras de negcios e lucros, precisamos de tecnologias que facilitem o acesso s mais diversas e variadas fontes de dados. Com o ASP 3.0 temos a tecnologia ADO/OLE-DB (Activex Data Objects/ OLE Database) para acesso a fontes de dados. Com ASP.NET temos um novo conjunto de classes para acesso a dados, conjunto este conhecido como ADO.NET. importante salientar que ADO.NET no uma nova verso de ADO. As duas tecnologias podem ser utilizadas em conjunto. ADO dando suporte a pginas e aplicaes Web criadas com ASP 3.0; e para pginas ASP.NET utilizamos
CAPTULO
10
Acessando Bancos de Dados com ASP.NET Parte 1
355
www.juliobattisti.com.br
www.juliobattisti.com.br
356
NOTA: Para maiores detalhes sobre o modelo de dados relacionais, consulte o Anexo II.
357
www.juliobattisti.com.br
NOTA: Para maiores informaes sobre Tabelas, Atributos, Chaves Primrias, Chaves Estrangeiras e Relacionamentos entre tabelas, consulte o Anexo II.
www.juliobattisti.com.br
358
NOTA: Os exemplos deste captulo sero criados na pasta D:\Inetpub\wwwrooot\ Chap10. Para acessar uma pgina, dentro desta pasta, por exemplo: Chap10Ex1.aspx, utilize o seguinte endereo: http://localhost/Chap10/ Chap10Ex1.aspx. A seguir descrevo os bancos de dados que sero utilizados nos exemplos deste e dos prximos captulos.
IMPORTANTE: Os nomes de empresas, produtos, pessoas, personagens e/ ou dados apresentados neste banco de dados so fictcios e no representam de forma alguma qualquer indivduo, produto, empresa ou evento, salvo meno contrria.
359
www.juliobattisti.com.br
IMPORTANTE: Os nomes de empresas, produtos, pessoas, personagens e/ou dados apresentados neste banco de dados so fictcios e no representam de forma alguma qualquer indivduo, produto, empresa ou evento, salvo meno contrria.
www.juliobattisti.com.br
360
NOTA: Os nomes de tabelas e campos do Banco de dados pubs esto em ingls, conforme fornecido na instalao do Framework .NET.
361
www.juliobattisti.com.br
NOTA: Os campos indicados por uma pequena chave amarela so campos do tipo Chave Primria. Os campos indicados pelo sinal de infinito (um 8 deitado) so campos do tipo Chave Estrangeira. Para detalhes sobre os conceitos de Chave Primria e Chave Estrangeira, consulte o Anexo II.
Neste captulo vamos estudar diversas classes dos namespaces da lista anterior. Veremos como estabelecer uma conexo com um banco de dados, como retornar dados a partir desta conexo e como exibir estes dados em uma pgina ASP.NET. No ASP 3.0, utilizando ADO, o objeto que utilizamos para retornar dados o RecordSet. No ADO.NET no temos o objeto RecordSet. De incio voc que j estava acostumado com o objeto RecordSet pode estranhar um pouco, mas conforme veremos nos exemplos deste captulo, os objetos do ADO.NET alm de mais poderosos so tambm mais fceis de utilizar. A principal facilidade notada no momento de exibir os resultados obtidos, quando podemos utilizar alguns Web Server Controls bastante poderosos, mais especificamente o controle DataGrid.
www.juliobattisti.com.br
362
2.
Utilizando o comando using do C#. No fragmento de cdigo a seguir, estamos importando os namespaces System.Data e System.Data.SqlClient:
using System.Data; using System.Data.SqlClient;
Uma vez feitas as devidas importaes (ou referncias), estamos aptos a utilizar as classes dos namespaces referenciados.
Estabelecendo Conexes
Uma coisa no mudou no ADO.NET, em relao ao ADO: o primeiro passo estabelecer uma conexo com o banco de dados. Embora com ADO.NET tenhamos um modelo desconectado, conforme descrito anteriormente, o primeiro passo fazer uma conexo com o banco de dados. Uma vez estabelecida a conexo, obtemos os dados desejados e podemos trabalhar com estes dados diretamente no navegador, desconectados do banco de dados. Uma vez feitas as alteraes necessrias, sincronizamos os dados com o banco de dados. Para estabelecer uma conexo com um banco de dados do SQL Server, devemos utilizar, preferencialmente, a classe SqlConnection, do namespace System.Data.SqlClient. Para acessar um banco de dados utilizando o OLE-DB Provider correspondente, utilizamos a classe OleDbConnection do namespace System.Data.OleDb. Como existe um OLE-DB Provider para o SQL Server, tambm poderamos utilizar a classe OleDbConnection para fazer uma conexo com o SQL Server, porm a classe SqlConnection bem mais eficiente, em termos de desempenho, pois foi especificamente projetada para trabalhar com o SQL Server 2000, assim como foram todas as classes do namespace System.Data.SqlClient. Vamos estudar estas duas classes.
363
www.juliobattisti.com.br
O parmetro passado uma string que contm as informaes necessrias para estabelecer a conexo com o banco de dados. Mais adiante veremos um exemplo de utilizao e criao de uma conexo. Na Tabela 10.1 temos uma descrio das principais propriedades da classe SqlConnection:
Tabela 10.1 Principais propriedades da classe SqlConnection. Propriedade ConnectionString Descrio utilizada para definir ou retornar uma string de texto onde so informados os diversos parmetros para estabelecer a conexo, como por exemplo o nome do servidor, a instncia, o nome do banco de dados, o nome de login e senha. Define por quanto tempo feita a tentativa de estabelecer a conexo. Aps o tempo definido nesta propriedade, a tentativa cancelada e um erro gerado. utilizada para definir ou retornar o nome do banco de dados que ser utilizado quando a conexo for estabelecida. Retorna o nome da instncia do SQL Server com a qual foi estabelecida uma conexo. Retorna uma string informando a verso do servidor SQL Server com o qual a conexo foi estabelecida. Retorna o estado atual da conexo.
Vamos apresentar um pequeno exemplo, onde criamos uma conexo com o Banco de dados pubs da instncia SERVIDOR\NETSDK (conforme descrito anteriormente). Uma vez estabelecida a conexo, vamos exibir as propriedades desta conexo em um Web Server Control do tipo TextArea. Vamos utilizar o evento Page_Load, da pgina ASP.NET, para estabelecer a conexo com o Banco de dados pubs. Na Listagem 10.1 temos o cdigo para o exemplo proposto.
www.juliobattisti.com.br
364
{ // Crio uma conexo com o banco de dados pubs localizado no servidor local. // Vamos acessar a instncia SERVIDOR\NETSDK.
// Declaro uma varivel do tipo String: auxPropriedades. // A varivel auxPropriedades ir conter o valor das propriedades // da conexo minhaConexo.
ExibePropriedades.Font.Bold=true; ExibePropriedades.Text=auxPropriedades;
</script>
<body>
365
www.juliobattisti.com.br
</body> </html>
Digite o cdigo da Listagem 10.1 e salve o mesmo em um arquivo chamado chap10ex1.aspx, na pasta chap10, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap10ex1.aspx Ao carregar a pgina voc ir obter uma pgina semelhante pgina indicada na Figura 10.5.
www.juliobattisti.com.br
366
Se no fizssemos essa referncia, obteramos um erro de compilao, ao carregar a pgina, conforme indicado na Figura 10.6.
Observe que este um comando nico, que foi dividido em duas linhas por falta de espao. Declaramos a varivel MinhaConexo como sendo do tipo SqlConnection, ao mesmo tempo que inicializamos esta varivel, passando como parmetro uma string de conexo. Na string passada como parmetro so definidas as seguintes informaes:
367
www.juliobattisti.com.br
importante salientar que o objeto do tipo SqlConnection foi criado, porm ainda no foi estabelecida a conexo, conforme pode ser confirmado pelo valor da propriedade State=Closed, na Figura 10.5. No restante do evento Load, montamos uma string (auxPropriedades), onde vamos concatenando o nome e o valor das propriedades do objeto MinhaConexo. Observe que anexamos dois caracteres de nova linha \n\n. Isso feito para ir para uma nova linha a cada propriedade (um \n) e para deixar uma linha em branco entre a exibio de cada propriedade (mais um \n). Aps termos montado a string auxPropriedades, definimos a fonte do controle ExibePropriedades para negrito e atribumos o valor da varivel auxPropriedades, propriedade Text do controle ExibePropriedades, conforme indicado no fragmento a seguir:
ExibePropriedades.Font.Bold=true; ExibePropriedades.Text=auxPropriedades;
O controle ExibePropriedades um Web Server Control do tipo TextBox com mltiplas linhas. Para maiores informaes sobre este controle, consulte o Captulo 9. Na Tabela 10.2 temos uma descrio dos principais mtodos da classe SqlConnection:
Tabela 10.2 Principais mtodos da classe SqlConnection. Mtodo Open Close ChangeDatabase Descrio Abre a conexo de acordo com as definies da propriedade ConnectionString. Fecha a conexo com o banco de dados. Altera o banco de dados associado com a conexo.
O principal evento do objeto SqlConnection o evento StateChange. Este evento ocorre quando o estado da conexo alterado de Open para Closed ou vice-versa. No exemplo da Listagem 10.1, podemos adicionar o seguinte comando, logo aps a criao da conexo MinhaConexo:
MinhaConexo.Open();
Este comando abre a conexo MinhaConexo. Aps inserirmos este comando na Listagem 10.1 e recarregarmos a pgina, obteremos o resultado indicado na Figura 10.7.
www.juliobattisti.com.br
368
Primeiro definimos uma string chamada DefineConexo. Esta string contm as informaes necessrias para estabelecer a conexo com um banco de dados do Microsoft Access. importante salientar a utilizao das duas barras invertidas (\\), ao invs de uma nica barra. Como a barra invertida utilizada para caracteres de escape, no C#, como por exemplo: \n para quebra de linha, quando queremos representar uma barra e no um caractere de escape, precisamos colocar duas barras. Se voc colocar somente uma barra, ir obter o erro indicado na Figura 10.8, quando tentar carregar a pgina:
369
www.juliobattisti.com.br
Figura 10.8: Erro por usarmos um nica barra (\) ao invs de duas barras (\\).
Observe a mensagem em destaque, na Figura 10.8, informando que temos um caractere de escape, invlido. Em seguida criamos um objeto do tipo OleDbConnection, chamado MinhaConexo e passamos a string DefineConexo como parmetro para o mtodo construtor do objeto MinhaConexo. Na Tabela 10.3 temos os componentes que podem fazer parte da string de conexo (ConnectionString), para o OLEDB Provider do Microsoft Access.
Tabela 10.3 Definindo a propriedade ConnectionString para uma fonte do Microsoft Access. Propriedade Provider Data Source User ID Descrio Deve ser especificado o OLE DB Provider para o Microsoft Access. Para esta propriedade utilizamos o seguinte valor: Microsoft.Jet.OLEDB.4.0. Informamos o caminho para o arquivo .mdb. Por exemplo, C:\\Arquivos de programas\\NorthWind.mdb. Especifica o nome do usurio com a qual a conexo ser estabelecida. Caso esta propriedade no seja informada, a mesma ser definida como admin, o qual o usurio padro para o Microsoft Access.
www.juliobattisti.com.br
370
Propriedade Password
Descrio Informa a senha para o usurio que far a conexo. Caso esta propriedade no seja informada, a mesma ser definida como , ou seja, senha em branco.
Na Tabela 10.4 temos uma descrio das principais propriedades da classe OleDbConnection:
Tabela 10.4 Principais propriedades da classe OleDbConnection. Propriedade ConnectionString Descrio utilizada para definir ou retornar uma string de texto onde so informados os diversos parmetros para estabelecer a conexo, como por exemplo o nome do servidor, a instncia, o nome do banco de dados, o nome de login e senha. Define por quanto tempo feita a tentativa de estabelecer a conexo. Aps o tempo definido nesta propriedade, a tentativa cancelada e um erro gerado. utilizada para definir ou retornar o nome do banco de dados que ser utilizado quando a conexo for estabelecida. Utilizada, normalmente, para conexo com o SQL Server ou ORACLE. Retorna o estado atual da conexo.
ConnectionTimeOut Database
State
Vamos apresentar um pequeno exemplo, onde criamos uma conexo com o banco de dados C:\Meus documentos\NorthWind.mdb. Uma vez estabelecida a conexo, vamos exibir as propriedades desta conexo em um Web Server Control do tipo TextArea. Vamos utilizar o evento Page_Load, da pgina ASP.NET, para estabelecer a conexo com o Banco de dados pubs. Na Listagem 10.2 temos o cdigo para o exemplo proposto.
<html>
protected void Page_Load(Object Src, EventArgs E ) { // Crio uma conexo com o banco de dados pubs localizado no servidor local. // Vamos acessar a instncia SERVIDOR\NETSDK.
371
www.juliobattisti.com.br
MinhaConexo.Open();
// Declaro uma varivel do tipo String: auxPropriedades. // A varivel auxPropriedades ir conter o valor das propriedades // da conexo minhaConexo.
ExibePropriedades.Font.Bold=true; ExibePropriedades.Text=auxPropriedades;
</script>
www.juliobattisti.com.br
372
</body> </html>
Digite o cdigo da Listagem 10.2 e salve o mesmo em um arquivo chamado chap10ex2.aspx, na pasta chap10, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap10ex2.aspx Voc ir obter uma pgina semelhante pgina indicada na Figura 10.9.
373
www.juliobattisti.com.br
Tabela 10.5 Principais mtodos da classe OleDbConnection. Mtodo Open Close ChangeDatabase Descrio Abre a conexo de acordo com as definies da propriedade ConnectionString. Fecha a conexo com o banco de dados. Altera o banco de dados associado com a conexo. Utilizado para conexes com o SQL Server ou ORACLE.
O principal evento do objeto OleDbConnection o evento StateChange. Este evento ocorre quando o estado da conexo alterado de Open para Closed ou vice-versa. Muito bem, j sabemos estabelecer uma conexo com um banco de dados. E agora? Ainda precisamos aprender como fazer as seguintes operaes: Definir um comando para ser executado no banco de dados. Retornar dados de uma ou mais tabelas. Retornar informaes sobre os relacionamentos entre as tabelas. Exibir os resultados obtidos. Nos prximos tpicos aprenderemos a realizar estas operaes.
www.juliobattisti.com.br
374
Figura 10.10: Passos para acessar e exibir dados em uma pgina ASP.NET.
importante salientar que esta apenas uma das maneiras de acessarmos dados e exibi-los em uma pgina ASP.NET. Nos Captulos 11 e 12 veremos outras maneiras de ter acesso a variadas fontes de dados. No restante deste captulo vamos estudar os objetos indicados no diagrama da Figura 10.10.
375
www.juliobattisti.com.br
Tabela 10.6 Principais propriedades das classes SqlCommand/OleDbCommand. Propriedade CommandText CommandTimeOut Descrio Esta propriedade utilizada para definir ou retornar o comando SQL ou o nome de um Stored Procedure associado com o comando. Define por quanto tempo o Framework .NET tenta executar o comando. Se no tempo definido por esta propriedade, o comando no for executado com sucesso, o mesmo suspenso e uma mensagem de erro retornada. Pode ser definida como Text, que o valor padro e significa que o valor atribudo propriedade CommandText um comando SQL. Tambm pode assumir o valor StoredProcedure; neste caso significa que o valor atribudo propriedade CommandText o nome de um Stored Procedure. Esta propriedade utilizada para definir ou retornar a conexo atravs da qual o comando executado.
CommandType
Connection
Na Tabela 10.7 temos uma descrio dos principais mtodos das classes SqlCommand/OleDbCommand:
Tabela 10.7 Principais mtodos das classes SqlCommand/OleDbCommand. Mtodo Cancel CreateParameter Descrio Cancela a execuo do comando. Utilizada para a criao e definio de parmetros. Podemos utilizar parmetros quando estamos executando um Stored Procedure ou uma consulta parametrizada do Microsoft Access. Executa o comando definido na propriedade CommandText, atravs da conexo definida na propriedade Connection, para consultas que no retornam dados. Exemplo de consultas que no retornam dados so consultas de atualizao, adio ou excluso. Este mtodo retorna um valor inteiro, valor este que indica o nmero de registros afetados pela execuo do comando.
ExecuteNonQuery
www.juliobattisti.com.br
376
<html>
protected void Page_Load(Object Src, EventArgs E ) { // Crio uma conexo com o banco de dados Northwind.mdb // localizado na pasta C:\Meus documentos.
// Agora crio um objeto OleDbCommand chamado MeuComando. // Primeiro defino o texto do comando em uma varivel TextoDoComando. // Em seguida crio um objeto do tipo OleDbCommand e passo esta // varivel como parmetro.
MinhaConexo.Open();
377
www.juliobattisti.com.br
ExibePropriedades.Font.Bold=true; ExibePropriedades.Text=auxPropriedades;
</script>
<body>
www.juliobattisti.com.br
378
</body> </html>
Digite o cdigo da Listagem 10.3 e salve o mesmo em um arquivo chamado chap10ex3.aspx, na pasta chap10, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap10ex3.aspx Voc ir obter uma pgina semelhante pgina indicada na Figura 10.11. Comentrios sobre o cdigo do exemplo Chap10Ex3.aspx. Neste exemplo criamos um objeto do tipo OleDbCommand, conforme indicado no fragmento de cdigo a seguir:
string TextoDoComando = SELECT NmeroDoPedido, CdigoDoCliente, + PasDeDestino FROM Pedidos;
379
www.juliobattisti.com.br
string TextoDoComando = SELECT au_id, au_lname, au_fname FROM authors; OleDbCommand MeuComando = new OleDbCommand(TextoDoComando,MinhaConexo);
MinhaConexo.Open();
Apenas definir um objeto OleDbCommand ou SqlCommand no faz com que dados sejam retornados atravs da conexo definida. Quando os dados so retornados, os mesmos so armazenados em um objeto do tipo DataSet. Mas precisamos de uma maneira de ligar o objeto Command com o objeto DataSet, atravs dos seguintes passos: O comando definido na propriedade CommandText, do objeto Command executado. Os dados retornados so ligados a um objeto do tipo DataSet. O objeto que faz esta ligao o DataAdapter.Vamos estudar este objeto em detalhes. O objeto DataAdapter (SqlDataAdapter ou OleDbDataAdapter) trabalha em conjunto com o objeto DataSet. Nos exemplos do prximo tpico veremos a utilizao do objeto DataAdapter e apresentaremos apenas alguns aspectos bsicos do objeto DataSet. No tpico seguinte iremos detalhar o objeto DataSet. Tambm estaremos utilizando alguns elementos bsicos do objeto DataGrid, o qual ser explicado em detalhes no final do Captulo.
www.juliobattisti.com.br
380
Tabela 10.8 Principais propriedades das classes SqlDataAdapter/OleDbDataAdapter. Propriedade DeleteCommand InsertCommand SelectCommand Descrio Utilizada para definir ou retornar um comando SQL para excluso de dados, normalmente um comando DELETE. Utilizada para definir ou retornar um comando SQL para insero de novos dados, normalmente um comando INSERT. Utilizada para definir ou retornar um comando SQL, utilizado para retornar dados, normalmente um comando SELECT. Tambm podemos atribuir, a esta propriedade, um objeto Command previamente criado. Utilizada para definir ou retornar um comando SQL que atualiza dados. Normalmente um comando UPDATE.
UpdateCommand
Na Tabela 10.9 temos uma descrio dos principais mtodos das classes SqlDataAdapter/OleDbDataAdapter:
Tabela 10.9 Principais mtodos das classes SqlDataAdapter/OleDbDataAdapter: Mtodo Fill Descrio Com certeza o mtodo mais utilizado. Este mtodo executa o comando definido na propriedade SelectCommand. Os dados retornados pela execuo do comando definido na propriedade SelectCommand so associados com um objeto do tipo DataSet. Este mtodo retorna uma tabela em branco, isto , com zero registro, porm com a mesma estrutura da tabela original. Na prtica o que este mtodo faz copiar a estrutura de uma tabela. Com ASP.NET trabalhamos com um modelo de dados desconectados, conforme descrito no incio deste captulo. Uma vez retornados os dados em um objeto do tipo DataSet, a conexo com o banco de dados fechada. Alteraes podem ser feitas nos dados desconectados, porm estas alteraes precisam ser enviadas para o banco de dados, quer seja o SQL Server, quer seja um arquivo .mdb do Microsoft Access. O mtodo Update utilizado para enviar estas alteraes para o banco de dados. O mtodo executa os comandos InsertCommand, UpdateCommand e DeleteCommand para cada insero, atualizao ou excluso, feitas nos dados desconectados, de tal forma que estas alteraes sejam enviadas para a fonte de dados original. Em poucas palavras: sincroniza os dados do objeto DataSet com o conjunto de dados originais.
FillSchema Update
381
www.juliobattisti.com.br
Tabela 10.10 Principais eventos das classes SqlDataAdapter/OleDbDataAdapter: Evento FillError RowUpdated RowUpdating Descrio Ocorre quando um erro retornado durante a execuo do mtodo Fill. Ocorre durante uma atualizao, aps o respectivo comando ter sido executado na fonte de dados original. Ocorre durante uma atualizao, antes do respectivo comando ter sido executado na fonte de dados original.
O Objeto DataSet
Os objetos SqlDataAdapter/OleDbDataAdapter, descritos no tpico anterior, so utilizados para executar um comando SQL ou um Stored Procedure, em um banco de dados e retornar um ou mais conjuntos de dados. Precisamos de uma estrutura capaz de receber e manipular os dados retornados; esta estrutura o objeto DataSet. O objeto DataSet derivado da classe DataSet, do namespace System.Data. O objeto DataAdapter executa um comando atravs de uma conexo e retorna os dados para um objeto DataSet. A conexo desfeita, pois o objeto DataSet fornece as funcionalidades necessrias para acessarmos e manipularmos os dados, estando desconectados do servidor. Acessamos e alteramos os dados conforme necessrio e depois as alteraes efetuadas so sincronizadas com o servidor. DataSet , sem dvida, o principal objeto do ADO.NET, assim como o objeto RecordSet o principal objeto do ADO. Um objeto DataSet formado por uma coleo de objetos do tipo DataTable, os quais pertencem coleo Tables. Para representar o relacionamento entre dois objetos do tipo DataTable, utilizamos um objeto do tipo DataRelation. Por exemplo, podemos criar um DataSet que contm duas tabelas: Pedidos e Clientes. A tabela Clientes relaciona-se com a tabela Pedidos, atravs de um relacionamento do tipo um para vrios, ou seja, um cliente pode fazer vrios pedidos. Podemos representar este relacionamento utilizando um objeto do tipo DataRelation. Podemos garantir a integridade dos dados atravs da definio de campos do tipo Chave Primria utilizando o objeto UniqueConstraint; e da definio de Chaves Estrangeiras utilizando o objeto ForeignKeyConstraint. O objeto DataSet l e grava dados e a estrutura dos dados no formato de documentos XML, os quais podem ser enviados pela Internet via protocolo HTTP, o que facilita a troca de informaes com sistemas de outras empresas, sistemas estes tambm habilitados ao XML.
NOTA: Para maiores detalhes sobre o modelo relacional de dados e relacionamentos entre tabelas, consulte o Anexo II. Neste anexo tambm so descritos os conceitos de Chave primria, Chave Estrangeira, normalizao e integridade de dados.
www.juliobattisti.com.br
382
Tabela 10.11 Principais propriedades da classe DataSet. Propriedade DataSetName EnforceConstraints Descrio Utilizada para definir ou retornar o nome do DataSet. Pode ser utilizada para definir ou retornar um valor True ou False. Se o valor desta propriedade for True, as regras de integridade sero observadas em uma operao de atualizao. Por exemplo, se alterarmos o cdigo do cliente em um pedido da tabela pedidos para 01010 e no existir o cliente com o cdigo 01010 na tabela Clientes, a operao no ser realizada. Se o valor da propriedade EnforceConstraints for False, a operao descrita no nosso exemplo ser realizada sem que nenhuma verificao seja feita. Retorna uma coleo com todos os relacionamentos existentes entre as tabelas do DataSet. Retorna uma coleo com todas as tabelas do DataSet.
Relations Tables
Na Tabela 10.12 temos uma descrio dos principais mtodos da classe DataSet:
Tabela 10.12 Principais mtodos da classe DataSet. Mtodo AcceptChanges Descrio Torna definitivas todas as alteraes feitas nas tabelas ou relacionamentos do DataSet, desde que o mesmo foi inicializado ou desde a ltima vez que o mtodo AcceptChanges foi chamado. Remove todos os dados do DataSet, zerando todas as linhas de todas as tabelas. Faz uma cpia idntica do DataSet, inclusive dos seus dados, para um outro objeto do tipo DataSet. Retorna um objeto do tipo DataSet, contendo todas as alteraes que foram feitas desde a inicializao do DataSet original, ou desde a ltima chamada do mtodo AcceptChanges. Retorna um valor do tipo Boleano. True indica que houve alteraes nos dados do DataSet adies, alteraes ou excluses. False indica que no houve alteraes.
HasChanges
Neste momento j somos capazes de estabelecer uma conexo com o banco de dados, definir um objeto DataAdapter para executar um comando atravs da conexo estabelecida e preencher um objeto DataSet com os dados retornados. A prxima etapa exibir os dados obtidos. A exibio dos dados a nica coisa que o usurio v, ao acessar a
383
www.juliobattisti.com.br
IMPORTANTE: Tambm utilizaremos um objeto do tipo DataView que ser detalhado mais adiante.
Vamos conectar com o banco de dados C:\Meus documentos\NorthWind.mdb. Definiremos um comando SQL que retorna os seguintes campos da tabela Clientes: CdigoDoCliente NomeDaEmpresa Cidade Pas Na Listagem 10.4 temos o cdigo para o exemplo proposto.
<html>
// Crio uma conexo com o banco de dados pubs localizado no servidor local. // Vamos acessar a instncia SERVIDOR\NETSDK.
// Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna todos os dados da tabela Clientes.
www.juliobattisti.com.br
384
// Criamos e preenchemos um objeto DataSet. // Observe que no temos mais o objeto Recordset, // como era de praxe com o ASP 3.0.
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher // o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Conectamos um controle DataGrid com o DataSet criado anteriormente. // MinhaGrade o id (nome) de um controle do tipo // DataGrid que est na seo de apresentao da pgina.
</script>
<body>
385
www.juliobattisti.com.br
</body> </html>
Digite o cdigo da Listagem 10.4 e salve o mesmo em um arquivo chamado chap10ex4.aspx, na pasta chap10, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap10ex4.aspx Voc ir obter a pgina indicada na Figura 10.12. Comentrios sobre o cdigo do exemplo Chap10Ex4.aspx. A primeira coisa que fizemos foi importar os namespaces necessrios System.Data e System.Data.OleDb:
<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>
Utilizamos o evento Load da pgina para executar os comandos que estabelecem a conexo com o banco de dados e retornam dados da tabela Clientes Page_Load. Para estabelecer uma conexo com o banco de dados NorthWind.mdb, utilizamos um objeto OleDbCommand. Para maiores detalhes sobre este objeto consulte o tpico respectivo, no incio deste captulo. Uma vez definida a conexo, utilizamos um objeto OleDbDataAdapter, chamado MeuComando, para abrir a conexo e executar um comando SQL que retorna alguns campos da tabela Clientes:
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT CdigoDoCliente, + NomeDaEmpresa,Pas,Cidade FROM Clientes, MinhaConexo);
Conforme descrevemos anteriormente, podemos utilizar uma abordagem diferente: Primeiro criar um objeto OleDbCommand (1 e 2 a seguir), depois declaramos um objeto DataAdapter e passamos o objeto Command para a propriedade SelectCommand do objeto OleDbDataAdapter (3 e 4 a seguir):
1. string TextoDoComando = SELECT CdigoDoCliente, + NomeDaEmpresa,Pas,Cidade FROM Clientes;
2.
www.juliobattisti.com.br
386
O prximo passo declarar um objeto do tipo DataSet, chamado ds, e utilizar o mtodo Fill, do objeto OleDbDataAdapter, para preencher o objeto DataSet com os dados retornados a partir do banco de dados NorthWind:
DataSet ds = new DataSet(); MeuDataAdapter.Fill(ds);
O nome do objeto DataSet passado como parmetro para o mtodo Fill. Na seqncia criamos um objeto do tipo DataView. A principal funo de um objeto DataView permitir a ligao de uma fonte de dados com um controle do tipo Web Form Controls, como o caso do controle DataGrid. Um objeto DataView representa uma viso de uma tabela de um objeto DataSet. A viso representada pelo objeto DataView pode ser utilizada para pesquisar, ordenar, editar e navegar pelos registros da tabela. Na criao do objeto DataView, associamos o mesmo com a primeira tabela do objeto DataSet, o que feito utilizando a coleo Tables do objeto DataSet. Observe que a primeira tabela da coleo possui ndice zero (ds.Tables[0]), a segunda tabela da coleo possui ndice um (ds.Tables[1]), e assim por diante.
DataView source = new DataView(ds.Tables[0]);
Em seguida definimos a propriedade DataSource do controle DataGrid (MinhaGrade), como sendo igual ao objeto DataView recm-criado:
MinhaGrade.DataSource = source ;
387
www.juliobattisti.com.br
Feito isso, o controle DataGrid, colocado na seo de apresentao da pgina, ir exibir os registros retornados, no formato de uma tabela. Observe que no precisamos iniciar um lao While para navegar por cada registro do objeto DataView. Tambm no precisamos utilizar um monte de comandos Response.Write para montar a pgina de sada, como fazamos no ASP 3.0. Todo este trabalho feito, automaticamente, pelo controle DataGrid. Este exemplo salienta bem o poder e flexibilidade dos Web Server Controls, como o caso do controle DataGrid. A ttulo de exemplo, vamos supor que voc deseja exibir apenas os clientes da Alemanha. Para tal, basta alterar o comando SQL, da seguinte maneira:
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT CdigoDoCliente, + NomeDaEmpresa, Cidade, Pas FROM Clientes where Pas=Alemanha, MinhaConexo);
NOTA: Ainda neste captulo estudaremos o objeto DataView e o controle DataGrid, em maiores detalhes.
O Objeto DataView
Para entender a funo do objeto DataView, vamos fazer uma recaptulao dos objetos que j estudamos neste captulo: Utilizamos um objeto OleDbConnection ou SqlConnection para estabelecer uma conexo com o banco de dados.
www.juliobattisti.com.br
388
Tabela 10.13 Principais propriedades da classe DataView. Propriedade AllowDelete Descrio Propriedade do tipo Boleana. Se contiver o valor True, podemos excluir registros; se contiver o valor False, no so permitidas excluses. Esta propriedade pode ser utilizada para definir ou para retornar um valor True ou False. Utilizada para definir ou retornar um valor do tipo Boleano. Se o valor da propriedade for True, so permitidas alteraes nos dados; caso contrrio os dados no podero ser alterados. Utilizada para definir ou retornar um valor do tipo Boleano. Se o valor da propriedade for True, poderemos adicionar novos registros, utilizando o mtodo AddNew; caso contrrio novos registros no podero ser adicionados. Retorna o nmero de registros no DataView.
AllowEdit
AllowNew
Count
389
www.juliobattisti.com.br
Descrio Utilizada para definir ou retornar uma expresso que determina quais os dados do objeto DataView que sero exibidos. Com ADO.NET mantido um histrico das alteraes feitas nos dados. O objeto DataView mantm as verses anteriores de registros que foram alterados ou excludos. Podemos utilizar esta propriedade para retornar ou definir uma expresso que filtra apenas os registros em um determinado estado, como por exemplo: alterados, excludos, etc. Utilizada para definir ou retornar informaes sobre a(s) coluna(s) e a ordem de classificao dos dados. Utilizada para definir ou retornar a tabela a partir da qual o DataView obtm os dados.
Sort Table
Na Tabela 10.14 temos uma descrio dos principais mtodos da classe DataView:
Tabela 10.14 Principais mtodos da classe DataView. Mtodo AddNew Delete Find Descrio Adiciona um novo registro ao DataView. Exclui um registro do DataView. Localiza um determinado registro, com base no valor da chave primria.
Vamos apresentar alguns exemplos de utilizao do objeto DataView. Exemplo 1: Neste exemplo faremos uma conexo com o banco de dados C:\Meus documentos\Northwind.mdb. Vamos retornar os seguintes campos da tabela Funcionrios: CdigoDoFuncionrio Nome Cargo DataDeNascimento Cidade Os dados sero apresentados na pgina, utilizando um controle DataGrid. Tambm apresentaremos um controle ListBox, onde o usurio poder selecionar um campo pelo qual os dados sero ordenados em ordem Crescente. Por padro, os dados so classificados pelo CdigoDoFuncionrio. Na Listagem 10.5 temos o cdigo para o exemplo proposto.
www.juliobattisti.com.br
390
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1 Listagem 10.5 Um exemplo completo com DataView.
<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>
<html>
// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.
// Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna todos os dados da tabela Clientes.
// Criamos e preenchemos um objeto DataSet. // Observe que no temos mais o objeto Recordset, // como era de praxe com o ASP 3.0.
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher // o objeto DataSet, com os dados retornados pelo comando SQL.
391
www.juliobattisti.com.br
// Conectamos um controle DataGrid com o DataSet criado anteriormente. // MinhaGrade o id (nome) de um controle do tipo // DataGrid que est na seo de apresentao da pgina.
// Utilizamos uma instruo Switch para definir a // classificao dos dados com base no valor selecionado // na lista CampoClassificar.
www.juliobattisti.com.br
392
<asp:ListBox id=CampoClassificar Rows=1" Width=200px runat=server> <asp:ListItem>Cargo</asp:ListItem> <asp:ListItem>Cidade</asp:ListItem> <asp:ListItem selected=True>Cdigo do Funcionrio</asp:ListItem> <asp:ListItem>Data de Nascimento</asp:ListItem> <asp:ListItem>Nome</asp:ListItem> </asp:ListBox>
<ASP:DataGrid id=MinhaGrade runat=server Width=700" BackColor=#ccccff BorderColor=black ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Verdana Font-Size=8pt HeaderStyle-BackColor=#aaaadd MaintainState=false />
393
www.juliobattisti.com.br
Digite o cdigo da Listagem 10.5 e salve o mesmo em um arquivo chamado chap10ex5.aspx, na pasta chap10, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap10ex5.aspx Voc ir obter a pgina indicada na Figura 10.15.
www.juliobattisti.com.br
394
395
www.juliobattisti.com.br
Primeiro criamos uma string aux e atribumos a esta string o valor do item selecionado na ListBox CampoClassificar:
string aux = CampoClassificar.SelectedItem.Value;
www.juliobattisti.com.br
396
A propriedade Sort uma String que contm o nome do campo seguido de um espao e da palavra ASC para classificao crescente ou DESC para classificao decrescente. Exemplo 2: Neste exemplo faremos uma conexo com o banco de dados C:\Meus documentos\Northwind.mdb. Vamos retornar os seguintes campos da tabela Pedidos: NmeroDoPedido DataDoPedido CidadeDeDestino PasDeDestino Os dados sero apresentados na pgina, utilizando um controle DataGrid. Tambm apresentaremos dois controles ListBox. O usurio poder classificar os dados por um ou dois campos. Caso deseje classificar apenas por um campo, basta selecionar No classificar, na segunda lista. Por padro os dados so classificados apenas pelo NmeroDoPedido. Tambm apresentaremos dois controles do tipo RadioButton, onde o usurio pode selecionar classificao Crescente ou Decrescente. Na Listagem 10.6 temos o cdigo para o exemplo proposto.
IMPORTANTE: Para maiores informaes sobre a instruo switch/ case e sobre as demais instrues de controle de fluxo do C#, consulte o Captulo 3.
Listagem 10.6 Um exemplo completo com DataView e o mtodo Sort com dois campos.
<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>
<html>
// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.
397
www.juliobattisti.com.br
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo); // Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna todos os dados da tabela Clientes.
// Criamos e preenchemos um objeto DataSet. // Observe que no temos mais o objeto Recordset, // como era de praxe com o ASP 3.0.
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher // o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Conectamos um controle DataGrid com o DataSet criado anteriormente. // MinhaGrade o id (nome) de um controle do tipo // DataGrid que est na seo de apresentao da pgina.
// Crio uma varivel string chamada aux. // // // // Na varivel aux vamos concatenando os valores Selecionados nas listas CampoClassificar1 e CampoClassificar2, alm das opes ASC ou DESC, dependendo da escolha do usurio.
www.juliobattisti.com.br
398
source.Sort = aux;
</script>
<body>
399
www.juliobattisti.com.br
<BR> <BR>
<table>
<tr> <td>
<td>
<tr> <td> <asp:ListBox id=CampoClassificar1" Rows=1" Width=200px runat=server> <asp:ListItem>CidadeDeDestino</asp:ListItem> <asp:ListItem>DataDoPedido</asp:ListItem> <asp:ListItem selected=True>NmeroDoPedido</asp:ListItem> <asp:ListItem>PasDeDestino</asp:ListItem> </asp:ListBox>
www.juliobattisti.com.br
400
<td> <asp:ListBox id=CampoClassificar2" Rows=1" Width=200px runat=server> <asp:ListItem>CidadeDeDestino</asp:ListItem> <asp:ListItem selected=True>DataDoPedido</asp:ListItem> <asp:ListItem>NmeroDoPedido</asp:ListItem> <asp:ListItem>PasDeDestino</asp:ListItem> </asp:ListBox> </td>
<td>
</td>
</tr>
401
www.juliobattisti.com.br
<asp:DataGrid id=MinhaGrade runat=server Width=700" BackColor=#ccccff BorderColor=black ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Verdana Font-Size=8pt HeaderStyle-BackColor=#aaaadd MaintainState=false />
<BR>
</form>
</body> </html>
Digite o cdigo da Listagem 10.6 e salve o mesmo em um arquivo chamado chap10ex6.aspx, na pasta chap10, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap10ex6.aspx Voc ir obter a pgina indicada na Figura 10.17. Observe que a listagem est classificada primeiro em ordem crescente do NmeroDoPedido, em seguida em ordem Crescente da DataDoPedido. Vamos testar o nosso exemplo. Na primeira lista selecione PasDeDestino e na segunda lista selecione CidadeDeDestino. Para ordem de classificao clique na opo Decrescente. D um clique no boto Classificar. Voc obter uma listagem classificada pelo nome de Pedidos. Parte do resultado est indicado na Figura 10.18.
www.juliobattisti.com.br
402
Figura 10.17: Relao de pedidos opo para classificar por dois campos diferentes.
Comentrios sobre o cdigo do exemplo Chap10Ex6.aspx. Utilizamos uma tabela para fazer o alinhamento dos controles, no incio da pgina. Para fazer um controle mais refinado do alinhamento, utilizamos o caracter   non break space. Este um caracter especial do HTML utilizado para espao em branco.
Figura 10.18: Relao de Pedidos classificada por Pas e dentro do pas por Cidade.
403
www.juliobattisti.com.br
source.Sort = aux;
www.juliobattisti.com.br
404
Este valor passado para a propriedade Sort para que a classificao seja feita de acordo com os critrios selecionados pelo usurio. Os demais elementos do exemplo Chap10ex6.aspx j foram vistos e explicados em exemplos anteriores. Para maiores detalhes sobre os mesmos consulte os exemplos destes e dos demais captulos. Novamente utilizamos o evento Load da pgina Page_Load, para executar a conexo com o banco de dados, retornar os dados, definir a string aux e ordenar os dados de acordo com os critrios estabelecidos pelo usurio. Exerccio: Vou propor um exerccio para o amigo leitor. Caso voc tenha alguma dificuldade para resolv-lo, s entrar em contato atravs do e-mail: batisti@hotmail.com ou batisti@juliobattisti.com.br. Na pgina Chap10ex6.aspx podemos definir somente um critrio de classificao para os campos selecionados nas duas listas, ou seja, somente Crescente ou somente Decrescente. O exerccio que fica para o leitor tornar o nosso exemplo um pouco mais flexvel, de tal maneira que possamos escolher uma ordem de classificao independente para cada campo. Explico um pouco melhor: Selecionar classificao Crescente para o campo PasDeDestino e, dentro de um mesmo pas, classificao Decrescente por CidadeDeDestino. Fica o desafio. Em caso de dvida s entrar em contato.
405
www.juliobattisti.com.br
Inserindo a definio para essas propriedades, a tag que define o controle DataGrid ficaria da seguinte maneira:
<ASP:DataGrid id=MeuDataGrid runat=server Width=600" BackColor=#bbccff AllowPaging=True PageSize=20 PagerStyle-NextPageText=Prxima pgina >> PagerStyle-PrevPageText=<< Pgina anterior BorderColor=black ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Verdana Font-Size=8pt HeaderStyle-BackColor=#aaaadd MaintainState=false />
www.juliobattisti.com.br
406
<html>
IMPORTANTE: Para que a paginao seja feita, alm de definir a propriedade AllowPaging como True, temos que criar cdigo para trocar de pgina. O mtodo que faz a troca de pgina definido na propriedade OnPageIndexChanged do DataGrid. Aprenderemos a implementar a paginao no Captulo 11, onde veremos mais detalhes sobre o controle DataGrid.
// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo); // Para podermos acessar mltiplas tabelas vamos criar // um objeto Command, conforme indicado a seguir:
407
www.juliobattisti.com.br
// Definimos o comando a ser utilizado pelo objeto DataAdapter. // Para isso definimos a sua propriedade SelectCommand.
MeuDataAdapter.SelectCommand = MeuComando;
// Criamos e preenchemos um objeto DataSet. // Vamos preencher o DataSet com dados das tabelas // Funcionrios e Transportadores. // Para isso precisamos executar dois comandos SQL. // ************************************************ // Na prtica vamos chamar o mtodo Fill do DataAdapter // duas vezes. // Antes de cada chamada alteramos a propriedade // CommandText do objeto Command.
MeuDataAdapter.Fill(ds,Funcionrios);
// Altero a propriedade CommandText para retornar dados // da tabela Transportadores. // Chamo novamente o mtodo Fill.
www.juliobattisti.com.br
408
</script>
<body>
<ASP:DataGrid id=GradeFuncionrios runat=server Width=450" BackColor=#bbccff BorderColor=blue ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Verdana Font-Size=8pt
409
www.juliobattisti.com.br
<BR> <HR>
<ASP:DataGrid id=GradeTransportadoras runat=server Width=400" BackColor=#bbddff BorderColor=blue ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Verdana Font-Size=8pt HeaderStyle-BackColor=#aaaadd HeaderStyle-Font-Bold=True MaintainState=false />
<HR>
</body> </html>
Digite o cdigo da Listagem 10.7 e salve o mesmo em um arquivo chamado chap10ex7.aspx, na pasta chap10, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap10ex7.aspx Voc ir obter a pgina indicada na Figura 10.20.
www.juliobattisti.com.br
410
3.
A partir deste ponto temos algumas mudanas em relao aos exemplos anteriores. Primeiro vamos criar um objeto OleDbCommand e definir as propriedades Connecion e CommandType do objeto OleDbCommand:
OleDbCommand MeuComando = new OleDbCommand();
411
www.juliobattisti.com.br
5.
Declaramos um objeto ds do tipo DataSet. O objeto DataSet ser o Conteiner para as tabelas Funcionrios e Transportadores. Recapitulando o que estudamos anteriormente, o objeto DataSet pode conter uma ou mais tabelas, as quais esto contidas na coleo Tables do objeto.
DataSet ds = new DataSet();
6.
Chegamos ao ponto principal do nosso exemplo. Utilizamos a seguinte tcnica: definimos a propriedade CommandText do objeto MeuComando. Esta propriedade contm a string SQL que acessa dados de uma determinada tabela:
MeuComando.CommandText=Select CdigoDoFuncionrio,Nome,Sobrenome,Cargo From Funcionrios;
Em seguida chamamos o mtodo Fill do objeto DataAdapter. Ao chamarmos este mtodo, o comando definido na propriedade CommandText executado e os dados retornados so passados para o DataSet definido no primeiro parmetro. O segundo parmetro o nome do conjunto de dados no DataSet. No nosso exemplo utilizamos o mesmo nome da tabela, no banco de dados NorthWind, porm isso no obrigatrio:
MeuDataAdapter.Fill(ds,Funcionrios);
Repetimos os mesmos passos para retornar dados da tabela Transportadoras e coloc-los no DataSet ds:
MeuComando.CommandText = Select * From Transportadoras; MeuDataAdapter.Fill(ds,Transportadoras);
Aps a execuo destes comandos, a coleo Tables, do DataSet ds, contm duas tabelas com dados retornados a partir do Banco de dados NorthWind.mdb. 7. O prximo passo exibir os dados do objeto DataSet na pgina ASP.NET. Isto feito utilizando um objeto do tipo DataView para cada tabela a ser exibida. Ao criarmos o objeto DataView, j passamos como parmetro a tabela associada ao objeto. Em seguida definimos a propriedade DataSource do controle DataGrid como sendo igual ao objeto DataView recm-criado. O passo final chamar o mtodo DataBind do controle DataGrid:
DataView Funcionrios = new DataView(ds.Tables[0]); GradeFuncionrios.DataSource = Funcionrios ; GradeFuncionrios.DataBind();
Para cada tabela do DataSet criamos um objeto DataView. Para o DataView Funcionrios, passamos como parmetro: ds.Tables[0], ou seja, a primeira tabela, da coleo de tabelas do DataSet ds. Para o DataView Transportadoras, passamos como parmetro ds.Tables[1], ou seja, a segunda tabela, da coleo de tabelas do DataSet ds. Depois s ligar cada DataView com o respectivo DataGrid.
www.juliobattisti.com.br
412
Concluso
Neste captulo aprendemos a conectar pginas ASP.NET com bancos de dados. Utilizamos classes, basicamente, dos seguintes namespaces: System.Data System.Data.OleDb System.Data.SqlClient Estudamos, em detalhes, diversas classes destes namespaces: SqlConnection/OleDbConnection SqlCommand/OleDbCommand SqlDataAdapter/OleDbDataAdapter DataSet DataView Tambm estudamos algumas caractersticas do poderoso controle: DataGrid. Nos prximos captulos estudaremos mais sobre estas classes e sobre controles que podem ser conectados com dados.
413
www.juliobattisti.com.br
Introduo
No Captulo 10 aprendemos a conectar pginas ASP.NET com bancos de dados. Trabalhamos com classes dos namespaces System.Data, System.Data.SqlClient e System.Data.OleDb. Para exibir os dados em um pgina ASP.NET utilizamos, basicamente, o controle DataGrid. Existem diversos Web Server Controls que podem exibir dados a partir de um objeto DataView ou DataReader (ser visto neste captulo). Iniciaremos este captulo estudando os seguintes Web Server Controls: CheckBoxList DropDownList RadioButtonList Estes controles tambm so conhecidos como: Data-bound list controls. Todos possuem uma propriedade DataSource, que define a fonte de dados para o controle. Em seguida estudaremos um pouco mais sobre o controle DataGrid. No Captulo 10 aprendemos a utilizar o controle DataGrid para efetuar as seguintes aes: Exibir dados em uma pgina. Ordenar dados. Fazer paginao. Neste captulo aprenderemos a utilizar o controle DataGrid para efetuar as seguintes operaes: Filtrar dados. Criar as colunas do DataGrid manualmente. Veremos que com poucas linhas de cdigo somos capazes de realizar operaes que, com o ASP 3.0, demandam uma boa quantidade de codificao. Uma das grandes vantagens do ASP.NET a disponibilidade de um conjunto de controles mais poderoso e flexvel. Para que possamos usufruir destas vantagens importante que saibamos utilizar estes controles. Com o estudo feito neste captulo, mais o que foi visto nos Captulos 7, 8, 9 e 10, o leitor ter um amplo entendimento dos novos controles do ASP.NET. Porm o assunto bastante extenso; so centenas de mtodos e propriedades. A melhor fonte de informaes para voc aprofundar seus estudos a documentao do Framework .NET. Antes de iniciarmos o estudo dos Data-bound controls, iremos apresentar o conceito de Data Binding, e veremos alguns conceitos que se aplicam a todo
CAPTULO
11
Acessando Bancos de Dados com ASP.NET Parte 2
www.juliobattisti.com.br
414
IMPORTANTE: Os controles que utilizaremos neste captulo fazem parte dos chamados Web Server Controls. Na prtica isso significa que estes controles so processados no servidor e no no Cliente. Esta uma grande vantagem, pois as operaes de Data Binding iro funcionar corretamente, independente do navegador que estiver sendo utilizado. Antes do Framework .NET, utilizvamos algumas tcnicas de Data Binding no cliente. O problema desta abordagem que estas tcnicas so dependentes do navegador que est sendo utilizado. Por exemplo, algumas tcnicas de Data Binding utilizando DHTML que funcionam no Internet Explorer podem no funcionar (e provavelmente no funcionaro) no Netscape e vice-versa.
415
www.juliobattisti.com.br
<BODY>
<%
O Primeiro passo criar a conexo com o Banco de dados. Para isto crio um objeto do tipo Connection. Cria um Objeto do Tipo ADODB.Connection
Set conn=Server.CreateObject(ADODB.Connection)
Agora abro uma conexo com o arquivo nwind.mdb utilizando OLE DB.
conn.Open
Agora criamos um Objeto RecordSet. Este Objeto ir acessar o campo PasDeDestino da tabela Pedidos.
Paises.Open Select PasDeDestino from Pedidos Group By PasDeDestino Order By PasDeDestino, conn, 3, 3
Neste ponto tenho o objeto Paises ligado com a tabela Pedidos do banco de dados NorthWind.mdb
%>
www.juliobattisti.com.br
416
<%
Agora construo a lista de opes a partir dos dados obtidos da tabela Pedidos. Para cada produto obtido, crio uma nova opo na lista.
O prximo comando deve estar todo em uma nica linha. Response.Write <OPTION value= & Chr(34) & Paises.Fields(PasDeDestino) & Chr(34) & > & Paises.Fields(PasDeDestino)& </OPTION>
Paises.MoveNext Loop
%>
</FORM>
</BODY> </HTML>
Digite o cdigo da Listagem 11.1 e salve o mesmo em um arquivo chamado chap11ex1.asp, na pasta chap11, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. importante que a extenso seja .asp e no .aspx, pois trata-se de uma pgina com cdigo ASP 3.0 e no ASP.NET. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex1.asp
417
www.juliobattisti.com.br
<html>
www.juliobattisti.com.br
418
// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.
// Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna todos os dados da tabela Clientes.
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT PasDeDestino + FROM Pedidos Group By PasDeDestino Order By PasDeDestino, MinhaConexo);
// Criamos e preenchemos um objeto DataSet. // Observe que no temos mais o objeto Recordset, // como era de praxe com o ASP 3.0.
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher // o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Conectamos um controle DropDownList com o DataSet criado anteriormente. // MinhaLista o id (nome) de um controle do tipo // DropDownList que est na seo de apresentao da pgina.
419
www.juliobattisti.com.br
</script>
<body>
<form runat=server>
</asp:DropDownList>
<BR> <BR>
</form>
</body> </html>
Digite o cdigo da Listagem 11.2 e salve o mesmo em um arquivo chamado chap11ex2.aspx, na pasta chap11, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex2.aspx Ao carregar a pgina voc obtm o resultado indicado na Figura 11.2.
www.juliobattisti.com.br
420
Na seo de apresentao basta criar o controle MinhaLista e definir a sua propriedade DataTextField como sendo igual ao nome do campo a ser exibido na lista:
<asp:DropDownList id=MinhaLista runat=server DataTextField=PasDeDestino > </asp:DropDownList>
Rpido, simples, intuitivo e sem a necessidade de criar um lao para percorrer todos os registros do DataView. Este pequeno exemplo ilustra o quanto pode ser melhorada a produtividade do programador com a utilizao dos controles avanados do ASP.NET. Agora que j vimos um exemplo em ao, vamos estudar um pouco mais detalhadamente os conceitos de DataBinding, para depois estudarmos os demais controles Data-bound controls.
421
www.juliobattisti.com.br
Onde a fonte de dados pode ser de trs tipos diferentes: O nome de uma propriedade: <%# nome de propriedade %> Uma chamada de mtodo: <%# mtodo(param1,param2,..., paramn) %> Uma expresso: <%# expresso %> Qualquer uma das situaes acima descritas deve retornar um nico valor, o qual ligado a uma propriedade do controle. Vamos a um exemplo simples. Criaremos uma pgina ASP.NET com dois controles. Um do tipo TextBox e outro do tipo Label. O Texto contido no controle Label ser definido pelo valor digitado no controle TextBox. O valor padro inicial do controle TextBox : Valor Inicial. Vamos ao exemplo, depois s explicaes. Na Listagem 11.3 temos o cdigo para o exemplo proposto.
www.juliobattisti.com.br
422
<BR> <HR>
Digite o cdigo da Listagem 11.3 e salve o mesmo em um arquivo chamado chap11ex3.aspx, na pasta chap11, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex3.aspx Observe que o rtulo vem preenchido com o valor inicial da caixa de texto: Valor Inicial. Clique na caixa de texto e digite: Novo Valor e pressione Enter. Observe que o rtulo alterado para refletir o valor digitado na caixa de texto, conforme indicado na Figura 11.3. A ligao do valor do rtulo, com a propriedade Text, da caixa de texto feita com o seguinte cdigo:
<asp:Label id=RotuloTexto Text=<%# CaixaTexto.Text %> runat=server />
423
www.juliobattisti.com.br
Podemos fazer esta ligao para qualquer propriedade, desde que o valor retornado seja compatvel com o tipo esperado pela propriedade. Tambm de fundamental importncia observar a chamada do mtodo DataBind do objeto Page, o qual feito no evento Load da Pgina:
void { Page.DataBind(); } Page_Load(Object Src, EventArgs E )
Sem esta chamada, a ligao no seria feita. O mtodo DataBind, da classe Page, faz a ligao para a pgina ASP.NET e para todos os controles contidos na pgina. No nosso exemplo, o efeito prtico o mesmo que se tivssemos chamado o mtodo DataBind, do controle RotuloTexto RotuloTexto.DataBind( ). Ao invs da propriedade de um controle, poderamos fazer a ligao com uma propriedade da pgina. Por exemplo, se quisermos que o controle RotuloTexto exiba o valor da propriedade EnableViewState da pgina, podemos fazer a seguinte ligao:
<asp:Label
www.juliobattisti.com.br
424
O Controle CheckBoxList
Este controle permite que sejam exibidos diversos checkbox, com base em dados retornados por um objeto DataView, um objeto DataReader, um objeto DataSet, um ArrayList ou uma coleo. Por exemplo, se fizermos o controle baseado em um DataView que retorna o nome de 10 produtos, sero criados 10 CheckBox, uma com o nome de cada produto. Para dar um melhor alinhamento aos checkbox que so construdos dinamicamente, o controle CheckBoxList utiliza uma tabela. Podemos controlar a aparncia desta tabela, utilizando algumas propriedades do controle CheckBoxList. Sintaxe para o controle CheckBoxList:
<asp:CheckBoxList id=identificao_no_cdigo AutoPostBack=True|False CellPadding=Distncia entre as bordas e o contedo das clulas. DataSource=<% Fonte dos dados, normalmente definida no cdigo da pgina. DataTextField=Campo ou coluna a partir do qual obtido o texto de cada CheckBox DataValueField=Campo ou coluna a partir do qual obtido o valor de cada CheckBox RepeatColumns=Define o nmero controles por linha RepeatDirection=Vertical|Horizontal RepeatLayout=Flow|Table %>
425
www.juliobattisti.com.br
</asp:CheckBoxList>
O controle CheckBoxList possui uma coleo chamada Items. Esta coleo contm os elementos individuais do controle, os quais podem ser acessados atravs de cdigo de programao. Para determinar quais itens foram selecionados, podemos fazer um loop atravs dos elementos da coleo Items. O valor padro da propriedade RepeatLayot Table, o que faz com que os diversos Check Box sejam arranjados na forma de uma tabela. Exemplo: Vamos utilizar um controle CheckBoxList que exibe todas as cidades do Brasil, para as quais j foram enviados Pedidos. Obteremos esta informao a partir da tabela Pedidos, do banco de dados NorthWind.mdb. Utilizaremos o layout no formato de uma tabela, para o controle CheckBoxList. Tambm utilizamos algumas propriedades herdadas da classe CheckBoxList Class. Na Listagem 11.4 temos o cdigo para o exemplo proposto.
NOTA: Existem diversas outras propriedades para este controle. Para maiores informaes consulte a classe CheckBoxList Class, do namespace System.Web.UI.WebControls.
<html>
www.juliobattisti.com.br
426
// Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna todos os dados da tabela Clientes.
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT CidadeDeDestino + FROM Pedidos Group By CidadeDeDestino,PasDeDestino HAVING PasDeDestino=Brasil + Order By CidadeDeDestino, MinhaConexo);
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher // o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Criamos um objeto DataView ligado com a primeira // tabela, da coleo de tabelas, do objeto ds.
// Para podermos comparar os resultados, vou utilizar um controle // DropDownList e um controle CheckBoxList. // *************************************************** // Ligo o objeto DataView a um controle do tipo // DropDownList.
MinhaLista.DataSource = source ;
427
www.juliobattisti.com.br
</script>
<body>
<form runat=server>
</asp:DropDownList>
www.juliobattisti.com.br
428
</asp:CheckBoxList>
</form>
</body> </html>
Digite o cdigo da Listagem 11.4 e salve o mesmo em um arquivo chamado chap11ex4.aspx, na pasta chap11, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex4.aspx
429
www.juliobattisti.com.br
Sem dvidas, o ASP.NET uma evoluo em relao ao ASP 3.0, mas o bom e velho SQL est sempre presente e necessrio. Precisamos conhecer os comandos bsicos e avanados da linguagem SQL. Um detalhe importante que existem pequenas diferenas em relao aos comandos SQL para o Microsoft Access e para o SQL Server. No Anexo III veremos mais detalhes sobre a linguagem SQL e as diferenas entre o SQL para o Microsoft Access e para o SQL Server. Na seo de cdigo definimos a propriedade DataSource do controle MeusCheckBox e chamamos o mtodo DataBind do mesmo:
MeusCheckBox.DataSource = source; MeusCheckBox.DataBind();
Este procedimento o mesmo que utilizamos para o controle DropDownList. Na seo de apresentao da pgina utilizamos um controle CheckBoxList, onde fizemos uso de diversas propriedades deste controle. DataTextField=CidadeDeDestino: Define o nome do campo do DataView, que fornecer o texto para cada CheckBox. DataValueField=CidadeDeDestino: Define o nome do campo do DataView, que fornecer o valor relacionado com cada CheckBox, quando este for selecionado. RepeatColumns=2": Estamos utilizando um Layout de Tabela (RepeatLayout=Table). Esta opo define o nmero de colunas. Em seguida definimos negrito para a fonte (Font-Bold=True), definimos a cor de segundo plano das clulas como cinza (BackColor=#c0c0c0"), o tamanho da borda em 2 pixels (BorderWidth=2") e a cor da borda azul (BorderColor=Blue). Como detectar as opes que foram selecionadas em um controle CheckBoxList? Para determinar as opes que foram selecionados em um controle CheckBoxList, podemos percorrer a coleo Items do controle e testar se determinado item foi selecionado. Por exemplo, se tivermos um controle chamado OpcoesDeCartao e quisermos determinar se o primeiro elemento foi selecionado, podemos fazer o seguinte teste:
www.juliobattisti.com.br
430
Exemplo: Vamos criar um exemplo, onde temos um controle CheckBoxList, onde as opes foram criadas de uma maneira esttica. Cada vez que o usurio clica em uma opo disparado o evento OnSelectedIndexChanged. Criaremos cdigo para este evento, para atualizar o controle que exibe as opes selecionadas. Na Listagem 11.5 temos o cdigo para o exemplo proposto.
</head> <body>
</script>
431
www.juliobattisti.com.br
<asp:CheckBoxList id=MinhasOpcoes runat=server AutoPostBack=True CellPadding=5" CellSpacing=5" RepeatColumns=2" RepeatDirection=Vertical RepeatLayout=Flow TextAlign=Right OnSelectedIndexChanged=Verifica_Selecionados>
<asp:ListItem>Item 1</asp:ListItem> <asp:ListItem>Item 2</asp:ListItem> <asp:ListItem>Item 3</asp:ListItem> <asp:ListItem>Item 4</asp:ListItem> <asp:ListItem>Item 5</asp:ListItem> <asp:ListItem>Item 6</asp:ListItem>
</asp:CheckBoxList>
<br><br>
</form>
</body> </html>
Digite o cdigo da Listagem 11.5 e salve o mesmo em um arquivo chamado chap11ex5.aspx, na pasta chap11, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
www.juliobattisti.com.br
432
concatenamos o valor desta opo propriedade Text do label Mensagem, mais uma tag <BR> para uma quebra de linha. A tag <BR> faz com que cada opo selecionada seja exibida em uma linha diferente. No final do lao for, o Label Mensagem exibe as opes selecionadas, uma em cada linha. Este exatamente o resultado desejado.
433
www.juliobattisti.com.br
O Controle DropDownList
Utilizamos este controle nos exemplos Chap11ex2.aspx e Chap11ex4.aspx. O controle DropDownList utilizado para a criao de uma lista de opes. A lista pode ser definida de uma maneira esttica, utilizando uma srie de controles ListItem ou pode ser associada a uma fonte de dados (Data Binding). Ao associarmos o controle DropDownList a uma fonte de dados, as opes da lista sero criadas, automaticamente, a partir dos dados retornados por um objeto DataView ou DataReader. A sintaxe para o controle DropDownList:
<asp:DropDownList id=identificao_no_cdigo runat=server DataSource=<% fonte de dados %> DataTextField=Campo da fonte de dados com os rtulos para os itens da lista. DataValueField=Campo da fonte de dados com os valores para os itens da lista. AutoPostBack=True|False OnSelectedIndexChanged=Mtodo que executa quando um elemento da lista selecionado> <asp:ListItem value=valor do item da lista. selected=True|False> Texto do item da lista. </asp:ListItem>
</asp:DropDownList>
O controle DropDownList derivado da classe DropDownList, do namespace System.Web.UI.Controls. Esta classe possui uma srie de propriedades que permitem a definio dos aspectos visuais do controle. Na Tabela 11.1, temos a definio das principais propriedades para o controle DropDownList.
Tabela 11.1 Principais propriedades do controle DropDownList. Propriedade BackColor BorderColor BorderWidth DataSource DataTextField Font AccessKey Descrio Utilizada para definir ou retornar a cor de segundo plano do controle. Utilizada para definir ou retornar a cor de borda do controle. Utilizada para definir ou retornar o tamanho, em pixels, das bordas do controle. Define a fonte de dados a partir da qual so gerados os itens do controle. Define o campo da fonte de dados, que define o texto que ser exibido para cada item. Define ou retorna informaes sobre as caractersticas da fonte do controle. Define um atalho de teclado para colocar o foco no controle.
www.juliobattisti.com.br
434
Com estas alteraes a aparncia do controle fica conforme indicado na Figura 11.6.
O Controle RadioButtonList
Com este controle podemos criar um grupo de Radio Buttons, dinamicamente, a partir de uma fonte de dados. Por exemplo, podemos gerar um grupo com um Radio Button para cada cidade da Alemanha, para a qual temos pedidos na tabela Pedidos. Somente um RadioButton do controle pode estar selecionado ao mesmo tempo. O comportamento o mesmo do controle RadioButton, com a diferena de que o controle RadioButtonList suporta Data Binding para a gerao dinmica dos seus itens, a partir de uma fonte de dados.
435
www.juliobattisti.com.br
</asp:RadioButtonList>
O controle CheckBoxList possui uma coleo chamada Items. Esta coleo contm os elementos individuais do controle, os quais podem ser acessados atravs de cdigo de programao. Para determinar quais items foram selecionados, podemos fazer um loop atravs dos elementos da coleo Items. O valor padro da propriedade RepeatLayot Table, o que faz com que os diversos Check Box sejam arranjados na forma de uma tabela. Utilizamos a propriedade RepeatColumns para definir o nmero de controles por linha da tabela. Exemplo: Vamos utilizar um controle RadioButtonList que exibe todas as cidades da Alemanha, para as quais j foram enviados Pedidos. Obteremos esta informao a partir da tabela Pedidos, do banco de dados NorthWind.mdb. Utilizaremos o layout no formato de uma tabela com trs colunas, para o controle RadioButtonList. Tambm utilizamos algumas propriedades herdadas da classe RadioButtonList Class. Na Listagem 11.6 temos o cdigo para o exemplo proposto.
NOTA: Existem diversas outras propriedades para este controle. Para maiores informaes consulte a classe RadioButtonList Class, do namespace System.Web.UI.WebControls.
www.juliobattisti.com.br
436
<html>
// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.
// Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna as cidades da Alemanha. // Para maiores informaes sobre a linguagem SQL, consulte o Anexo III.
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT CidadeDeDestino + FROM Pedidos Group By CidadeDeDestino,PasDeDestino HAVING PasDeDestino=Alemanha + Order By CidadeDeDestino, MinhaConexo);
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher // o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Criamos um objeto DataView ligado com a primeira // tabela, da coleo de tabelas, do objeto ds.
437
www.juliobattisti.com.br
</script>
<body>
<form runat=server>
<HR>
<asp:RadioButtonList id=MeusBotoes CellPadding=2" DataTextField=CidadeDeDestino DataValueField=CidadeDeDestino RepeatColumns=3" RepeatDirection=Vertical RepeatLayout=Table TextAlign=Right BackColor=#c0c000" BorderWidth=2" Font-Bold=True BorderColor=Blue runat=server >
</asp:RadioButtonList>
www.juliobattisti.com.br
438
</body> </html>
Digite o cdigo da Listagem 11.6 e salve o mesmo em um arquivo chamado chap11ex6.aspx, na pasta chap11, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex6.aspx Voc obtm o resultado indicado na Figura 11.7.
439
www.juliobattisti.com.br
<html>
NOTA: Para a criao deste exemplo, utilizaremos algumas tcnicas avanadas. Todas as tcnicas utilizadas sero descritas aps o cdigo do exemplo.
// Declaro uma varivel do tipo String. // Esta varivel contm o nome da coluna pela qual // faremos a ordenao. // da pgina.
String OrdenaPor;
www.juliobattisti.com.br
440
if (Page.IsPostBack) { // No faz nada. } else // Define, por padro, a ordenao por NmeroDoPedido. { OrdenaPor = NmeroDoPedido; }
BuscaDados();
// Rotina que faz a conexo com o banco de dados Northwind.mdb. // Ordena os dados de acordo com o campo definido na varivel OrdenaPor.
void BuscaDados() {
// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.
441
www.juliobattisti.com.br
// Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna os pedidos para o Brasil.
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT NmeroDoPedido,EndereoDoDestinatrio, + Frete,CidadeDeDestino,PasDeDestino FROM Pedidos WHERE PasDeDestino=Brasil + Order By NmeroDoPedido, MinhaConexo);
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher // o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Criamos um objeto DataView ligado com a primeira // tabela, da coleo de tabelas, do objeto ds.
// Defino a propriedade Sort, do objeto source, como sendo // igual ao valor da String OrdenaPor.
source.Sort=OrdenaPor;
www.juliobattisti.com.br
442
// Defino o valor da String OrdenPor, com base na propriedade // SortExpression, do argumento e, o qual do tipo // DataGridSortCommandEventArgs, passado como parmetro.
OrdenaPor = e.SortExpression.ToString();
// Chamo a rotina que faz a conexo para reordenar os dados, // com base no novo valor da String OrdenaPor.
BuscaDados();
</script>
<body>
<form runat=server>
<H4> Clique no ttulo da coluna para ordenar pelo campo respectivo.</H4> <HR>
443
www.juliobattisti.com.br
</form>
</body> </html>
Digite o cdigo da Listagem 11.7 e salve o mesmo em um arquivo chamado chap11ex7aspx, na pasta chap11, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex7aspx Voc obtm uma pgina com todos os pedidos para o Brasil. Observe que o ttulo das colunas um link. Clique no ttulo da coluna CidadeDeDestino. Observe que os dados so classificados, em ordem Crescente, pela coluna CidadeDeDestino, conforme indicado na Figura 11.8. Agora d um clique no cabealho da Coluna Frete e observe que os dados so classificados, em ordem crescente do valor do frete. Comentrios sobre o cdigo do exemplo: A primeira grande diferena que voc deve ter notado em relao aos exemplos anteriores a utilizao de diversas rotinas: 1. 2. 3. Page_Load Busca_Dados OrdenaDados
Uma pgina ASP.NET uma instncia da classe Page. Ns vimos nos Captulos 3, 4 e 5 que um Classe em C# pode ser composta de diversos procedimentos. Neste exemplo estamos criando trs procedimentos. No existe a definio explcita da classe, atravs da palavra Class. Esta a nica diferena em relao aos exemplos dos Captulos 3, 4 e 5. Tambm criamos uma varivel do tipo String chamada OrdenaPor. Como esta varivel foi declarada fora de qualquer procedimento, a mesma pode ser acessada em qualquer local da seo de cdigo da pgina, ou seja, a varivel OrdenaPor tem escopo de pgina:
String OrdenaPor;
www.juliobattisti.com.br
444
Vamos entender o procedimento Page_Load: Este evento, conforme j descrito anteriormente, executado toda vez que a pgina for carregada. Quando a pgina for carregada pela primeira vez, a propriedade Page.IsPostBack igual a False e, neste caso, a varivel OrdenaPor definida como sendo igual a NmeroDoPedido. Fora da estrutura if/else, chamado o procedimento BuscaDados( ), ou seja, este procedimento ser chamado sempre que a pgina for carregada, independente de ser um PostBack ou no. Vamos entender o procedimento BuscaDados( ): Grande parte do cdigo deste procedimento j de nosso conhecimento. So comandos para conectar com o banco de dados NorthWind.mdb, executar um comando SQL e retornar os dados em um objeto DataSet, a partir do qual criamos um objeto DataView. O nico detalhe adicional que temos neste procedimento a definio da propriedade Sort, do objeto source, que um objeto do tipo DataView:
source.Sort=OrdenaPor;
445
www.juliobattisti.com.br
retorna CidadeDeDestino, uma vez que o usurio clicou no link da coluna CidadeDeDestino. Com isso conseguimos detectar qual o link clicado e, conseqentemente, por qual campo devemos ordenar. Uma vez definido o valor da String OrdenaPor, chamamos o mtodo BuscaDados( ), o qual retornar os dados e ir orden-los com base no valor definido na String OrdenaPor. Em resumo, o procedimento OrdenaDados faz o seguinte: define o valor da String OrdenaPor e chama o procedimento BuscaDados. importante salientar que a possibilidade de criar diferentes procedimentos e a possibilidade de chamarmos um procedimento, dentro do outro, nos d uma flexibilidade muito grande. Alm disso, ao dividirmos o cdigo de nossas pginas ASP.NET em procedimentos, podemos organiz-lo de uma maneira mais intuitiva, o que torna fcil a compreenso e, principalmente, a manuteno do mesmo. Observe que, conhecendo os elementos (eventos, argumentos, etc.) corretos, com poucas linhas de cdigo possvel criar funcionalidades que, com ASP 3.0, exigem uma grande quantidade de cdigo. Mais uma vez conseguimos comprovar o quo mais produtivo, do ponto de vista do desenvolvedor, o ASP.NET em relao s verses anteriores.
NOTA: Para maiores informaes sobre a classe DataGridSortCommandEventArgs, consulte a documentao do Framework .NET. Esta classe faz parte do namespace System.Web.UI.WebControls.
A expresso a mesma que utilizaramos em um clusula WHERE da linguagem SQL. Podemos utilizar todos os operadores, funes e critrios vlidos como critrios de filtragem.
www.juliobattisti.com.br
446
NOTA: Para maiores detalhes sobre a linguagem SQL, consulte o Anexo III.
Tabela 11.2 Campos para o exemplo Chap11Ex8.aspx. Campo NmeroDoPedido NomeDaEmpresa CidadeDeDestino PasDeDestino De qual tabela? Pedidos Clientes Pedidos Pedidos
Observe que estamos retornando dados de duas tabelas diferentes: Pedidos e Clientes. Neste caso teremos que utilizar uma clusula JOIN, no comando SQL. As tabelas Pedidos e Clientes so relacionadas atravs do campo CdigoDoCliente. Este um relacionamento do tipo Um (tabela Clientes) para vrios (tabela Pedidos), o que significa que cada Cliente cadastrado uma nica vez, porm pode fazer vrios pedidos. Para maiores informaes sobre relacionamentos, consulte o Anexo II. Para maiores informaes sobre o SQL consulte o Anexo III. Alm do controle DataGrid, teremos um campo do tipo TextBox, onde o usurio pode digitar o nome ou parte do nome de um Cliente. Ao clicar no boto Pesquisar, o DataGrid passar a exibir somente os pedidos para os clientes cujo nome, atende ao critrio digitado. Na Listagem 11.8 temos o cdigo para o exemplo proposto.
<html>
NOTA: Neste exemplo vamos manter o cdigo que faz a classificao dos dados quando o usurio clica no ttulo de uma das colunas do DataGrid. Desta forma poderemos filtrar e classificar os dados.
// Declaro uma varivel do tipo String. // Esta varivel contm o nome da coluna pela qual
447
www.juliobattisti.com.br
if (Page.IsPostBack) { // Define o valor da String FiltraDados que, // na prtica, a expresso de filtragem dos dados, // que ser atribuda propriedade RowFilter.
// Define, por padro, a ordenao por NmeroDoPedido. // Atribui um valor padro para o campo de pesquisa. { OrdenaPor = NmeroDoPedido; DigitaCriterio.Text=a; }
BuscaDados();
// Rotina que faz a conexo com o banco de dados Northwind.mdb. // Ordena os dados de acordo com o campo definido na varivel OrdenaPor. // Filtra de acordo com o critrio especificado na String FiltraDados.
www.juliobattisti.com.br
448
// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.
// Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna as cidades da Alemanha. String ComandoSQL; String aux1SQL; String aux2SQL; String aux3SQL; String aux4SQL;
aux1SQL= SELECT Pedidos.NmeroDoPedido, Clientes.NomeDaEmpresa, Pedidos.CidadeDeDestino; aux2SQL= , Pedidos.PasDeDestino FROM Clientes; aux3SQL= INNER JOIN Pedidos ON Clientes.CdigoDoCliente = Pedidos.CdigoDoCliente; aux4SQL= ORDER BY Pedidos.NmeroDoPedido;
// Criamos e preenchemos um objeto DataSet. // Observe que no temos mais o objeto Recordset, // como era de praxe com o ASP 3.0.
449
www.juliobattisti.com.br
MeuComando.Fill(ds);
// Criamos um objeto DataView ligado com a primeira // tabela, da coleo de tabelas, do objeto ds.
// Defino a propriedade Sort, do objeto source, como sendo // igual ao valor da String OrdenaPor.
source.Sort=OrdenaPor;
source.RowFilter=FiltraDados;
// Defino o valor da String OrdenPor, com base na propriedade // SortExpression, do argumento e, do tipo // DataGridSortCommandEventArgs, passado como parmetro.
www.juliobattisti.com.br
450
// Chamo a rotina que faz a conexo para reordenar os dados, // com base no novo valor da String OrdenaPor.
BuscaDados();
</script>
<body>
<form runat=server>
<H4> Clique no ttulo da coluna para ordenar pelo campo respectivo.</H4> <H4> Digite o nome ou parte do nome da empresa no campo Critrio e d um</H4> <H4> clique no boto Pesquisar.</H4> <HR>
<Table>
451
www.juliobattisti.com.br
</TR> </Table> <ASP:DataGrid id=MinhaGrade runat=server Width=700" BackColor=#ccccff BorderColor=black ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Verdana Font-Size=8pt HeaderStyle-BackColor=#aaaadd MaintainState=false AllowSorting=True OnSortCommand=OrdenaDados /> </form> </body> </html>
Digite o cdigo da Listagem 11.8 e salve o mesmo em um arquivo chamado chap11ex8aspx, na pasta chap11, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex8aspx
www.juliobattisti.com.br
452
453
www.juliobattisti.com.br
O controle DataGrid, na seo de apresentao, idntico ao controle utilizado no exemplo da Listagem 11.7. Ao montar o comando SQL, utilizamos quatro variveis do tipo String, depois concatenamos as quatro variveis em uma varivel chamada ComandoSQL. Esta varivel foi passada como parmetro para a criao do objeto DataAdapter:
String ComandoSQL; String aux1SQL; String aux2SQL; String aux3SQL; String aux4SQL; aux1SQL= SELECT Pedidos.NmeroDoPedido, Clientes.NomeDaEmpresa, Pedidos.CidadeDeDestino; aux2SQL= , Pedidos.PasDeDestino FROM Clientes; aux3SQL= INNER JOIN Pedidos ON Clientes.CdigoDoCliente = Pedidos.CdigoDoCliente;
www.juliobattisti.com.br
454
ComandoSQL = aux1SQL + aux2SQL +aux3SQL +aux4SQL; OleDbDataAdapter MeuComando = new OleDbDataAdapter(ComandoSQL, MinhaConexo);
Observe que fizemos uso da clusula JOIN, pois estamos retornando dados de duas tabelas: Pedidos e Clientes. O resultado final para a string ComandoSQL o seguinte:
SELECT Pedidos.NmeroDoPedido, Clientes.NomeDaEmpresa, Pedidos.CidadeDeDestino, Pedidos.PasDeDestino FROM Clientes INNER JOIN Pedidos ON Clientes.CdigoDoCliente = Pedidos.CdigoDoCliente ORDER BY Pedidos.NmeroDoPedido;
Observe que estamos utilizando a nomenclatura NomeDoCampo.NomeDaTabela. Esta nomenclatura necessria quando estamos acessando dados de duas ou mais tabelas. Com esta nomenclatura indicamos de qual tabela determinado campo deve ser acessado. Esta nomenclatura particularmente til, para situaes em que o mesmo nome de campo existe em duas ou mais tabelas. Por exemplo, o campo CdigoDoCliente existe tanto na tabela Pedidos quanto na tabela Clientes. Vamos entender o procedimento Page_Load: Este evento, conforme j descrito anteriormente, executado toda vez que a pgina for carregada. Quando a pgina for carregada pela primeira vez, a propriedade Page.IsPostBack igual a False e, neste caso, a varivel OrdenaPor def inida como sendo igual a NmeroDoPedido e o contedo do controle DigitaCriterio definido como a. Fora da estrutura if/else, chamado o procedimento BuscaDados( ), ou seja, este procedimento ser chamado sempre que a pgina for carregada, independente de ser um PostBack ou no. Vamos entender o procedimento BuscaDados( ): Grande parte do cdigo deste procedimento j de nosso conhecimento. So comandos para conectar com o banco de dados NorthWind.mdb, executar um comando SQL e retornar os dados em um objeto DataSet, a partir do qual criamos um objeto DataView. O nico detalhe adicional que temos neste procedimento a definio da propriedade RowFilter, do objeto source, que um objeto do tipo DataView:
source.RowFilter=FiltraDados;
NOTA: Maiores informaes sobre a linguagem SQL podem ser encontradas no Anexo III.
Neste momento o objeto DataView filtrado de acordo com a expresso de filtragem contida na String FiltraDados. O funcionamento do procedimento OrdenaDados o mesmo do exemplo da Listagem 11.7. Para maiores detalhes sobre o funcionamento deste procedimento, consulte os comentrios para o exemplo da Listagem 11.7.
455
www.juliobattisti.com.br
NOTA: A ordem em que os campos aparecem em uma fonte de dados definida pelo comando SQL. Considere o seguinte comando: Select NmeroDoPedido, CidadeDeDestino, PasDeDestino From Pedidos.
www.juliobattisti.com.br
456
<AlternatingItemStyle property=value/> <EditItemStyle property=value/> <FooterStyle property=value/> <HeaderStyle property=value/> <ItemStyle property=value/> <PagerStyle property=value/> <SelectedItemStyle property=value/>
<Columns> <asp:BoundColumn DataField=DataSourceField DataFormatString=FormatString FooterText=FooterText HeaderImageUrl=url HeaderText=HeaderText ReadOnly=True|False SortField=DataSourceFieldToSortBy Visible=True|False FooterStyle-property=value HeaderStyle-property=value ItemStyle-property=value/>
<asp:ButtonColumn ButtonType=LinkButton|PushButton Command=BubbleText DataTextField=DataSourceField DataTextFormatString=FormatString FooterText=FooterText HeaderImageUrl=url HeaderText=HeaderText ReadOnly=True|False SortField=DataSourceFieldToSortBy
457
www.juliobattisti.com.br
<asp:EditCommandColumn ButtonType=LinkButton|PushButton CancelText=CancelButtonCaption EditText=EditButtonCaption FooterText=FooterText HeaderImageUrl=url HeaderText=HeaderText ReadOnly=True|False SortField=DataSourceFieldToSortBy UpdateText=UpdateButtonCaption Visible=True|False/>
<asp:HyperLinkColumn DataNavigateUrlField=DataSourceField DataNavigateUrlFormatString=FormatExpression DataTextField=DataSourceField DataTextFormatString=FormatExpression FooterText=FooterText HeaderImageUrl=url HeaderText=HeaderText NavigateUrl=url ReadOnly=True|False SortField=DataSourceFieldToSortBy Target=window Text=HyperLinkText Visible=True|False/>
www.juliobattisti.com.br
458
</asp:TemplateColumn> </Columns>
</asp:DataGrid>
Uma vez definida a propriedade AutoGenerateColumns para False, podemos definir manualmente as colunas. Isto feito entre as tags <Columns> </Columns>. Conforme citado anteriormente, temos diferentes tipos de colunas, tipos estes que esto descritos na Tabela 11.3.
Tabela 11.3 Tipos de colunas para o controle DataGrid. Tipo BoundColumn Descrio uma coluna associada com um campo da fonte de dados (um objeto DataView ou DataReader). Podemos controlar os aspectos visuais utilizando as diversas propriedades da coluna. o tipo de coluna padro, isto , se optarmos pela gerao automtica de colunas (AutoGenerateColumns=True), ser gerada uma coluna do tipo BoundColumn para cada campo da fonte de dados. Cria uma coluna com botes de comando. Podemos definir o texto dos botes utilizando a propriedade Text ou podemos fazer o DataBind da coluna com uma fonte de dados, de tal maneira que o rtulo do boto de comando seja diferente para cada linha do DataGrid. Cria uma coluna com links que so associados com um campo da fonte de dados. Por exemplo, uma coluna que exibe o nome dos funcionrios pode ter o nome como um link. Ao clicarmos no Link ser aberta uma pgina com todas as informaes do funcionrio.
ButtonColumn
HyperLinkColumn
459
www.juliobattisti.com.br
Descrio Cria uma coluna onde podemos definir os comandos para Edio (Update), incluso (Add) ou excluso (Remove) de registros. Utilizada para definir o layout dos controles que compem o DataGrid, a partir de modelos para determinados elementos do HTML. Veremos exemplos mais adiante.
As colunas de um DataGrid, adicionadas manualmente, fazem parte da coleo Columns. A ordem em que as colunas so exibidas no DataGrid, da esquerda para a direita, definida pela ordem em que as colunas esto definidas na coleo Columns. Podemos alterar esta ordem, utilizando programao.
NOTA: possvel utilizar uma mescla entre colunas geradas automaticamente e colunas definidas manualmente. Quando isto acontece as colunas criadas manualmente so processadas em primeiro lugar. As colunas geradas automaticamente no faro parte da coleo Columns.
<html>
void BuscaDados() {
// Crio uma conexo com o banco de dados pubs localizado no servidor local. // Vamos acessar a instncia SERVIDOR\NETSDK.
// Conectamos com o banco de dados utilizando um comando SQL, // o qual retorna todos os dados da tabela Authors, do banco de // dados pubs, do SQL Server 2000 SERVIDOR\NETSDK.
www.juliobattisti.com.br
460
// Conectamos um controle DataGrid com o DataSet criado anteriormente. // MinhaGrade o id (nome) de um controle do tipo // DataGrid que est na seo de apresentao da pgina.
</script>
<body>
<form runat=server>
<h3><font face=Verdana>Criando colunas manualmente.</font></h3> <HR> <H4>Observe que temos diferentes formataes para cada coluna>/H4>
<b>Product List</b>
<HeaderStyle
461
www.juliobattisti.com.br
</HeaderStyle>
<Columns>
</asp:BoundColumn>
</asp:BoundColumn>
</asp:DataGrid>
</form>
</body> </html>
www.juliobattisti.com.br
462
463
www.juliobattisti.com.br
A definio das colunas feita dentro das tags <Columns> </Columns>. Neste exemplo utilizamos apenas colunas do tipo BoundColumn. 1. A primeira coluna exibe dados do campo au_id:
<asp:BoundColumn HeaderText=Cdigo DataField=au_id ItemStyle-BackColor=#c0c0c0" > </asp:BoundColumn>
A propriedade HeaderText define o ttulo da coluna. A propriedade DataField define com qual campo do objeto DataView a coluna ligada. Como definimos esta propriedade com au_id, esta coluna ir exibir o cdigo do autor. Esta propriedade que faz a ligao da coluna com um campo da fonte de dados. A propriedade ItemStyle-BackColor define a cor de segundo plano. 2. A segunda coluna exibe dados do campo au_fname:
<asp:BoundColumn HeaderText=Nome DataField=au_fname ItemStyle-Font-Italic=True ItemStyle-Font-Name=Courier New > </asp:BoundColumn>
A propriedade HeaderText define o ttulo da coluna. A propriedade DataField liga a coluna com o campo au_fname da fonte de dados. Esta coluna exibe o primeiro nome do autor. A propriedade ItemStyle-Font-Italic define Itlico para a fonte. A propriedade ItemStyle-Font-Name define o tipo de fonte a ser utilizado. Poderamos ter utilizado Arial, Times New Roman, etc. 3. A terceira coluna exibe dados do campo phone:
www.juliobattisti.com.br
464
A propriedade HeaderText define o ttulo da coluna. A propriedade DataField liga a coluna com o campo phone da fonte de dados. A propriedade ItemStyle-Font-Bold define Negrito para a fonte. Tambm inclumos um elemento HeaderStyle. Este elemento define a formatao para a linha de ttulos das colunas. Definimos negrito (Font-Bold=True), fonte CourierNew (Font-Name=Courier New) e cor de fonte branca (ForeColor=White). Observe que as formataes para o elemento HeaderStyle so diferentes das formataes para o elemento BoundColumn. Por exemplo, no elemento BoundColumn, utilizamos ItemStyle-Font-PropriedadeDaFonte, para definir uma caracterstica da fonte. Por exemplo, utilizamos ItemStyle-Font-Bold=True, para definir Negrito. J no elemento HeaderStyle utilizamos apenas Font-PropriedadeDaFonte. Por exemplo, utilizamos Font-Bold=True, para definir Negrito.
<HeaderStyle BackColor=#00aaaa Font-Bold=True Font-Name=Courier New ForeColor=White > </HeaderStyle>
Na seo de cdigo da pgina, simplesmente estabelecemos uma conexo com o servidor SQL Server e utilizamos um objeto Data Repeater para executar um comando SQL que preenche um objeto DataSet. A partir do objeto DataSet criamos um objeto DataView, objeto este que associado com o DataGrid. Criamos um procedimento BuscaDados( ), o qual chamado toda vez que a pgina carregada Page_Load.
NOTA: Ainda no estudamos todos os detalhes do controle DataGrid. No prximo tpico, veremos como implementar a paginao, utilizando um controle DataGrid. No Captulo 12 aprenderemos a utilizar o controle DataGrid para Editar, Alterar e Excluir dados.
465
www.juliobattisti.com.br
Na Tabela 11.4 temos a definio das principais caractersticas da Barra de Navegao, que podem ser configuradas com a propriedade PagerStyle.
Tabela 11.4 Configuraes da propriedade PagerStyle. Propriedade PagerStyle-BackColor PagerStyle-BorderColor PagerStyle-BorderWidth PagerStyle-Font PagerStyle-ForeColor PagerStyle-Mode Utilizada para definir A cor de segundo plano. A cor das bordas. O tamanho das bordas. Caractersticas da fonte (Negrito, Itlico, etc.). A cor da fonte. Define se sero exibidos links Prximo e Anterior, ou se um link para o nmero de cada pgina. O valor padro NextPrev, o que faz com que sejam exibidos os botes Prximo e Anterior. Se definirmos o valor desta propriedade como NumericPages, sero exibidos links para o nmero de cada pgina. O texto para o link que navega para a prxima pgina.
PagerStyle-NextPageText
www.juliobattisti.com.br
466
Utilizada para definir O texto para o link que navega para a pgina anterior. Define a posio da Barra de Navegao. Pode ser Bottom barra no final do DataGrid, que o valor padro, Top barra no incio do DataGrid ou TopAndBottom barra no incio e no final do DataGrid.
Para definir o nmero de linhas por pgina, utilizamos a propriedade PageSize. Por exemplo, o seguinte comando define que sejam exibidos quinze registros por pgina:
PageSize=15
amos apresentar um exemplo. Exemplo: Vamos criar um exemplo, onde retornamos o nome de todos os clientes da tabela Clientes, do Banco de dados Northwind.mdb. Dividiremos os registros em pginas de dez registros. Utilizaremos o modo padro, onde exibido um link Prxima Pgina ->> (com exceo da ltima pgina, quando este link estar desabilitado) e um link <<- Pgina Anterior (com exceo da primeira pgina, quando este link estar desabilitado). Utilizaremos algumas propriedades da Tabela 11.4 para personalizar a aparncia da Barra de Navegao. Na Listagem 11.10 temos o cdigo para o exemplo proposto.
<html>
void BuscaDados() {
467
www.juliobattisti.com.br
// Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna as cidades da Alemanha. String aux1SQL; String aux2SQL; String ComandoSQL;
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher // o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Criamos um objeto DataView ligado com a primeira // tabela, da coleo de tabelas, do objeto ds.
www.juliobattisti.com.br
468
// Procedimento que faz a navegao para a prxima pgina // ou para a pgina anterior, dependendo do link clicado // pelo usurio.
</script>
<body>
<form runat=server>
<HR>
<ASP:DataGrid id=MinhaGrade runat=server CellPadding=3 CellSpacing=0" Font-Name=CourierNew Font-Size=10pt HeaderStyle-BackColor=#aaaadd MaintainState=false AllowPaging=True OnPageIndexChanged=TrocaPagina PageSize=10" PagerStyle-Position=TopAndBottom PagerStyle-NextPageText=Prxima Pgina ->>
469
www.juliobattisti.com.br
/>
Digite o cdigo da Listagem 11.10 e salve o mesmo em um arquivo chamado chap11ex10aspx, na pasta chap11, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex10aspx Ser exibida uma listagem com os 10 primeiros clientes. Observe que temos links para a prxima pgina e para a pgina anterior, no incio e no final do DataGrid, conforme indicado na Figura 11.12.
www.juliobattisti.com.br
470
471
www.juliobattisti.com.br
Se fizermos estas alteraes e recarregarmos a pgina, obteremos o resultado indicado na Figura 11.14.
A definio da pgina atual feita com o uso da propriedade CurrentPageIndex, do DataGrid. A primeira pgina a pgina zero, a segunda a pgina um e assim por diante.
www.juliobattisti.com.br
472
O evento OnPageIndexChanged disparado toda vez que o usurio clica em um dos links de navegao. O procedimento TrocaPagina recebe um argumento do tipo DataGridPageChangedEventArgs. Chamamos este argumento de e. Este argumento uma instncia da classe DataGridPageChangedEventArgs, do namespace System.Web.UI.WebControls. Quando clicamos em um dos links de navegao, o ndice da pgina para a qual aponta o link pode ser acessado atravs da NewPageIndex deste argumento. Atribumos o valor contido nesta propriedade para a propriedade CurrentPageIndex do DataGrid. O efeito prtico carregar a pgina do DataGrid, cujo ndice o mesmo definido na propriedade NewPageIndex. Observe que, simplesmente, com a definio de uma propriedade e um procedimento de duas linhas, implementamos paginao no ASP.NET, o que com ASP 3.0 demandaria uma boa quantidade de cdigo.
Concluso
Iniciamos o captulo apresentando o conceito de DataBinding e aprendendo a utilizar os seguintes Web Server Controls: CheckBoxList DropDownList RadioButtonList Em seguida comeamos a estudar mais alguns detalhes sobre o controle DataGrid. Aprendemos as seguintes operaes: Filtrar dados. Criar as colunas do DataGrid manualmente. Fazer paginao. No Captulo 12 continuaremos trabalhando com o acesso a Banco de dados. Aprenderemos a criar pginas ASP.NET que permitem a edio, excluso e incluso de registros no Banco de dados. Aprenderemos a utilizar mais algumas classes dos namespaces System.Data, System.Data.SqlClient e System.Data.OleDb. Como no poderia deixar de ser, aprenderemos a realizar mais algumas operaes e a utilizar mais algumas opes do controle DataGrid.
473
www.juliobattisti.com.br
Introduo
Nos captulos 10 e 11 aprendemos a acessar dados do Microsoft Access e do SQL Server 2000. Utilizamos diversas classes do ADO.NET para fazer o acesso aos dados. Comentamos que com ASP.NET temos um modelo desconectado, ou seja, retornamos uma ou mais tabelas atravs de um objeto DataSet e encerramos a conexo com o banco de dados. Nos exemplos vistos at o momento apenas exibimos, pesquisamos e classificamos os dados obtidos. Neste captulo aprenderemos a alterar, adicionar e excluir dados. Estas operaes sero feitas no conjunto de dados do objeto DataSet, ou seja, no conjunto de dados Desconectados. Em seguida aprenderemos a passar as alteraes que foram feitas no conjunto de dados desconectados, para a fonte original de dados; em outras palavras, aprenderemos a sincronizar as alteraes feitas nos dados do DataSet com a fonte original de dados. Iniciaremos o captulo aprendendo a utilizar o objeto DataTable para realizar as seguintes operaes bsicas: Adicionar um registro. Excluir um registro. Alterar um registro. Para realizar estas operaes aprenderemos novas propriedades e mtodos do objeto DataTable. Em seguida aprenderemos a enviar as alteraes feitas no conjunto de dados do objeto DataTable, de volta para o banco de dados. Neste captulo apresentamos tpicos fundamentais para a construo de qualquer aplicao Web que acesse dados. Por exemplo, se voc constri um site, onde o internauta pode cadastrar-se para participar de promoes, voc precisar construir um formulrio onde o internauta possa digitar seus dados e enviar os mesmos para o banco de dados. Voc tambm ter que fornecer um formulrio para que o usurio possa alterar seus dados e, finalmente, uma opo para que o usurio possa excluir seu cadastro. Conforme destacaremos neste captulo, as operaes de manipulao de dados com o ASP.NET so bem diferentes das operaes que utilizvamos com ASP 3.0. De incio, a maior dificuldade ser entender este novo mecanismo. Vamos apresentar exemplos detalhados, onde explicaremos, em detalhes, toda a funcionalidade de cada exemplo. Desta maneira, o leitor poder entender os passos necessrios e quais objetos utilizar para implementar as operaes de manipulao de dados.
CAPTULO
12
Acessando Bancos de Dados com ASP.NET Parte 3
www.juliobattisti.com.br
474
475
www.juliobattisti.com.br
No exemplo a seguir, criamos um objeto DataTable, utilizando o mtodo Add, da coleo Tables, de um objeto DataSet:
DataSet MeuDataSet = new DataSet(); DataTable MinhaTabela = MeuDataSet.Tables.Add(Pedidos);
O nmero mximo de linhas que um objeto DataTable pode conter : 16.777.216. O objeto DataTable tambm possui uma coleo de objetos do tipo Constraint. Podemos utilizar esta coleo para implementar a Integridade dos dados. Por exemplo, podemos utilizar uma Constraint para definir que a coluna Salrio no pode conter valores maiores do que R$ 10.000,00 e que a coluna DiasDeFrias deve conter um valor entre 1 e 30.
IMPORTANTE: No momento da criao do objeto DataTable, o construtor da classe DataTable faz distino entre maisculas e minsculas, para o nome da tabela. Por exemplo, os dois comandos a seguir criam dois objetos DataTable distintos:
DataTable MinhaTabela = new DataTable(Pedidos); DataTable MinhaOutraTabela = new DataTable(pedidos);
Tabela 12.1 Principais propriedades da classe DataTable. Propriedade CaseSensitive Columns Constraints DataSet PrimaryKey Rows TableName Descrio Propriedade boleana que indica se, para comparao de Strings, ser feita distino entre maisculas e minsculas. Retorna a coleo de colunas da tabela. Retorna a coleo de Constraints da tabela. Retorna o objeto DataSet a partir do qual foi criado o objeto DataTable. Utilizada para retornar ou definir um Array de colunas que atuam como Chave Primria da tabela. Retorna a coleo de linhas da tabela. Utilizada para retornar ou definir o nome associado ao objeto DataTable.
www.juliobattisti.com.br
476
Tabela 12.2 Principais mtodos da classe DataTable. Mtodo AcceptChanges Descrio Torna definitivas todas as alteraes que foram feitas, nos dados do DataTable, desde a ltima chamada do mtodo AcceptChanges. Quando este mtodo chamado, qualquer objeto DataRow (que representa uma linha da tabela), que ainda estiver em modo de edio, ter sua edio encerrada. Todas as linhas adicionadas ou modificadas, desde a ltima chamada do mtodo, tero o seu estado alterado para Unchanged. As linhas marcadas como Deletadas sero removidas. importante que voc somente chame o mtodo AcceptChanges, aps ter atualizado a fonte de dados, utilizando um dos mtodos que aprenderemos nos prximos tpicos. Remove todas as linhas do DataTable. Faz uma cpia da estrutura do DataTable, inclusive os relacionamentos e constraints. Faz uma cpia da estrutura e tambm dos dados do DataTable. Localiza e atualiza uma linha especificada. Se no for encontrada nenhuma linha coincidente, uma nova linha ser criada, com os valores passados para o mtodo. Passamos um Array de valores, como parmetro para este mtodo. Este mtodo utilizado para criar uma nova linha. Desfaz todas as alteraes que foram feitas desde que a tabela foi inicializada ou desde a ltima chamada do mtodo AcceptChanges.
NewRow RejectChanges
477
www.juliobattisti.com.br
<html>
// Crio uma conexo com o banco de dados NorthWind.mdb // que est na pasta C:\Meus documentos.
// Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna todos os dados da tabela Clientes.
auxSQL1= SELECT CdigoDoCliente,NomeDaEmpresa,Endereo,Telefone,Pas; auxSQL2= FROM Clientes Where Pas=Brasil; auxSQL3= Order By NomeDaEmpresa;
ComandoSQL= auxSQL1+auxSQL2+auxSQL3;
www.juliobattisti.com.br
478
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher // o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds,Clientes2"); // Conectamos um controle DataGrid com o DataSet criado anteriormente. // MinhaGrade o id (nome) de um controle do tipo // DataGrid que est na seo de apresentao da pgina.
// Agora vamos criar um objeto DataTable. // Chamaremos este objeto de Clientes2 e iremos // associ-lo a primeira tabela do objeto ds.
479
www.juliobattisti.com.br
DataRow Linha2 = Clientes2.NewRow(); <l // Defino os valores para a linha a ser inserida.
Clientes2.Rows.Add(Linha2);
</script>
<ASP:DataGrid id=MinhaGrade1" runat=server Width=700" BackColor=#ccccff BorderColor=black ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Verdana Font-Size=8pt
www.juliobattisti.com.br
480
<HR> <ASP:DataGrid id=MinhaGrade2" runat=server Width=700" BackColor=#ccccff BorderColor=black ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Verdana Font-Size=8pt HeaderStyle-BackColor=#aaaadd MaintainState=false /> </body> </html>
Digite o cdigo da Listagem 12.1 e salve o mesmo em um arquivo chamado chap12ex1.aspx, na pasta chap12, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap12/chap12ex1.aspx Ao carregar a pgina voc obtm o resultado indicado na Figura 12.1. Comentrios sobre o cdigo do exemplo Chap12ex1.aspx. Na seo de apresentao da pgina, utilizamos dois controles DataGrid MinhaGrade1 e MinhaGrade 2. No controle MinhaGrade1 exibimos os registros retornados da tabela Clientes; no controle MinhaGrade2 exibimos os dados, aps termos adicionados duas linhas ao objeto DataTable. Utilizamos o evento Page_Load da pgina, para fazer a conexo com o banco de dados. Neste evento temos a seguinte seqncia de passos: 1. Conectamos com o Banco de dados NortWhind.mdb e retornamos somente os Clientes do Brasil. Em seguida utilizamos um objeto DataView para ligar os dados retornados com o controle DataGrid1. Esta parte do cdigo j foi utilizada em outros exemplos, dos captulos anteriores.
481
www.juliobattisti.com.br
3.
Na seqncia declaro um objeto do tipo DataRow Linha, defino o valor de cada coluna e utilizo o mtodo Add, da coleo Rows da tabela Clientes2, para adicionar a linha coleo de linhas da tabela.
// Declaro um objeto do tipo DataRow.
www.juliobattisti.com.br
482
Clientes2.Rows.Add(Linha);
4.
Clientes2.Rows.Add(Linha2);
5.
Por ltimo fao a ligao entre o objeto DataTable Clientes2 e o controle DataGrid MinhaGrade2:
MnhaGrade2.DataSource = Clientes2.DefaultView; MinhaGrade2.DataBind();
6.
Neste momento, conforme pode ser confirmado pela Figura 12.1, temos duas novas linhas adicionadas ao objeto Clientes2. Este objeto segue o modelo desconectado, do ADO.NET. Isto significa que as alteraes feitas no objeto DataTable (no caso adio de duas novas linhas) ainda no foram enviadas para o Banco de dados NorthWind.mdb. Isto pode ser facilmente comprovado. Abra o Microsoft Access e abra o Banco de dados NorthWind.mdb. Crie uma consulta baseada na tabela Clientes e defina como critrio Brasil, para o campo Pas. Sero exibidos apenas os Clientes do Brasil. Observe que os dois novos clientes (cdigos XXYYK e WWMMK) no foram adicionados tabela Clientes, conforme indicado na Figura 12.2.
7.
Para atualizar o banco de dados, isto , enviar de volta as alteraes feitas no objeto DataTable, temos que utilizar alguns mtodos do objeto DataAdapter. Aprenderemos a utilizar estes mtodos mais adiante, neste captulo.
Vamos aprender a utilizar mais alguns mtodos do objeto DataTable, antes de aprendermos a sincronizar as alteraes deste com o banco de dados.
483
www.juliobattisti.com.br
<html>
String auxSQL1;
www.juliobattisti.com.br
484
auxSQL1= SELECT CdigoDoCliente,NomeDaEmpresa,Endereo,Telefone,Pas; auxSQL2= FROM Clientes Where Pas=Brasil; auxSQL3= Order By NomeDaEmpresa;
ComandoSQL= auxSQL1+auxSQL2+auxSQL3;
// Agora vamos criar um objeto DataTable. // Chamaremos este objeto de Clientes2, para // distinguir da tabela Clientes, da coleo de // Tabelas do DataSet.
// Agora excluo as duas primeiras linhas // ndice 0 e ndice1. // Para excluir uma linha, utilizo o mtodo // Delete, da coleo Rows, do objeto DataTable.
Clientes2.Rows[0].Delete(); Clientes2.Rows[1].Delete();
// Neste momento as linhas foram apenas marcadas para excluso, // porm continuam no objeto DataTable, conforme pode ser confirmado // pelos dados exibidos no controle MinhaGrade2.
485
www.juliobattisti.com.br
Clientes2.RejectChanges();
// Agora excluo novamente as duas primeiras linhas // ndice 0 e ndice1. // Para excluir uma linha, utilizo o mtodo // Delete, da coleo Rows, do objeto DataTable. // **************************************************
Clientes2.Rows[0].Delete(); Clientes2.Rows[1].Delete();
// Para fazer a excluso definitiva das linhas, vamos // chamar o mtodo AcceptChanges(), do objeto DataTable. // Aps a chamada deste mtodo, as linhas so excludas // do objeto DataTable, conforme pode ser confirmado // pelos dados exibidos no controle MinhaGrade3.
Clientes2.AcceptChanges();
</script>
<body>
www.juliobattisti.com.br
486
<ASP:DataGrid id=MinhaGrade1" runat=server Width=700" BackColor=#c0c0c0" BorderColor=black ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Verdana Font-Bold=True Font-Size=7pt HeaderStyle-BackColor=#aaaadd MaintainState=false /> <HR> <ASP:DataGrid id=MinhaGrade2" runat=server Width=700" BorderColor=black ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Verdana Font-Size=7pt HeaderStyle-Font-Bold=True MaintainState=false />
<HR>
487
www.juliobattisti.com.br
</body>
</html>
Digite o cdigo da Listagem 12.2 e salve o mesmo em um arquivo chamado chap12ex2.aspx, na pasta chap12, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap12/chap12ex2.aspx Ao carregar a pgina voc obtm o resultado indicado na Figura 12.3. Comentrios sobre o cdigo do exemplo Chap12ex2.aspx. Para excluir uma linha de um objeto DataTable, utilizamos o mtodo Delete, da coleo de linhas Rows. A sintaxe para este mtodo a seguinte:
MeuDataTable.Rows[nmero_da_linha].Delete();
O nmero da primeira linha zero, o da segunda linha 1 e assim por diante. Aps a chamada deste mtodo, a linha marcada para excluso. Podemos retornar a linha ao seu estado normal, chamando o mtodo RejectChanges. A chamada deste mtodo faz com que sejam descartadas todas as alteraes efetuadas, desde a ltima chamada do mtodo AcceptChanges. No nosso exemplo, exclumos as duas primeiras linhas, e depois chamamos o mtodo RejectChanges, para cancelar as excluses. Em seguida exibimos os dados do objeto Clientes2, no controle MinhaGrade2:
www.juliobattisti.com.br
488
489
www.juliobattisti.com.br
Clientes2.Rows[0].Delete(); Clientes2.Rows[1].Delete();
// Para fazer a excluso definitiva das linhas, vamos // chamar o mtodo AcceptChanges(), do objeto DataTable. // Aps a chamada deste mtodo, as linhas so excludas // do objeto DataTable, conforme pode ser confirmado // pelos dados exibidos no controle MinhaGrade3
Clientes2.AcceptChanges();
Conforme podemos comprovar na Figura 12.3, as linhas foram realmente excludas. Mais uma vez cabe ressaltar que estas excluses no foram enviadas para o banco de dados. Foram feitas no objeto DataTable que um objeto que segue o modelo desconectado do ADO.NET. Aprenderemos a sincronizar as alteraes com o banco de dados ainda neste captulo. Exemplo 3: Vamos aprender a alterar os dados de uma linha do objeto DataSet. Vamos apresentar um exemplo, onde temos uma Caixa de Combinao com o nome de todos os Clientes do Brasil. O usurio seleciona um nome na lista e clica no boto Editar. O respectivo registro ser retornado e os valores exibidos em controles do tipo TextBox, para que o usurio possa alter-los, com exceo do campo CdigoDoCliente. Uma vez feitas as alteraes necessrias, o usurio clica no boto Salvar. Os novos valores so salvos e a listagem de Clientes novamente exibida para que possamos confirmar se as alteraes foram feitas. Na Listagem 12.3 temos o cdigo para o exemplo proposto. Vou excluir o comentrio da parte bsica da listagem, parte esta que j explicamos em exemplos anteriores. Somente incluirei comentrios nos pontos da listagem onde temos novidades. O exemplo um pouco longo pois, alm das tcnicas para edio de registros, vamos aprender a tratar eventos, localizar dados automaticamente, ocultar e exibir controles utilizando cdigo e outras tcnicas teis.
www.juliobattisti.com.br
490
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3 Listagem 12.3 O objeto DataTable Editando linhas.
<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>
<html>
OleDbDataAdapter MeuComando; String auxSQL1; String auxSQL2; String comandoSQL; DataSet ds = new DataSet(); OleDbConnection MinhaConexo; String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
auxSQL1 = Select CdigoDoCliente,NomeDaEmpresa,Endereo,Pas,Telefone From Clientes; auxSQL2 = Where Pas=Brasil + Order By NomeDaEmpresa;
491
www.juliobattisti.com.br
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher // o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Conectamos um controle DropDownList com o DataSet criado anteriormente. // MinhaLista o id (nome) de um controle do tipo // DropDownList que est na seo de apresentao da pgina.
} }
void OcultaControles() { txtNovoCdigoDoCliente.Visible =false; txtNovoNomeDaEmpresa.Visible = false; txtNovoEndereo.Visible=false; txtNovoTelefone.Visible=false; txtNovoPas.Visible=false; txtMostraAtualizado.Visible=false; txtMensagem.Visible=false; }
www.juliobattisti.com.br
492
auxSQL1 = Select CdigoDoCliente,NomeDaEmpresa,Endereo,Pas,Telefone From Clientes; auxSQL2 = Where Pas=Brasil + Order By NomeDaEmpresa;
comandoSQL = auxSQL1+auxSQL2;
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher // o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Conectamos um controle DropDownList com o DataSet criado anteriormente. // MinhaLista o id (nome) de um controle do tipo // DropDownList que est na seo de apresentao da pgina. DataView source = new DataView(ds.Tables[0]);
// Vamos definir o campo CdigoDoCliente como sendo a chave // primria da tabela Clientes.
493
www.juliobattisti.com.br
txtCdigoDoCliente.Text = Linha[CdigoDoCliente].ToString(); txtNomeDaEmpresa.Text txtEndereo.Text txtTelefone.Text txtPas.Text = Linha[NomeDaEmpresa].ToString(); = Linha[Endereo].ToString(); = Linha[Telefone].ToString(); = Linha[Pas].ToString();
auxSQL1 = Select CdigoDoCliente,NomeDaEmpresa,Endereo,Pas,Telefone From Clientes; auxSQL2 = Where Pas=Brasil + Order By NomeDaEmpresa;
comandoSQL = auxSQL1+auxSQL2;
MinhaConexo = new OleDbConnection(DefineConexo); MeuComando = new OleDbDataAdapter(comandoSQL, MinhaConexo); // Utilizo o mtodo Fill do objeto DataAdapter, para preencher // o objeto DataSet, com os dados retornados pelo comando SQL.
www.juliobattisti.com.br
494
// Vamos definir o campo CdigoDoCliente como sendo a chave // primria da tabela Clientes.
// Declaro algumas variveis auxiliares para // armazenar os valores originais para os campos // do registro que est sendo editado.
String auxCdigoDoCliente = Linha[CdigoDoCliente].ToString(); String auxNomeDaEmpresa = Linha[NomeDaEmpresa].ToString(); String auxEndereo = Linha[Endereo].ToString(); String auxTelefone = Linha[Telefone].ToString(); String auxPas = Linha[Pas].ToString();
// Defino o valor dos controles da terceira coluna // como sendo igual aos novos valores da linha
txtMostraAtualizado.Visible=true;
495
www.juliobattisti.com.br
txtMensagem.Visible=true;
// Exibo na segunda coluna os valores originais, // obtidos a partir das variveis auxiliares // criadas anteriormente.
txtCdigoDoCliente.Text = auxCdigoDoCliente; txtNomeDaEmpresa.Text txtEndereo.Text txtTelefone.Text txtPas.Text } = auxNomeDaEmpresa; = auxEndereo; = auxTelefone; = auxPas;
</script>
<body>
<h3><font face=Verdana> Selecione um cliente na lista, <BR> para editar o registro do cliente. </font> </h3> <HR>
www.juliobattisti.com.br
496
>
</asp:DropDownList> </td>
<td> <asp:TextBox runat=server id=txtMostraAtualizado Text=REGISTRO ATUALIZADO !!! TextMode=SingleLine Font_Face=Arial Font_Size=3"
497
www.juliobattisti.com.br
</td>
</tr>
<tr>
<td> <asp:TextBox runat=server id=txtCdigoDoCliente Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" Height=20" Width=200" Enabled=False />
</td>
www.juliobattisti.com.br
498
<tr>
<td>
<asp:TextBox runat=server id=txtNomeDaEmpresa Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" Height=20" Width=200" />
</td>
<td>
499
www.juliobattisti.com.br
</td> </tr>
<tr>
<td>
<asp:TextBox runat=server id=txtEndereo Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" Height=20" Width=200" />
</td>
www.juliobattisti.com.br
500
</td> </tr>
<tr>
<td>
<asp:TextBox runat=server id=txtTelefone Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" Height=20" Width=200" />
501
www.juliobattisti.com.br
<td> <asp:TextBox runat=server id=txtNovoTelefone Text= BackColor=#c0c0c0" TextMode=SingleLine Font_Face=Arial Font_Size=3" Height=20" Width=200" Visible=False />
</td> </tr>
<tr>
<td>
www.juliobattisti.com.br
502
</td>
<td> <asp:TextBox runat=server id=txtNovoPas Text= BackColor=#c0c0c0" TextMode=SingleLine Font_Face=Arial Font_Size=3" Height=20" Width=200" Visible=False />
</td> </tr> <tr> <td> <p align=right> <b>Clique no boto Atualizar</b> </td>
</td>
<td>
503
www.juliobattisti.com.br
</table> </div>
Digite o cdigo da Listagem 12.3 e salve o mesmo em um arquivo chamado chap12ex3.aspx, na pasta chap12, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap12/chap12ex3.aspx Ao carregar a pgina voc obtm o resultado indicado na Figura 12.4, onde apresentada uma lista com o nome dos clientes do Brasil e cinco controles do tipo TextBox, em branco. Na lista de Clientes selecione Tradio Hipermercados. Observe que, automaticamente, as informaes do registro referente ao cliente selecionado so exibidas nos controles do formulrio, conforme indicado na Figura 12.5. Clique no campo Nome da Empresa e altere o valor para: Tradio Hipermercados XYZ.
www.juliobattisti.com.br
504
505
www.juliobattisti.com.br
OleDbDataAdapter MeuComando; String auxSQL1; String auxSQL2; String comandoSQL; DataSet ds = new DataSet(); OleDbConnection MinhaConexo; String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
www.juliobattisti.com.br
506
O operador ! o operador not. O teste equivalente a dizer: Se no for um PostBack, execute o cdigo dentro do if . O cdigo para conexo com o banco de dados e ligao com o controle MinhaLista semelhante ao cdigo utilizado em exemplos anteriores. No evento Page_Load, tambm fazemos uma chamada ao procedimento OcultaControles. Este procedimento oculta todos os controles da terceira coluna, os quais somente voltaro a ser exibidos quando o usurio editar um registro:
OcultaControles();
Na definio do controle MinhaLista, definimos diferentes valores para as propriedades DataTextField. A propriedade DataTextField define qual o campo que fornece os valores que sero exibidos para cada item da lista. No nosso exemplo, como queramos que fossem exibidos os nomes dos clientes, def inimos a propriedade DataTextField=NomeDaEmpresa. A propriedade DataValueField define qual o valor associado com cada item da lista. Em outras palavras, quando o usurio seleciona um cliente na lista, qual o valor que ficar associado com a propriedade Value da lista. Poderia ser o mesmo campo que define o texto de cada item. Porm, para o nosso exemplo, queremos que, ao selecionar um cliente, seja definido, como valor do elemento selecionado da lista, o respectivo CdigoDoCLiente. Por isso definimos a propriedade DataValueField=CdigoDoCliente. Na prtica, quando o usurio selecionar, por exemplo, o cliente Tradio Hipermercados , o valor associado ser TRADH, que o cdigo do cliente Tradio Hipermercados. Mais adiante veremos que o cdigo do cliente utilizado para localizar o registro do cliente. A seguir temos a definio do controle MinhaLista:
<asp:DropDownList id=MinhaLista runat=server BackColor=#c0c0c0" Font-Bold=True DataTextField = NomeDaEmpresa
Para alinhar os diversos controles do formulrio, utilizamos uma tabela de trs colunas. Na primeira coluna so exibidos os rtulos para cada campo. Na segunda coluna so exibidos os valores originais do registro. Na terceira coluna so exibidos os valores aps o usurio ter feito alteraes.
507
www.juliobattisti.com.br
Depois executamos uma srie de comandos para conectar com o banco de dados. Estes comandos so idnticos aos utilizados no evento Page_Load. Em seguida criamos um objeto DataTable, associado primeira tabela do objeto DataSource ds:
DataTable Clientes = ds.Tables[0];
Este comando precisa de mais alguns comentrios. Para definir a chave primria, utilizamos a propriedade PrimaryKey, do objeto DataTable. Devemos passar um objeto do tipo DataColumn para a propriedade PrimaryKey. O objeto DataColumn um array de objetos do tipo Column. O Array contm a referncia a uma ou mais colunas, que formam a chave primria. No nosso exemplo, definimos apenas a coluna CdigoDoCliente, como sendo a chave primria. Agora hora de criar um objeto do tipo Linha, o qual contm os valores para o cliente selecionado. Para localizar o registro do cliente que foi selecionado na lista de clientes, utilizamos o mtodo Find, da coleo Rows, da tabela Clientes:
DataRow Linha = Clientes.Rows.Find(MinhaLista.SelectedItem.Value);
Como parmetro para o mtodo Find, ns passamos o valor selecionado na lista MinhaLista. O mtodo Find recebe um valor e pesquisa na coluna Chave Primria da tabela. Caso encontre o valor passado como parmetro, o registro correspondente ser retornado. Observe que definimos o campo CdigoDoCliente como Chave Primria da tabela Clientes e a propriedade DataValueField, da lista de clientes como sendo CdigoDoCliente. Agora ficou mais claro o porqu desta definio. Ao selecionarmos um cliente na lista, associado o valor do CdigoDoCliente, com o item selecionado. Este valor utilizado para localizar o registro do cliente. Uma vez localizado o registro do cliente, vamos definir o contedo dos controles do tipo TextBox, da segunda coluna, como sendo igual aos valores dos campos do registro do cliente:
// Defino os valores dos controles TextBox da seo de apresentao.
txtCdigoDoCliente.Text = Linha[CdigoDoCliente].ToString(); txtNomeDaEmpresa.Text txtEndereo.Text txtTelefone.Text txtPas.Text = Linha[NomeDaEmpresa].ToString(); = Linha[Endereo].ToString(); = Linha[Telefone].ToString(); = Linha[Pas].ToString();
www.juliobattisti.com.br
508
Estas variveis sero utilizadas para exibir os valores originais, na segunda coluna. Finalmente chegamos ao momento de fazer a edio no registro do cliente selecionado. Para editar um registro, chamamos o mtodo BeginEdit da linha, atribumos os novos valores a cada campo da linha e chamamos o mtodo EndEdit( );
// Agora vamos editar o valor da linha. Linha.BeginEdit(); Linha[CdigoDoCliente] Linha[NomeDaEmpresa] = Linha[Endereo] Linha[Telefone] Linha[Pas] Linha.EndEdit(); = = = = txtCdigoDoCliente.Text;
Em seguida tornamos os controles da terceira coluna visveis e exibimos, nestes controles, o registro j alterado:
509
www.juliobattisti.com.br
txtMensagem.Visible=true;
Para finalizar, exibimos, na segunda coluna, os valores originais do registro. Para isso fazemos uso das variveis auxiliares criadas anteriormente, variveis estas que contm os valores originais do registro, isto , antes da edio:
// Exibo na segunda coluna os valores originais, // obtidos a partir das variveis auxiliares // criadas anteriormente. txtCdigoDoCliente.Text = auxCdigoDoCliente; txtNomeDaEmpresa.Text txtEndereo.Text txtTelefone.Text txtPas.Text = auxNomeDaEmpresa;
Em resumo, o procedimento AtualizaRegistro faz o seguinte: 1. 2. 3. 4. Conecta com o banco de dados. Cria um objeto DataTable Clientes. Localiza o registro correspondente ao cliente selecionado na lista de clientes. Atribui os valores antes da edio a variveis auxiliares.
www.juliobattisti.com.br
510
511
www.juliobattisti.com.br
// Agora crio os comandos necessrios para enviar // as alteraes/incluses/excluses para o banco // de dados NorthWind.mdb. // No nosso exemplo, apenas o comando para adio das linhas. // Em primeiro lugar crio um objeto do tipo OleDbCommandBuilder
Ao inserir estes comandos, no final do procedimento Page_Load e recarregar a pgina, dois novos registros sero inseridos no banco de dados. Voc pode abrir o Microsoft Access, carregar o Banco de dados NorthWind.mdb e conferir. Os registros realmente foram inseridos. Observe o seguinte trecho da mensagem de erro: Exception Details: System.Data.ConstraintException: Column CdigoDoCliente is constrained to be unique. Value XXYYK is already present. Este trecho informa que j existe o cliente com CdigoDoCliente=XXYYK. Este cliente foi inserido na primeira vez que carregamos a pgina. Esta mais uma prova de que o mtodo Update realmente enviou as adies para o banco de dados. Vamos apresentar um exemplo onde criamos um formulrio para cadastro de clientes. O formulrio apresenta diversos campos a serem preenchidos. O usurio preenche os campos e clica no boto Cadastrar. Os dados so enviados para o Banco de dados NorthWind.mdb. Faremos uso dos Controles de Validao, vistos no Captulo 8. Utilizaremos controles de validao para garantir que os seguintes campos sejam preenchidos, ou seja, so campos obrigatrios: CdigoDoCliente NomeDaEmpresa
IMPORTANTE: Na segunda vez que a pgina for carregada, ser gerado um erro. Isso acontece porque, na segunda vez, estamos tentando cadastrar um cliente, com um CdigoDoCliente que j existe. Como o campo CdigoDoCliente do tipo Chave Primria, no podem existir dois clientes com o mesmo cdigo. Este erro mostrado na Figura 12.7.
www.juliobattisti.com.br
512
<html>
<script language=C# runat=server> // Declaro variveis que sero globais para a pgina.
OleDbDataAdapter MeuDataAdapter;
513
www.juliobattisti.com.br
MeuDataAdapter.Fill(ds,Clientes);
// Vamos definir o campo CdigoDoCliente como sendo a chave // primria da tabela Clientes.
www.juliobattisti.com.br
514
Linha[NomeDaEmpresa] = txtNomeDaEmpresa.Text; Linha[NomeDoContato] = txtNomeDoContato.Text; Linha[CargoDoContato] = txtCargoDoContato.Text; Linha[Endereo] Linha[Cidade] Linha[Regio] Linha[CEP] Linha[Pas] Linha[Telefone] Linha[Fax] = txtEndereo.Text; = txtCidade.Text; = txtRegio.Text; = txtCEP.Text; = txtPas.Text; = txtTelefone.Text; = txtFax.Text;
Clientes.Rows.Add(Linha);
// Agora crio os comandos necessrios para enviar // as alteraes/incluses/excluses para o banco // de dados NorthWind.mdb
MeuDataAdapter.InsertCommand= CriaComando.GetInsertCommand();
MeuDataAdapter.Update(ds,Clientes);
Label1.Text= Registro para o cliente: + txtNomeDaEmpresa.Text + Inserido com sucesso; Label2.Text=Preencha os campos abaixo para cadastrar outro Cliente;
515
www.juliobattisti.com.br
</script>
<body>
<h3><font face=Verdana> CADASTRO DE CLIENTES <BR> Empresa North Traders Ltda. </font> </h3>
www.juliobattisti.com.br
516
<form runat=server>
<asp:RequiredFieldValidator id=Requer_CdigoDoCliente ControlToValidate=txtCdigoDoCliente Type=String ErrorMessage=O Cdigo do Cliente campo Obrigatrio <BR> Text=O Cdigo do Cliente campo Obrigatrio. ForeColor=Red runat=server />
<asp:RequiredFieldValidator id=Requer_NomeDaEmpresa ControlToValidate=txtNomeDaEmpresa Type=String ErrorMessage=O Nome da Empresa campo Obrigatrio. Text=O Nome da Empresa campo Obrigatrio. ForeColor=Red runat=server />
<asp:RequiredFieldValidator id=Requer_Endereo ControlToValidate=txtEndereo Type=String ErrorMessage=O Endereo campo Obrigatrio. Text=O Endereo campo Obrigatrio. ForeColor=Red runat=server />
517
www.juliobattisti.com.br
<asp:RequiredFieldValidator id=Requer_Pas ControlToValidate=txtPas Type=String ErrorMessage=O Pas campo Obrigatrio. Text=O Pas campo Obrigatrio. ForeColor=Red runat=server />
<tr> <td> <p align=right> <B>Cdigo do Cliente: (*)</B> </td> <td> <asp:TextBox runat=server id=txtCdigoDoCliente Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" MaxLength=5" Height=20" Width=300" />
www.juliobattisti.com.br
518
</tr>
<tr> <td> <p align=right> <B>Nome da Empresa: (*)</B> </td> <td> <asp:TextBox runat=server id=txtNomeDaEmpresa Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" MaxLength=40" Height=20" Width=250" /> </td> </tr> <tr> <td> <p align=right> <B>Nome do Contato:</B> </td> <td> <asp:TextBox runat=server id=txtNomeDoContato Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" MaxLength=30"
519
www.juliobattisti.com.br
www.juliobattisti.com.br
520
521
www.juliobattisti.com.br
www.juliobattisti.com.br
522
523
www.juliobattisti.com.br
</body> </html>
www.juliobattisti.com.br
524
Ao carregar a pgina voc obtm o resultado indicado na Figura 12.8, onde apresentado um formulrio para que voc digite as informaes do cliente a ser Cadastrado.
525
www.juliobattisti.com.br
www.juliobattisti.com.br
526
NOTA: Na prtica, todos os campos da tabela Clientes so configurados para no aceitar valores nulos. Se voc, por exemplo, no digitar um valor para o campo Cidade (que no possui um campo de validao associado), na hora de salvar o registro ser gerado o erro indicado na Figura 12.11. Isto acontece porque o campo Cidade, na tabela Clientes, do Banco de dados NorthWind.mdb, no aceita valores nulos. Para solucionar esta opo, basta adicionar controles de validao do tipo RequiredFieldValidator, para todos os controles do formulrio. Desta forma, as informaes somente sero enviadas para o banco de dados, quando todos os controles estiverem preenchidos.
Observe o trecho da mensagem de erro, transcrito a seguir: Exception Details: System.Data.OleDb.OleDbException: O campo Clientes.Cidade no pode ser uma seqncia de caracteres de comprimento nulo. Para inserir o registro do cliente, na tabela Clientes, do Banco de dados NorthWind.mdb, utilizamos o evento OnClick do boto CadastraCliente. Criamos o procedimento InserirCliente, que executado em resposta ao evento OnClick do boto de comando.
527
www.juliobattisti.com.br
3.
Cria uma nova linha, define o valor dos campos desta linha e adiciona a linha coleo de linhas da tabela Clientes:
DataRow Linha = Clientes.NewRow();
Linha[CdigoDoCliente]
= txtCdigoDoCliente.Text;
Linha[NomeDaEmpresa] = txtNomeDaEmpresa.Text; Linha[NomeDoContato] = txtNomeDoContato.Text; Linha[CargoDoContato] = txtCargoDoContato.Text; Linha[Endereo] Linha[Cidade] Linha[Regio] Linha[CEP] Linha[Pas] = txtEndereo.Text; = txtCidade.Text; = txtRegio.Text; = txtCEP.Text; = txtPas.Text;
www.juliobattisti.com.br
528
Clientes.Rows.Add(Linha);
4.
Crio um objeto OleDbCommandBuilder, utilizo o mtodo GetInsertCommand deste objeto para definir a propriedade InsertCommand do objeto DataAdapter e chamo o mtodo Update do objeto DataAdapter:
OleDbCommandBuilder CriaComando = new OleDbCommandBuilder(MeuDataAdapter); MeuDataAdapter.InsertCommand= CriaComando.GetInsertCommand(); MeuDataAdapter.Update(ds,Clientes)
5.
Exibo informaes de que o cliente foi cadastrado com sucesso e limpo os valores contidos nos controles TextBox, para que o usurio possa digitar informaes de outro Cliente.
Label1.Text= Registro para o cliente: + txtNomeDaEmpresa.Text + Inserido com sucesso; Label2.Text=Preencha os campos abaixo para cadastrar outro Cliente; // Limpo o valor dos campos TextBox.
=;
=;
txtTelefone.Text =; txtFax.Text =;
Ok. Um novo Cliente foi cadastrado no Banco de dados NorthWind.mdb. A seguir veremos como definir as operaes de Excluso e Edio de registros. Para isso utilizaremos as propriedades DeleteCommand e UpdateCommand, do objeto DataAdapter.
529
www.juliobattisti.com.br
3.
Agora precisamos enviar as excluses para o banco de dados. Em primeiro lugar criamos um objeto do tipo OleDbCommandBuilder, associado ao objeto DataAdapter que estamos utilizando:
OleDbCommandBuilder CriaComando = new OleDbCommandBuilder(MeuDataAdapter);
Defino a propriedade DeleteCommand, do objeto DataAdapter. Posso definir esta propriedade manualmente ou utilizando o mtodo GetDeleteCommand do objeto OleDbCommandBuilder. No exemplo a seguir, utilizamos o mtodo GetDeleteCommand:
MeuDataAdapter.DeleteCommand= CriaComando.GetDeleteCommand();
Definidos os comandos necessrios hora de fazer com que eles sejam efetivamente executados no banco de dados. Para tal chamamos o mtodo Update do objeto DataAdapter:
MeuDataAdapter.Update(ds,Clientes);
Como parmetros para este mtodo, passamos o nome do DataSet e o nome da tabela a ser atualizada. O mtodo Update ir executar, no banco de dados, os comandos definidos na propriedade DeleteCommand. O resultado prtico desta operao que todos os registros que foram excludos do objeto DataTable sero excludos da tabela no banco de dados, ou seja, estamos sincronizando as alteraes feitas na cpia desconectada dos dados, com a cpia original dos dados. Aps a execuo do mtodo Update, os dois conjuntos de dados desconectados e originais so cpias idnticas. Para que possamos gerar os comandos automaticamente, utilizando um objeto do tipo CommandBuilder, algumas condies devem ser observadas: Os dados que formam uma tabela no objeto DataSet devem ter sido obtidos a partir de uma nica tabela no banco de dados. Por exemplo, se utilizamos as tabelas Pedidos e Detalhes do pedido, para obter uma listagem com o total por Pedido, precisaremos construir manualmente os comandos de atualizao, edio e excluso. Construir manualmente significa criar uma string com o comando SQL e atribuir esta String propriedade respectiva. A tabela deve ter uma Chave Primria. Pode ser uma Chave Primria simples (formada por uma coluna) ou uma Chave Primria composta por duas ou mais colunas. Os nomes de tabelas no podem conter caracteres especiais como espaos, pontos, aspas e outros caracteres que no sejam nmeros e letras.
www.juliobattisti.com.br
530
2.
Crio uma nova linha utilizando o mtodo NewRow, defino os valores para cada campo da linha e utilizo o mtodo Add, da coleo Rows, do objeto DataTable:
// Chamo o mtodo NewRow da tabela Clientes.
Linha[CdigoDoCliente]= txtCdigoDoCliente.Text; Linha[NomeDaEmpresa] = txtNomeDaEmpresa.Text; Linha[NomeDoContato] = txtNomeDoContato.Text; Linha[CargoDoContato] = txtCargoDoContato.Text; Linha[Endereo] Linha[Cidade] Linha[Regio] Linha[CEP] Linha[Pas] Linha[Telefone] Linha[Fax] = txtEndereo.Text; = txtCidade.Text; = txtRegio.Text; = txtCEP.Text; = txtPas.Text; = txtTelefone.Text; = txtFax.Text;
Clientes.Rows.Add(Linha);
3.
A linha foi adicionada ao conjunto de dados desconectados; agora precisamos enviar a adio para o banco de dados. Em primeiro lugar criamos um objeto do tipo OleDbCommandBuilder, associado ao objeto DataAdapter que estamos utilizando:
OleDbCommandBuilder CriaComando = new OleDbCommandBuilder(MeuDataAdapter);
Defino a propriedade InsertCommand, do objeto DataAdapter. Posso definir esta propriedade manualmente ou utilizando o mtodo GetInsertCommand do objeto OleDbCommandBuilder. No exemplo a seguir, utilizamos o mtodo GetInsertCommand:
MeuDataAdapter.InsertCommand= CriaComando.GetInsertCommand();
531
www.juliobattisti.com.br
Como parmetros para este mtodo, passamos o nome do DataSet e o nome da tabela a ser atualizada. O mtodo Update ir executar, no banco de dados, os comandos definidos na propriedade InsertCommand. O resultado prtico desta operao que a nova linha ser adicionada tabela do banco de dados original, ou seja, estamos sincronizando as alteraes feitas na cpia desconectada dos dados, com a cpia original dos dados. Aps a execuo do mtodo Update, os dois conjuntos de dados desconectados e originais so cpias idnticas.
Concluso
Neste captulo aprendemos tcnicas fundamentais para o trabalho com bancos de dados. Inicialmente aprendemos a realizar edies, incluses e excluses na cpia de dados desconectados, ou seja, nos dados de um objeto DataTable. Aprendemos a utilizar diversas propriedades e mtodos do objeto DataTable. Porm as alteraes precisam ser sincronizadas com o banco de dados originais. Na parte final do captulo aprendemos a enviar as alteraes feitas no objeto DataTable para o banco de dados original. Com isso mantemos sincronizadas as duas cpias dos dados. No prximo captulo falaremos sobre Web Services e sobre o novo ambiente de desenvolvimento do Framework .NET: Visual Studio .NET.
www.juliobattisti.com.br
532
PARTE
3
Conceitos Avanados do ASP.NET e Segurana
533
www.juliobattisti.com.br
Introduo
Na dcada de 70 tnhamos os dados e a lgica de programao instalados no Mainframe. Acessvamos estas aplicaes utilizando terminais para conectar com o Mainframe. Como uma evoluo surgiu o modelo Cliente/Servidor, onde tradicionalmente temos o banco de dados rodando no Servidor e a lgica e apresentao da aplicao, instaladas na estao do cliente. Este modelo mostrouse de difcil manuteno e atualizao e surgiu o modelo em trs camadas, onde a lgica fica armazenada no servidor de aplicaes, normalmente no formato de componentes COM/COM+, os dados no servidor de banco de dados e a apresentao no programa instalado no Cliente. Com o crescimento explosivo da Internet e, conseqentemente, com a consolidao dos protocolos Web, passamos a utilizar o Navegador como cliente e o modelo de desenvolvimento baseado em padres Web uma realidade. Mas a Tecnologia de Informao est sempre evoluindo, buscando mais eficincia e melhores resultados a custos mais razoveis. Dentro deste contexto surge a idia da construo e utilizao de software como se fossem servios. Por exemplo, ao invs de pagar um valor X, por uma licena do Office e receber um CD para instalao, voc paga, simplesmente, um valor mensal de assinatura e acessa o Office atravs da Internet. Utilizando o Navegador voc tem acesso ao Word, Excel, etc., podendo optar por salvar seus arquivos na mquina local ou no servidor do prestador de servios. A idia do aluguel de software est movimentando o mercado. As empresas que fornecem este tipo de servio so os chamados Applications Services Providers ASP. Para a criao de programas que possam ser acessados como servios, precisamos de alguma maneira poder criar pequenas unidades de software, com funcionalidades especficas e depois juntar estas pequenas unidades, para formar nossos programas. Em determinadas situaes pode ser vantajoso criar a funcionalidade internamente; em outras situaes pode ser mais interessante simplesmente pagar para ter acesso a um componente que j fornece a funcionalidade desejada. Por exemplo, se voc cria um site de Comrcio Eletrnico, pode ser mais vantajoso permitir que o seu sistema utilize um componente de validao de carto de crdito, disponvel no servidor da empresa que criou o componente, mediante um pagamento por acesso ou por ms, do que criar um componente a partir do zero. Com os Web Services do Framework .NET, podemos criar componentes que tenham as funcionalidades descritas no pargrafo anterior, ou seja, um componente com uma funcionalidade especfica, que pode ser acessado por qualquer aplicao, atravs da Web. Neste componente posso definir permisses de acesso, de tal maneira que somente possam utiliz-lo os usurios que esto pagando pelo servio.
CAPTULO
13
Web Services e Visual Studio .NET
www.juliobattisti.com.br
534
535
www.juliobattisti.com.br
www.juliobattisti.com.br
536
537
www.juliobattisti.com.br
O que Diferencia Web Services das Tecnologias de Componentes Como COM ou CORBA?
Caso voc conhea a tecnologia COM /COM+ da Microsoft ou CORBA, coordenada por um grupo de grandes empresas como Sun, Netscape, IBM, etc., pode estar se perguntando se Web Services no exatamente a mesma coisa. Em termos de funcionalidade devo concordar que a idia bastante semelhante, mas o que diferencia um Web Service o fato de este poder ser acessado a partir de qualquer servidor da Internet, utilizando um protocolo padro como o HTTP. J a tecnologia COM utiliza interfaces e formatos de mensagens, proprietrios. Surgiram algumas solues para acesso a componentes COM atravs da Internet, porm solues proprietrias. Os mesmos comentrios so vlidos para a tecnologia CORBA. O modelo de programao para a criao de Web Services semelhante, em muitos aspectos, ao modelo de criao e utilizao de componentes COM. O principal objetivo da tecnologia COM possibilitar aos programadores a criao de uma aplicao a partir de componentes prontos, componentes estes que fornecem funcionalidades especficas. Para atingir este objetivo, COM utiliza uma padro binrio (e proprietrio), para a definio das interfaces expostas por um componente COM. Embora o modelo COM facilite a localizao e utilizao de componentes, o modelo est restrito quelas plataformas capazes de entender o mtodo proprietrio de comunicao, definido na especificao COM. O principal objetivo dos Web Services possibilitar aos desenvolvedores uma maneira fcil para integrar aplicaes e dados de diferentes plataformas. Com Web Services somos capazes de integrar aplicaes criadas em diferentes plataformas e em diferentes linguagens. Para tal, diferentemente do COM, os Web Services so baseados em padres abertos (XML, SOAP, HTTP, etc.), padres estes amplamente utilizados atualmente. Ao invs de um mtodo binrio para comunicao entre aplicaes, os Web Services utilizam um mecanismo de comunicao baseado em XML. O XML passa a ser uma espcie de Linguagem Universal para troca de dados e mensagens entre aplicaes. Bem, chega de teoria. Agora vamos aprender a criar e a utilizar Web Services. Primeiro aprenderemos a criar um Web Service para, em seguida, aprender a utilizar Web Services em uma pgina ASP.NET.
www.juliobattisti.com.br
538
Tabela 13.1 Imposto a ser aplicado para cada estado. Estado RS SC PR SP RJ Outros % Imposto 12 15 17 20 22 25
No nosso exemplo, vamos chamar a classe de CalculosLegais. Para definir a classe CalculosLegais utilizamos o seguinte comando:
<%@ WebService Language=C# class=CalculosLegais %>
O prximo passo fazer referncia ao namespace System.Web.Services. Este namespace contm as classes que do suporte criao de Web Services:
using System.Web.Services;
539
www.juliobattisti.com.br
using System.Web.Services;
public class CalculosLegais : WebService { [WebMethod] public double CalculaImposto(long Total,int Desconto, string Estado) { long ValorComDesconto; ValorComDesconto = switch (Estado) { case RS: return ValorComDesconto*1.12; break; case SC: return ValorComDesconto*1.15; break; case PR: return ValorComDesconto*1.17; break; case SP: return ValorComDesconto*1.2; break; Total * (1-(Desconto/100));
www.juliobattisti.com.br
540
541
www.juliobattisti.com.br
www.juliobattisti.com.br
542
<?xml version=1.0" encoding=utf-8"?> <soap:Envelope xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd=http://www.w3.org/2001/XMLSchema xmlns:soap=http://schemas.xmlsoap.org/ soap/envelope/> <soap:Body> <CalculaImposto xmlns=http://tempuri.org/> <Total>long</Total> <Desconto>int</Desconto> <Estado>string</Estado> </CalculaImposto> </soap:Body> </soap:Envelope> HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length
543
www.juliobattisti.com.br
HTTP GET: Este um dos mtodos mais antigos utilizados para enviar informaes atravs de uma requisio HTTP. Com este mtodo, as informaes so enviadas na prpria URL, conforme pode ser visto pelo exemplo de requisio/resposta a seguir:
GET /Chap13/CalculosLegais.asmx/ CalculaImposto?Total=string&Desconto=string&Estado=string HTTP/1.1 Host: localhost
Observe que os dados so passados, na forma de string, no prprio endereo. Onde temos Total=string, devemos substituir string pelo valor realmente definido para o parmetro, como por exemplo:
/Chap13/CalculosLegais.asmx/CalculaImposto?Total=1250&Desconto=25&Estado=RS
HTTP POST: Este mtodo um pouco mais sofisticado do que o mtodo GET. A principal diferena do mtodo POST que, com este mtodo, as informaes so enviadas na requisio HTTP e no na URL, como acontecia com o mtodo GET. Observe o exemplo de requisio/resposta a seguir:
POST /Chap13/CalculosLegais.asmx/CalculaImposto HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: length Total=1250&Desconto=25&Estado=RS HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length
www.juliobattisti.com.br
544
545
www.juliobattisti.com.br
Onde X: o drive onde est instalado o Framework .NET. Se voc estiver utilizando o Windows 2000 em ingls, ao invs da pasta Arquivos de Programas, procure na pasta Programs Files. A sintaxe para o utilitrio Wsdl.exe a seguinte:
Wsdl /language:language /protocol:protocol /namespace:myNameSpace /out:filename / username:username /password:password /domain:domain <url or path>
Tabela 13.2 Parmetros para Wsdl.exe. Parmetro /language:language Descrio Opcional. Pode ser utilizado para definir uma das linguagens habilitadas ao .NET: CS para CSharp, VB para VB.NET e JS para JScript.NET. Se no for especificado, ser utilizado CS, que corresponde ao C#. Opcional. Define o protocolo utilizado para invocar os mtodos do Web Service. O padro SOAP. Tambm pode ser utilizado: HttpGet e HttpPost. Opcional. Define o namespace do Proxy gerado. Opcional. Define o nome do arquivo que ser gerado, contendo o proxy. O nome padro baseado no nome do Web Service. Opcional. Nome do usurio com o qual fazer a conexo, quando o servidor, onde est o Web Service, requer autenticao. Opcional. Senha para o usurio definido no parmetro anterior. Opcional. Nome do domnio ao qual pertence o usurio especificado no parmetro / username:username.<url ou path>: Este o nico parmetro obrigatrio. Define uma URL ou um caminho para o arquivo que descreve o Web Service, arquivo este que deve estar no formato WSDL (Web Services Description Language). Se for um arquivo, especificamos o caminho para um arquivo com a extenso .wsdl. Se utilizarmos uma URL, a URL deve apontar para o arquivo .asmx ou para uma pgina que retorna uma descrio do arquivo, no formato WSDL.
www.juliobattisti.com.br
546
e pressione ENTER. Ser gerado um arquivo .cs (lembre que a linguagem padro o CSHarp, para a gerao de proxies), no mesmo diretrio onde o comando foi executado. No nosso exemplo, indicado na Figura 13.6, foi gerado o arquivo CalculosLegais.cs, no drive D:
547
www.juliobattisti.com.br
// </autogenerated> // // // This source code was auto-generated by wsdl, Version=1.0.2914.16. // using System.Diagnostics; using System.Xml.Serialization; using System; using System.Web.Services.Protocols; using System.Web.Services;
public System.Double CalculaImposto(long Total, int Desconto, string Estado) { object[] results = this.Invoke(CalculaImposto, new object[] { Total, Desconto, Estado}); return ((System.Double)(results[0])); }
www.juliobattisti.com.br
548
[System.Diagnostics.DebuggerStepThroughAttribute()] public System.Double EndCalculaImposto(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((System.Double)(results[0])); } }
O arquivo CalculosLegais.cs compilado e a DLL CalculosLegais.dll gerada, conforme indicado na Figura 13.7. Parmetros utilizados para o compilador csc: O parmetro /t:library: Indica que o cdigo-fonte deve ser compilado e o resultado deve ser uma DLL. Outras opes seriam: /t:winexe, para gerar um programa executvel do Windows ou /t:exe, para gerar um programa do tipo console. /out: Define o nome do arquivo gerado pela compilao. CalculosLegais.cs: O arquivo a ser compilado. /r: Faz referncia aos metadados dos arquivos .dll especificados.
549
www.juliobattisti.com.br
NOTA: Para uma relao completa de todas as opes do compilador csc, digite: csc /? e pressione Enter.
Vou criar a pasta bin, dentro da pasta Chap13 e depois copiar a DLL CalculosLegais.dll para a pasta bin, conforme indicado na Figura 13.8:
www.juliobattisti.com.br
550
IMPORTANTE: Alm de disponibilizar a DLL, importante que a pasta onde esta a pgina ASP.NET que utilizar o Web Service seja configurada como um aplicativo. No nosso exemplo, criaremos uma pgina na pasta D:\InetPub\wwwroot\Chap13, porm esta pasta ainda no est configurada como um Aplicativo; Vamos configurar a pasta Chap13 como um aplicativo, para isso siga os seguintes passos:
1. 2. 3. 4. 5. 6.
Abra o gerenciador do IIS (Iniciar -> Programas -> Ferramentas Administrativas Gerenciador de servios de Internet). Na janela que surge d um clique no sinal de mais ao lado do nome do servidor que voc est utilizando. No meu exemplo, o nome do equipamento servidor. Nas opes que surgem d um clique no sinal de mais ao lado da opo Site da Web padro, para expandi-la. Nas pastas que surgem, clique com o boto direito na pasta Chap13 e, no menu de opes, clique em Propriedades. Surge a janela Propriedades de Chap13. Na guia Pasta, temos as opes para tornar Chap13 uma aplicao Web. D um clique no boto Criar. Certifique-se de que as opes da guia Pasta estejam configuradas conforme indicado na Figura 13.9.
551
www.juliobattisti.com.br
public void {
Enviar_Click(Object sender,EventArgs e)
www.juliobattisti.com.br
552
double txtValorFinal;
: + txtValor +\n+
<body>
<asp:RequiredFieldValidator id=Requer_Valor ControlToValidate=Valor Type=String ErrorMessage=* Text=DIGITE UM VALOR PARA O PREO. ForeColor=Red runat=server
553
www.juliobattisti.com.br
<asp:RequiredFieldValidator id=Requer_Desconto ControlToValidate=Desconto Type=String ErrorMessage=* Text=DIGITE UM VALOR PARA O DESCONTO. ForeColor=Red runat=server />
<table> <tr> <td><B>Selecione o Estado:</B> </td> <td> <asp:DropDownList id=Estado runat=server> <asp:ListItem>RS</asp:ListItem> <asp:ListItem>SC</asp:ListItem> <asp:ListItem>PR</asp:ListItem> <asp:ListItem>SP</asp:ListItem> <asp:ListItem>RJ</asp:ListItem> <asp:ListItem>Outros</asp:ListItem> </asp:DropDownList> </td> </tr>
<td><B>Preo:</B> </td> <td> <asp:TextBox runat=server id=Valor Text= Font_Face=Arial Font_Size=3" BackColor=Cyan ForeColor=Blue TextMode=SingleLine
www.juliobattisti.com.br
554
</td> </tr>
<asp:TextBox runat=server id=Desconto Text= Font_Face=Arial Font_Size=3" BackColor=Cyan ForeColor=Blue TextMode=SingleLine Columns=40" />
</td> </tr>
<tr> <td><B>Valor Final:</B></td> <td><textarea id=Exibe cols=40" rows=5" runat=server /> </td> </tr>
555
www.juliobattisti.com.br
</form>
</body> </html>
Digite o cdigo da Listagem 13.1 e salve o mesmo em um arquivo chamado chap13ex1.aspx, na pasta chap13, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap13/chap13ex1.aspx Ao carregar a pgina, digite os seguintes valores: Selecione RS na lista de Estados. Digite 1200 no campo Preo. Digite 20 no campo Desconto. D um clique no boto Calcular. Voc obtm o resultado indicado na Figura 13.11. Comentrios sobre o cdigo do exemplo Chap13ex1.aspx. Para construo do formulrio, alm dos controles para entrada de informaes, utilizamos dois controles de validao, para garantir que os campos Preo e Desconto sejam preenchidos. Utilizamos o evento Click do boto, para criar a lgica da pgina. Em resposta ao evento Click, definimos o procedimento Enviar_Click. Neste procedimento ns seguimos as seguintes etapas: 1. Criamos uma varivel ChamaCalculo, a qual uma instncia do WebService CalculosLegais:
CalculosLegais ChamaCalculo = new CalculosLegais();
2.
Utilizamos algumas variveis do tipo String, para armazenar os valores que o usurio inseriu no formulrio:
string txtEstado; string txtValor; string txtDesconto; txtEstado=Estado.SelectedItem.Value; txtValor=Valor.Text; txtDesconto=Desconto.Text;
www.juliobattisti.com.br
556
4.
Como a varivel ChamaCalculo do tipo CalculosLegais, esta varivel herda o mtodo CalculaImposto do Web Service CalculosLegais. Chamamos este mtodo para fazer o clculo do preo final, com base no Estado selecionado, no Preo informado e no percentual de desconto. Estes valores so passados como parmetros para o mtodo CalculaImposto. Observe que temos que fazer as devidas converses, pois caso contrrio obteremos um erro. Por exemplo, o parmetro txtValor do tipo String, porm o mtodo CalculaImposto espera receber um parmetro do tipo int. Utilizamos Convert.Int32 para fazer a converso:
txtValorFinal = ChamaCalculo.CalculaImposto(Convert.ToInt32(txtValor), Convert.ToInt32(txtDesconto), txtEstado);
5.
Em seguida montamos uma string que exibe os valores digitados pelo usurio e o valor calculado pelo mtodo CalculaImposto. Esta string atribuda propriedade Text, do controle Exibe:
Exibe.Value = Preo Inicial: + txtValor +\n+ Estado Desconto : + txtEstado + \n+ : + txtDesconto + \n+
Observe que agora podemos reaproveitar a funcionalidade do mtodo CalculaImposto em qualquer pgina ASP.NET da aplicao Chap13.
557
www.juliobattisti.com.br
IMPORTANTE: Para que voc possa acompanhar os exemplos deste tpico, fazse necessrio que voc tenha o Visual Studio .NET instalado. A instalao do Visual Studio .NET bastante simples, sendo idntica instalao de qualquer aplicativo Windows. Embora simples, o processo todo demora cerca de duas horas. Voc pode obter uma verso de avaliao do Visual Studio .NET, no seguinte endereo: http:// msdn.microsoft.com/ vstudio/nextgen/beta.asp
www.juliobattisti.com.br
558
559
www.juliobattisti.com.br
www.juliobattisti.com.br
560
561
www.juliobattisti.com.br
www.juliobattisti.com.br
562
563
www.juliobattisti.com.br
26. Abra o Internet Explorer e acesse o seguinte endereo: http://servidor/AppWebChap13/WebForm1.aspx 27. Voc obter os resultados indicados na Figura 13.19. 28. Agora vamos analisar o cdigo gerado pelo Visual Studio. 29. Para acessar o cdigo da pgina WebForm1.aspx, d um clique na opo HTML, que aparece ao lado da opo Design, na base da pgina, conforme indicado na Figura 13.20. O modo Design o modo grfico, onde vamos arrastando os elementos para a pgina e o modo HTML o modo onde exibido o cdigo da pgina.
www.juliobattisti.com.br
564
31. Agora vamos ver uma das pequenas maravilhas do Visual Studio. 32. Clique no controle Label, aps a opo runat=server. Vamos definir que o texto deve ser exibido em negrito. Para isso voc lembra que existe uma propriedade Font..., alguma coisa. 33. Experimente, simplesmente teclar a barra de espaos e observe: Ser exibida uma lista com todas as propriedades, mtodos e eventos disponveis para o controle do tipo Label, conforme indicado na Figura 13.21.
565
www.juliobattisti.com.br
2.
Na janela Add New Item que aberta, seleciona a opo Web Form. No campo Name, digite Form2.aspx, conforme indicado na Figura 13.23.
www.juliobattisti.com.br
566
567
www.juliobattisti.com.br
11. Para adicionar itens em um controle DropDownList utilizamos a propriedade Items, do controle SelecionaPais. D um clique neste controle para selecion-lo. Na lista de propriedades, na janela de propriedades, localize a propriedade Items. Ao clicar nesta propriedade ser habilitado um boto com reticncias (...), ao lado da propriedade. D um clique no boto com as reticncias, e ser exibida a janela ListItem Collection Editor. Para adicionar um item lista, clique no boto Add. Na coluna da direita, sero exibidos os campos para definio do item. Para o primeiro item, defina as propriedades conforme indicado na Figura 13.25. 12. Utilize o boto Add para adicionar os demais itens. No final a sua janela deve estar conforme indicado na Figura 13.26. 13. D um clique no boto OK e, pronto, a lista ser construda.
www.juliobattisti.com.br
568
569
www.juliobattisti.com.br
19. Na lista de pases selecione Chile. 20. No campo Nome digite: Jos da Silva. 21. No campo e-mail digite: jsilva@abc.com.br. 22. D um clique no boto Enviar Dados. 23. Voc obtm os resultados indicados na Figura 13.28. 24. Mantenha o Visual Studio .NET aberto. Vamos criar mais um exemplo, onde aprenderemos a conectar com um banco de dados, utilizando o Visual Studio.
www.juliobattisti.com.br
570
2. 3. 4. 5. 6. 7.
Na janela Add New Item que aberta, selecione a opo Data Form Wizard. No campo Name, digite data.aspx, conforme indicado na Figura 13.29. D um clique no boto Open. A primeira tela do assistente Data Form Wizard ser exibida. D um clique no boto Next, seguindo para a prxima etapa do assistente. Nesta etapa temos a opo de criar um novo objeto DataSet. D um clique na opo Create a new dataset named: e no campo nome digite: ListaDePedidos, conforme indicado na Figura 13.30.
571
www.juliobattisti.com.br
www.juliobattisti.com.br
572
573
www.juliobattisti.com.br
www.juliobattisti.com.br
574
575
www.juliobattisti.com.br
26. D um clique no boto Finish. 27. O assistente ser encerrado e a pgina data.aspx. ser criada, conforme indicado na Figura 13.35.
29. Agora vamos testar a pgina dados.aspx. 30. Salve as alteraes: File -> Save All. 31. Vamos enviar as alteraes para o servidor: Build -> Build.
www.juliobattisti.com.br
576
Figura 13.36: Pgina data.aspx criada com o assistente Web Data Wizard.
Observe que com a ajuda do assistente criamos rapidamente um formulrio que exibe dados de duas tabelas diferentes, do Banco de dados NorthWind, do SQL Server 2000. Evidentemente que o assistente no a soluo para todos os casos. Eu aconselho que voc utilize o assistente para criar as funcionalidades bsicas da pgina e depois faa as alteraes necessrias. Conforme descrito no incio deste tpico, o Visual Studio .NET assunto para um livro inteiro. Para o escopo proposto, encerramos o nosso estudo do Visual Studio por aqui.
Concluso
Neste captulo aprendemos sobre o conceito de Web Services como uma forma de criar aplicaes distribudas, onde as funcionalidades da aplicao podem ser fornecidas por Web Services localizados em diferentes servidores, atravs da Internet.
577
www.juliobattisti.com.br
Em seguida apresentamos o novo ambiente de desenvolvimento para o ambiente .NET: Visual Studio .NET. Falamos sobre as principais caractersticas do novo ambiente e aprendemos, passo a passo, a criar algumas pginas ASP.NET, utilizando o ambiente grfico do Visual Studio .NET. No prximo captulo falaremos sobre a segurana de aplicaes e pginas ASP.NET.
www.juliobattisti.com.br
578
Introduo
Quando se fala de Internet nos dias de hoje, o assunto mais tratado, sem nenhuma dvida, sobre Segurana. Muitos relatos, alguns verdadeiros e outros mais fantasiosos, sobre invases mirabolantes, roubo de nmero de cartes de crditos, acesso a informaes sigilosas de rgos governamentais e assim por diante. No podemos negar que o problema de segurana existe e crtico, principalmente no momento em que o Comrcio Eletrnico , mais do que uma realidade, uma necessidade e um diferencial competitivo para as empresas. O diferencial competitivo no entrar ou no no mundo do Comrcio Eletrnico, o diferencial criar servios agregados ao Comrcio Eletrnico, capazes de gerar diferenciais competitivos. Assuntos como fidelizao do cliente, melhorias nos sistemas de CRM Customer Relationship Management (Gerenciamento das Relaes com o Cliente), B2B Bussines to Bussines, B2C Bussines to Consumer e outros, esto em evidncia. Porm sistemas de Comrcio Eletrnico, CRM e assemelhados exigem acesso a um conjunto de dados estratgicos da empresa. Uma vez que estes sistemas esto acessveis Internet, os dados empresariais precisam estar protegidos. Neste ponto que a questo segurana de fundamental importncia. Existem os mais variados tipos de ataques pela Internet. Um engano comum pensar que o nico tipo de ataque capaz de causar prejuzos aquele que rouba ou destri dados. No caso de um site de comrcio eletrnico, qualquer ataque que torne o site indisponvel por um determinado perodo de tempo causa prejuzos incalculveis, pois alm das compras que deixaram de ser feitas no perodo de indisponibilidade, tem a questo da imagem da empresa, sem contar que o cliente pode ter feito a compra no site do concorrente e passar a fazer as prximas compras tambm do concorrente. Por todos estes motivos que a questo de segurana fundamental e deveria ser prioritria quando tratamos de aplicaes Web. Outro fato importante a ser mencionado que a maioria dos ataques, ao contrrio do que muitos pensam, originado dentro da Intranet da prpria empresa. Pode ser um funcionrio descontente ou desonesto, ou um usurio com permisses de acesso indevidas, que causa algum prejuzo por impercia tcnica. O fato que a questo de segurana no deve ser tratada apenas como uma questo de proteo contra as foras do mal que vm da Internet. O fato que precisamos definir uma poltica de segurana que permita que todos possam realizar o seu trabalho, porm com os nveis de permisso adequados. Alm de definir uma poltica de segurana, necessria a ampla divulgao da mesma. alarmante constatar que muitas empresas no possuem uma poltica de segurana definida, ou, quando tm, a poltica no adequadamente divulgada.
CAPTULO
14
Segurana de Aplicaes Web com o IIS 5.0 e ASP.NET
579
www.juliobattisti.com.br
NOTA: Para acompanhar este captulo o usurio deve conhecer alguns aspectos bsicos do Windows 2000 Server, tais como:
Permisses NTFS. Contas de Usurios e
Grupos de Usurios.
Utilizao do MMC
DICA: Para informaes sobre estes itens, consulte o livro Srie Curso Bsico & Rpido Microsoft Windows 2000 Server de minha autoria, publicado pela editora Axcel Books.
www.juliobattisti.com.br
580
Autenticao Annima
Um tipo de autenticao bastante comum o que permite o acesso annimo. O IIS permite que seja configurado um tipo de acesso chamado Acesso annimo, no qual no necessrio que o usurio fornea um Username e senha para ter acesso ao site. Este acesso annimo est ligado a uma nica Conta de usurio do Windows 2000 Server. Todo usurio que acessar um site configurado para permitir Acesso annimo, ser identificado como se estivesse autenticado usando a Conta de usurio configurada para o Acesso annimo. A conta de usurio para Acesso annimo automaticamente criada quando instalamos o Internet Information Services 5.0. Por padro esta conta possui o seguinte nome:
IUSR_NOME_DO_COMPUTADOR
Por exemplo, ao instalarmos o IIS em um servidor chamado SERVIDOR, ser criada a seguinte conta para permitir o Acesso annimo:
IUSR_SERVIDOR
A autenticao annima fornece aos usurios acesso a reas pblicas do seu site, sem solicitar um nome de usurio ou uma senha. Por padro, a conta IUSR_NOME_DO_COMPUTADOR includa no grupo de usurios Convidados. Esse grupo tem restries de segurana, impostas pelas permisses do NTFS (sistema de arquivos do Windows 2000 que possui recursos de segurana mais avanados do que o sistema FAT ou FAT32), que designam o nvel de acesso e o tipo de contedo disponvel para os usurios pblicos. Com isso o usurio possui limitaes sobre os recursos que ele pode acessar no servidor, sendo que estas limitaes j atuam como um nvel inicial de segurana.
581
www.juliobattisti.com.br
www.juliobattisti.com.br
582
IMPORTANTE:
Se a autenticao annima for ativada, o IIS tentar sempre a autenticao annima, usando-a primeiro,
conta usada para a autenticao annima no Snap-in do IIS, no nvel de servio do servidor Web ou para diretrios virtuais ou arquivos individuais.
A conta annima deve ter o seguinte direito de usurio: Efetuar logon localmente. Se a conta no tiver a
permisso Efetuar logon localmente, o IIS no poder atender qualquer solicitao annima. Ao instalarmos o IIS, automaticamente, a permisso Efetuar logon localmente concedida conta IUSR_NOME_DO_COMPUTADOR.
Agora vamos aprender a efetuar as seguintes atividades prticas: Definir a conta para acesso annimo no IIS. Verificando a que grupos pertence a conta IUSR_NOME_DO_SERVIDOR. Verif icando a permisso Efetuar logon local para a conta IUSR_NOME_DO_SERVIDOR. Definindo permisses NTFS para uma conta de usurio. Estas atividades so importantes, no s para as configuraes do Acesso annimo, mas para a configurao de qualquer tipo de acesso.
NOTA: As contas IUSR_NOME_DO_COMPUTADOR em controladores de domnio no so adicionadas ao grupo Convidados do domnio, por padro, e devem ser alteradas para Efetuar logon localmente a fim de permitir logon annimo.
DICA: Para informaes mais detalhadas sobre estes itens, consulte o livro Srie Curso Bsico & Rpido Microsoft Windows 2000 Server de minha autoria, publicado pela editora Axcel Books.
Podemos configurar o Acesso annimo para todas as aplicaes Web contidas no Servidor ou para cada aplicao individualmente. Inclusive podemos configurar diferentes contas do Windows 2000 Server, para serem utilizadas para o Acesso annimo em diferentes reas do site. Podemos configurar uma conta em nvel do Servidor Web, de cada aplicao e at mesmo para uma pasta dentro de uma aplicao. Com isso poderamos ter diferentes pastas,
583
www.juliobattisti.com.br
www.juliobattisti.com.br
584
585
www.juliobattisti.com.br
www.juliobattisti.com.br
586
IMPORTANTE: A sincronizao de senhas deve ser usada somente com contas de usurio annimas definidas no computador local e no com contas annimas de computadores remotos.
Conforme descrito anteriormente, a conta IUSR_NOME_DO_COMPUTADOR deve ter algumas configuraes especiais (relativas a permisses e direitos), definidas no Windows 2000 Server. Agora veremos como conferir se as
NOTA: Para definir uma conta de acesso annimo diferente para uma das aplicaes Web do site, ou at mesmo para uma subpasta de uma aplicao Web, basta repetir os passos indicados.
NOTA: Se o servidor que voc estiver utilizando for um controlador de domnio, voc deve abrir o Console para gerenciamento do Active Directory. As opes que surgem podem ser um pouco diferentes das apresentadas neste passo-a-passo.
587
www.juliobattisti.com.br
www.juliobattisti.com.br
588
589
www.juliobattisti.com.br
DICA: Para informaes mais detalhadas sobre Controladores de domnio e Active Directory, consulte o livro Srie Curso Bsico & Rpido Microsoft Windows 2000 Server, de minha autoria, publicado pela editora Axcel Books.
NOTA: Se o servidor que voc estiver utilizando for um controlador de domnio, voc deve abrir o Console para gerenciamento do Active Directory. As opes que surgem podem ser um pouco diferentes das apresentadas neste passoa-passo.
www.juliobattisti.com.br
590
591
www.juliobattisti.com.br
www.juliobattisti.com.br
592
593
www.juliobattisti.com.br
Tabela 14.1 Permisses NTFS para pastas. Permisso Leitura Gravar Listar Contedo de pastas Ler e executar Nvel de acesso Permite ao usurio listar as pastas e arquivos dentro da pasta, permite que sejam exibidas as permisses, donos e atributos. Permite ao usurio criar novos arquivos e subpastas dentro da pasta, alterar os atributos da pasta e visualizar o dono e as permisses da pasta. Permite ao usurio ver o nome dos arquivos e subpastas. Permite ao usurio navegar atravs das subpastas para chegar a outras pastas e arquivos, mesmo que o usurio no tenha permisso de acesso s pastas pelas quais est navegando; alm disso possui os mesmos direitos que as permisses Leitura e Listar Contedo de pastas.
www.juliobattisti.com.br
594
Nvel de acesso Permite ao usurio eliminar a pasta, mais todas as aes permitidas pela permisso Gravar e pela permisso Ler e executar. Permite que sejam alteradas as permisses, permite ao usurio tornar-se dono da pasta, eliminar subpastas e arquivos, mais todas as aes permitidas por todas as outras permisses NTFS.
Tabela 14.2 Permisses NTFS para arquivos. Permisso Leitura Gravar Ler e executar Modificar Controle total Nvel de acesso Permite ao usurio ler o arquivo, permite que sejam exibidas as permisses, donos e atributos. Permite ao usurio gravar um arquivo com o mesmo nome sobre o arquivo, alterar os atributos da pasta e visualizar o dono e as permisses da pasta. Permite ao usurio executar aplicativos (normalmente programas .exe, .batou .com), mais todos os direitos da permisso Leitura. Permite ao usurio modificar e eliminar o arquivo, mais todas as aes permitidas pela permisso Gravar e pela permisso Ler e executar. Permite que sejam alteradas as permisses, permite ao usurio tornar-se dono do arquivo, mais todas as aes permitidas por todas as outras permisses NTFS.
Todo arquivo ou pasta em uma unidade formatada com NTFS possui uma Lista de controle de acesso (Access Control List) ACL. Nesta ACL fica uma lista de todas as contas de usurios e grupos para os quais foi garantido acesso para o recurso, bem como o nvel de acesso de cada um deles. Existem alguns detalhes que devemos observar sobre permisses NTFS: Permisses NTFS so cumulativas, isto , se um usurio pertence a mais de um grupo, o qual tem diferentes nveis de permisso para um recurso, a permisso efetiva do usurio a soma das permisses. Permisses NTFS para um arquivo tm prioridade sobre permisses NTFS para pastas. Por exemplo se um usurio tem permisso NTFS de escrita em uma pasta, mas somente permisso NTFS de leitura para um arquivo dentro desta pasta, a sua permisso efetiva ser somente a de leitura, pois a permisso para o arquivo tem prioridade sobre a permisso para a pasta. Negar uma permisso NTFS tem prioridade sobre permitir. Por exemplo, se um usurio pertence a dois grupos diferentes. Para um dos grupos foi dada permisso de leitura para um arquivo, e para o outro grupo foi negada a permisso de leitura; o usurio no ter o direito de leitura, pois Negar tem prioridade sobre Permitir.
595
www.juliobattisti.com.br
www.juliobattisti.com.br
596
597
www.juliobattisti.com.br
10. Vamos remover as permisses da conta IUSR_SERVIDOR (Conta de convidado da Internet). Para isso d um
Figura 14.19: Lista de permisses, onde foi retirada a permisso de acesso para o usurio annimo.
18. D um clique no boto OK para fechar esta janela. Para testar se o acesso realmente foi retirado.
www.juliobattisti.com.br
598
Figura 14.20: Mensagem de erro ao tentar acessar uma pgina para a qual o usurio annimo (conta IUSR_SERVIDOR no nosso exemplo) no tem mais permisso de acesso.
Caso voc teste o acesso localmente no servidor onde a pgina est gravada e a autenticao integrada esteja habilitada, voc ter acesso pgina. Isto acontece porque primeiro o IIS tenta acesso com a autenticao annima. No obtm sucesso. Se a autenticao integrada (a autenticao integrada utiliza a conta do Windows que voc utilizou para fazer o logon) estiver habilitada, o IIS tenta utiliz-la. Caso a conta que voc utilizou para fazer o logon tenha permisso de acesso pgina, o IIS libera o acesso. Isto tambm vlido para usurios da sua rede local que fizeram o logon em um domnio do Windows NT Server 4.0 ou do Windows 2000 e cujas contas ou grupos a que pertencem possuam permisso de acesso para o arquivo solicitado. Nos prximos itens veremos mais sobre a autenticao integrada. Agora vamos restaurar as permisses NTFS para o usurio IUSR_SERVIDOR e testar para ver se ele voltou a ter acesso. Para atribuir novamente as permisses NTFS para o usurio IUSR_SERVIDOR. 1. 2. 3. Utilizando o Windows Explorer, localize a pasta cujas permisses NTFS sero alteradas. D um clique com o boto direito do mouse sobre a pasta. No menu de opes que surge d um clique em Propriedades. Na janela de propriedades d um clique na guia Segurana.
599
www.juliobattisti.com.br
www.juliobattisti.com.br
600
601
www.juliobattisti.com.br
Figura 14.26: Adicionando o usurio IUSR_SERVIDOR na lista de usurios que tm permisso de acesso pasta selecionada.
www.juliobattisti.com.br
602
Autenticao Bsica
A autenticao bsica uma das mais antigas formas de autenticao que existem, desenvolvidas desde a poca dos primeiros servidores Web como o NCSA e o Cern HTTP. Neste tipo de autenticao, o usurio precisa fornecer um
603
www.juliobattisti.com.br
IMPORTANTE: A autenticao integrada do Windows (que veremos logo em seguida) tem prioridade sobre a autenticao bsica. O navegador escolher a autenticao integrada do Windows e tentar usar as informaes de logon atuais do Windows antes de solicitar ao usurio um nome de usurio e uma senha. Atualmente, somente o Internet Explorer, verso 2.0 e posterior, oferece suporte autenticao integrada do Windows.
www.juliobattisti.com.br
604
NOTA: O Internet Explorer, verso 4.0 e posterior, pode ser configurado para solicitar inicialmente informaes do usurio, se necessrio. Para obter mais informaes, consulte a documentao do Internet Explorer.
605
www.juliobattisti.com.br
www.juliobattisti.com.br
606
10. D um clique na guia Segurana de pasta. Sero exibidas as opes indicadas na Figura 14.29. 11. A primeira opo desta guia Controle de acesso annimo e autenticao. D um clique no boto Editar, ao lado desta opo. Surge a janela Mtodos de autenticao, indicada na Figura 14.30. 12. Observe que, por padro, esto definidas as opes de Acesso annimo e Autenticao integrada do Windows. 13. Nesta janela voc pode definir qual ou quais tipos de autenticao que o servidor IIS dever suportar para o site Web padro. Alm disso, voc pode configurar qual a conta que ser utilizada para o acesso annimo, conforme descrito anteriormente.
607
www.juliobattisti.com.br
www.juliobattisti.com.br
608
Figura 14.31: Aviso de que para a autenticao bsica a senha transmitida sem criptografia.
15. D um clique em Sim e a autenticao bsica ser habilitada. 16. D um clique no boto OK para fechar a janela de configurao dos tipos de autenticao. 17. Voc estar de volta janela de Propriedades do site Web padro. D um clique no boto OK para fech-la. 18. Caso alguma aplicao Web ou pasta virtual do Servidor possua uma configurao diferente da definida para o site Web padro, o IIS abre uma janela informando qual site possui uma configurao diferente e perguntando se voc deseja estender as configuraes do site Web padro para as pastas virtuais e aplicativos Web internos, conforme indicado na Figura 14.32.
609
www.juliobattisti.com.br
www.juliobattisti.com.br
610
NOTA: Caso voc no tenha criado uma pasta virtual Capitulo6, utilize qualquer pasta virtual disponvel no seu servidor IIS.
Figura 14.34: Listagem exibida quando a opo Pesquisa em Pasta est habilitada.
611
www.juliobattisti.com.br
Figura 14.35: Mensagem de erro quando a opo Pesquisa em Pasta estiver desabilitada.
Criar log de visitantes: Selecione esta opo para registrar as visitas feitas a este diretrio em um arquivo de log. As visitas sero registradas somente se o log estiver ativado para este site da Web. Indexar este recurso: Para permitir que o Servio de indexao da Microsoft (Index Services) inclua este diretrio em um ndice de texto completo do site da Web, selecione esta opo. De uma maneira geral, recomendo que as opes Gravao e Pesquisa em pasta somente sejam marcadas em situaes especiais e para reas que no contenham dados confidenciais. Uma questo importante sobre a combinao entre as permisses definidas no IIS e as permisses NTFS. Por exemplo, vamos supor que o usurio tenha sido autenticado como usurio annimo e est tentando gravar contedo em uma pasta virtual na qual o IIS possui permisso de gravao, porm as permisses NTFS no permitem que o usurio annimo faa gravaes. Como fica esta combinao ? Quando uma pgina solicitada, o IIS segue a seqncia indicada na Figura 14.36. Observe que primeiro o IIS verifica se o usurio tem permisses da Web para o recurso solicitado. Se o usurio no tiver, a solicitao falha e o usurio recebe uma mensagem 403 Acesso proibido. O IIS verifica as permisses do NTFS para o recurso. Se o usurio no tiver permisses do NTFS para o recurso, a solicitao falha e o usurio recebe uma mensagem 401 Acesso negado. Ento a resposta para o nosso exemplo que o usurio no conseguiria gravar o contedo, pois o mesmo no teria as permisses NTFS necessrias e o mesmo acabaria recebendo a mensagem de erro 401 Acesso negado.
www.juliobattisti.com.br
612
10. Na parte de baixo da guia Pasta, temos um grupo de opes chamado Configuraes
NOTA: Caso voc no tenha criado uma pasta virtual Captulo6, utilize qualquer pasta virtual disponvel no seu servidor IIS.
613
www.juliobattisti.com.br
NOTA: Para determinar qual opo representa uma aplicao Web e qual simplesmente uma pasta virtual s observar o cone ao lado do nome, no Gerenciador do Internet Services. Opes que so simplesmente uma pasta virtual so representadas por um envelope amarelo; j aplicaes Web possuem um cone que parece uma caixa aberta, conforme indicado na Figura 14.37.
www.juliobattisti.com.br
614
Figura 14.37: cones para uma pasta virtual e para uma aplicao Web.
615
www.juliobattisti.com.br
Figura 14.38: Janela para configurao das restries de nome de domnio e endereo IP.
Observe que ns temos duas opes para configurao, conforme descrito a seguir: Acesso permitido: Se esta opo estiver marcada, todo mundo ter acesso ao site, com exceo dos endereos IP que estiverem indicados na listagem Exceto os listados abaixo. Este mecanismo chamado de Lista Negra, ou seja, todo mundo tem acesso, com exceo de quem est na lista. Acesso negado: Se esta opo estiver marcada, ningum ter acesso ao site, com exceo dos endereos IP que estiverem indicados na listagem Exceto os listados abaixo. Este mecanismo chamado de Lista Branca, ou seja, ningum tem acesso, com exceo de quem est na lista. 9. A ttulo de exemplo, deixe marcada a opo Acesso permitido. Agora vamos negar acesso para um computador especfico. 10. D um clique no boto Adicionar. Surge a janela indicada na Figura 14.39.
NOTA: No exemplo do livro estarei negando acesso para o IP: 10.204.123.1, que o endereo IP do meu computador. Utilize o endereo IP do equipamento para o qual voc quer negar acesso, em nvel de teste.
www.juliobattisti.com.br
616
Para negar acesso a todas as mquinas da rede 161.147, utilizaramos a seguinte configurao:
Identificao da rede: 161.147.0.0 Mscara de sub-rede: 255.255.0.0
617
www.juliobattisti.com.br
www.juliobattisti.com.br
618
619
www.juliobattisti.com.br
Figura 14.44: Definindo permisses de banco de dados no Microsoft SQL Server 2000.
Na maioria dos bancos de dados, pode ser necessrio o fornecimento de um Username e senha para que o acesso ao banco de dados seja liberado. Podemos construir Web Form com ASP.NET, com dois campos, onde o usurio digita o Username e a senha. Ao clicar em um boto Logon, os valores digitados, a pgina monta a string de conexo de acordo com os dados fornecidos pelo usurio, incluindo o Username e senha. Agora vamos falar um pouco mais sobre Aplicaes Web, no IIS 5.0. Este o ltimo assunto de segurana relacionado com o IIS e o Windows 2000. Depois passaremos a tratar dos tpicos de segurana especficos do ASP.NET.
NOTA: Para maiores informaes sobre configuraes de segurana no Microsoft SQL Server 2000, consulte o Captulo 6 Segurana no SQL Server 2000, do livro SQL Server 2000 Administrao & Desenvolvimento Curso Completo, 816 pginas, de minha autoria, publicado pela editora Axcel Books (www.axcel.com.br).
www.juliobattisti.com.br
620
NOTA: Para maiores detalhes sobre os modelos de aplicao de 2 ou mais camadas, consulte os Captulos 1 e 2.
Estes problemas surgem para cada aplicao Cliente/Servidor tradicional que estiver sendo usada. Agora imagine o caso de uma grande empresa, com milhares de computadores ligados em rede, com dezenas de aplicaes. A situao torna-se insustentvel, alm do custo de manuteno e suporte atingir patamares impraticveis. Para resolver estes e outros problemas das aplicaes Cliente/Servidor tradicionais que comearam a ser desenvolvidas aplicaes para a Web ou aplicaes baseadas em tecnologia Web, como preferem alguns. Vamos falar um pouco mais sobre aplicaes Web.
621
www.juliobattisti.com.br
www.juliobattisti.com.br
622
NOTA: Para saber como transformar uma pasta em uma Pasta Virtual do IIS, consulte a Introduo e o Captulo 1 deste livro.
623
www.juliobattisti.com.br
www.juliobattisti.com.br
624
625
www.juliobattisti.com.br
Figura 14.50: A DLL aspnet_isapi.dll responsvel pelo processamento das pginas .aspx.
www.juliobattisti.com.br
626
627
www.juliobattisti.com.br
IMPORTANTE: Se voc qualquer outra linguagem para a qual tenhamos o interpretador instalado no ativar essa opo, no servidor IIS, como por exemplo Perl. Esta opo define a linguagem que ser fornea acesso de execuo aos diretrios utilizada para interpretar os comandos dentro das tags <% e %>. Tempo limite do script ASP: Especifica o perodo de tempo durante o qual o pai; caso contrrio, um ASP permitir a execuo de um script. Se a execuo do script no terminar ao script poder tentar final do perodo de tempo limite, o ASP ir parar o script e gravar um evento no executar um programa log de eventos do Windows 2000. Voc pode definir o perodo de tempo limite no autorizado em um diretrio pai.ASP usando o como um valor entre 1 e 2147483647, alm de poder substituir essa opo em uma pgina
voc deseje pode alterar para JScript. Tambm podemos especificar o nome de mtodo Server.ScriptTimeout. 18. No iremos alterar nenhuma opo nesta guia. 19. D um clique na guia Depurao de aplicativo. 20. Na terceira guia Depurao de aplicativo, temos diversas configuraes relacionadas com a depurao de erros em pginas ASP, conforme indicado na Figura 14.52.
www.juliobattisti.com.br
628
Impersonation
Conforme descrevemos no incio do captulo, quando o usurio faz a requisio de uma pgina ASP.NET, a primeira coisa que acontece, antes de a pgina ser processada e retornada para o usurio, a autenticao do usurio. Atravs da
629
www.juliobattisti.com.br
O Arquivo Web.Config
O arquivo Web.Config um arquivo de configurao que fica gravado na pasta raiz da aplicao Web. Por exemplo, no Captulo 13, utilizamos o Visual Studio .NET, para criar a aplicao AppWebChap13. Na pasta raiz desta aplicao temos um arquivo chamado Web.Config, o qual contm diversas configuraes para a aplicao. Neste tpico estaremos modificando algumas opes deste arquivo e testando o efeito das modificaes. Na Listagem 14.1 temos o arquivo Web.Config para a aplicao AppWebChap13.
www.juliobattisti.com.br
630
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET Listagem 14.1 Arquivo Web.Config para a aplicao Web criada no Captulo 13.
<?xml version=1.0" encoding=utf-8" ?> <configuration>
<system.web>
<!
false will improve runtime performance of this application. Set compilation debug=true to insert debugging symbols (.pdb information) into the compiled page. Because this creates a larger file that executes more slowly, you should set this value to true only when debugging and to false at all other times. For more information, refer to the documentation about debugging ASP.NET files. > <compilation defaultLanguage=c# debug=true />
<!
Set mode=on or remoteonly to enable custom error messages, off to disable. Add <error> tags for each of the errors you want to handle. > <customErrors mode=Off />
<! are
AUTHENTICATION
This section sets the authentication policies of the application. Possible modes Windows, Forms, Passport and None > <authentication mode=None />
631
www.juliobattisti.com.br
Application-level tracing enables trace log output for every page within an application. Set trace enabled=true to enable application trace logging. pageOutput=true, the If Otherwise,
trace information will be displayed at the bottom of each page. you can view the
application trace log by browsing the trace.axd page from your web application root. > <trace enabled=false requestLimit=10" pageOutput=false traceMode=SortByTime localOnly=true />
<!
By default ASP.NET uses cookies to identify which requests belong to a particular session. If cookies are not available, a session can be tracked by adding a session identifier to the URL. To disable cookies, set sessionState cookieless=true. > <sessionState mode=InProc stateConnectionString=tcpip=127.0.0.1:42424" sqlConnectionString=data source=127.0.0.1;user id=sa;password= cookieless=false timeout=20" />
<!
This section sets the types of files that will not be downloaded. As well as entering a httphandler for a file type, you must also associate that file type with the aspnet_isapi.dll in the App Mappings property of the web site, or the file can be downloaded.
www.juliobattisti.com.br
632
<!
</system.web> </configuration>
</system.web> </configuration>
633
www.juliobattisti.com.br
Alm disso foi utilizada a sintaxe alternativa, ou seja, ao invs do fechamento </authentication>, utilizamos simplesmente />.
www.juliobattisti.com.br
634
/> <deny users=[lista de usurios, separados por vrgula] roles=[lista de grupos, separados por vrgula] verb=[GET/POST/HEAD] /> </authorization>
A definio de uma lista de usurios e grupos do Windows, com permisso de acesso, mais comum em uma Intranet, onde temos que definir permisses de acesso somente para um grupo especfico de usurios. Vamos supor que exista uma aplicao Web, com informaes gerenciais sobre o desempenho dos funcionrios, planos de promoo e carreira. Imagine que somente o Gerente de RH, diretores, vice-presidentes e o presidente devam ter acesso a essa aplicao. Esta uma situao em que devemos utilizar a autenticao Windows built-in authentication e utilizar uma clusula <authorization> </authorization> para definir quais os usurios que tm permisso de acesso. Neste caso a primeira coisa a ser feita definir o tipo de autenticao como Windows:
<authentication mode=Windows/>
allow users contm uma lista de usurios e grupos com permisso de acesso aplicao. deny users contm uma lista de usurios e grupos, para os quais a permisso de acesso negada. Ao especificarmos o nome de um usurio, devemos utilizar a nomenclatura completa, na qual especificado o nome do domnio. Na mquina que estou utilizando, est instalado um domnio Windows 2000 chamado GROZA. Para especificar uma conta deste domnio utilizo a seguinte nomenclatura:
GROZA\jsilva GROZA\user1 GROZA\user2 GROZA\Administrador
NOTA: Se a conta pertencer a um Member Server, isto , um servidor que no faz parte de um domnio, basta substituir o nome do domnio pelo nome do servidor.
635
www.juliobattisti.com.br
</authorization>
Neste exemplo os usurios Usurio1 e Usurio2 podero acessar a aplicao e todos os demais tero o acesso negado. Porm existem situaes mais complexas. Pode acontecer de existir um arquivo Web.Config no diretrio-raiz do site, um arquivo Web.Config na pasta-raiz da aplicao e um outro arquivo Web.Config em uma pasta dentro da aplicao Web. Podemos perfeitamente criar arquivos Web.Config nos locais descritos no exemplo. Neste caso temos a seguinte questo: Quais as configuraes que so efetivamente aplicadas?. Se em um dos arquivos o usurio tem permisso e em outro no, qual ser a permisso que ir prevalecer? Para responder a estas questes, devemos levar em considerao algumas regras: As clusulas <allow> e <deny> so mescladas, a partir de todos os arquivos Web.Config existentes no caminho de uma aplicao. Considere o exemplo da Figura 14.53. Neste caso, quando a pgina pagina1.aspx for acessada, sero mescladas as clusulas <allow> e <deny>, dos trs arquivos Web.Config existentes, desde a pasta raiz do site, at chegar na pasta-onde est a pgina pagina1.aspx. Em caso de conflito dada
IMPORTANTE: As configuraes de segurana do ASP.NET somente so aplicadas e verificadas para recursos associados ao ASP.NET; em outras palavras, a arquivos associados para processamento da DLL: aspnet_isapi.dll. As configuraes de segurana do ASP.NET no se aplicam para recursos no associados a DLL aspnet_isapi.dll, como por exemplo arquivos .txt, html, gif, jpg, asp e outros tipos de arquivos. As limitaes de acesso para este tipo de arquivo dependem das configuraes de segurana do IIS e do Windows 2000. Poderamos contornar esta situao, mapeando os demais recursos para a DLL aspnet_isapi.dll, porm isso teria um forte impacto em termos de performance, o que iria piorar muito o desempenho da aplicao.
preferncia para as configuraes do arquivo Web.Config que est em um nvel mais alto, isto , mais prximo da pasta-raiz do site. Aps processados todos os arquivos Web.Config do caminho, montada uma lista nica de usurios e grupos para as clusulas <allow> e <deny>. Uma vez montada a lista nica vamos entender como so aplicadas as permisses. O processador do ASP.NET vai lendo a lista de cima para baixo e aplica a configurao que melhor se encaixar; em outras palavras, a configurao mais especfica. Voc pode ter notado no exemplo que apresentamos anteriormente, onde a permisso atribuda a dois usurios:
<allow users=GROZA\Usurio1,GROZA\Usurio2 />
www.juliobattisti.com.br
636
637
www.juliobattisti.com.br
tm permisso <allow> de acesso definida. O grupo todos (*) tem permisso negada - <deny>. Como os usurios tm permisso especfica de acesso, estes podero acessar a aplicao. Todos os demais usurios (* - GROZA\Usurio1 GROZA\Usurio2) tero permisso de acesso negada. Mais uma vez cabe ressaltar que este comportamento diferente do que temos com as permisses NTFS em relao a pastas e arquivos em parties NTFS. Outro uso comum, onde precisamos combinar permisses <allow> e <deny>, para casos em que um determinado grupo deve ter permisses de acesso e um ou mais elementos do grupo devem ter a permisso negada. Vamos considerar a seguinte situao de usurios e grupos para um domnio chamado GROZA:
Grupo gerentes Membros do grupo: user2 user3 user4 user5 user1
Ns queremos que o grupo gerente tenha permisso de acesso a uma aplicao Web, com exceo dos usurios: user2 e user5. Para implementar estas configuraes de segurana, utilizamos a seguinte clusula <authorization> </authorization>, no arquivo Web.Config da aplicao Web:
<authorization> <allow roles=GROZA\gerentes <deny />
users=GROZA\user2,GROZA\user5 />
</authorization>
Neste caso o grupo gerentes tem permisso de acesso e, para os usurios user2 e user5, tenho negado, explicitamente, o acesso. O resultado prtico que os usurios user1, user3 e user4 tm permisso de acesso e os usurios user2 e user5 no tm permisso de acesso. Observe que para permitir acesso a grupos utilizamos a clusula <allow roles=.../ > e para negar permisso a grupos, utilizamos a clusula <deny roles=.../>. A utilizao da clusula verb opcional. Esta clusula pode ser utilizada para definir o tipo de requisio que o usurio pode fazer. Conforme descrevemos anteriormente existem diferentes mtodos de enviar os dados de um formulrio para processamento no servidor. Os tipos mais comuns so GET e POST. Com a clusula verb podemos limitar a forma de envio permitida para usurios ou grupos. Vamos a um exemplo prtico. Vamos definir que os usurios GROZA\user1 e GROZA\user2 devem ter permisso para utilizar o mtodo GET e todos os demais usurios somente podem utilizar o mtodo POST. Para implementar estas configuraes, utilizamos a seguinte clusula de autorizao, no arquivo Web.Config:
<authorization> <allow verb=GET users=GROZA\user1,GROZA\user2 />
<allow verb =POST users=* /> <deny verb = GET </authorization> users=* />
www.juliobattisti.com.br
638
users=GROZA\user2,GROZA\user5 />
Estas configuraes somente se aplicam pgina dados.aspx. No Captulo 15 veremos mais alguns detalhes sobre as configuraes de segurana no ASP.NET.
Concluso
Neste captulo aprendemos sobre aspectos bsicos de segurana, tais como: Tipos de autenticao. Permisses NTFS do Windows 2000. Opes de segurana do IIS. Permisses em nvel de Banco de dados. Muito existe a ser tratado sobre segurana. Livros inteiros j foram escritos sobre o assunto. Pela experincia de anos trabalhando com ambientes de Rede Locais e acesso a dados crticos posso afirmar com convico: O primeiro passo para estabelecer um ambiente seguro a definio de uma poltica de segurana e a ampla divulgao da mesma, para que todos estejam conscientes de suas responsabilidades em relao segurana. Muitas vezes cuida-se muito da segurana de acesso lgico aos dados, com a otimizao das configuraes de segurana do Sistema Operacional, do Servidor Web, das aplicaes Web e do Servidor de Banco de dados. So gastos milhares de dlares em equipamentos e programas sofisticados para atuarem como Firewall. Investe-se em roteadores e switches modernos, com capacidades de filtragem de pacotes, deteco de tentativas de invaso e assim por diante. E muitas vezes a segurana fsica esquecida. De que adianta toda esta segurana no acesso lgico se um desconhecido pode, facilmente, invadir a sala dos Servidores e sair com uma meia dzia de fitas de Backup embaixo do brao?
639
www.juliobattisti.com.br
www.juliobattisti.com.br
640
Introduo
Como o prprio ttulo sugere, este captulo apresenta assuntos variados sobre o ASP.NET. Veremos uma srie de exemplos e tcnicas teis na criao de pginas e aplicaes Web com ASP.NET. Veremos assuntos que variam de classes do Framework .NET que tratam da requisio do usurio, passando por alguns exemplos prticos que fazem conexo com banco de dados, seguindo com o conceito de Code-Behind at questes relacionadas ao controle de segurana atravs do cdigo ASP.NET. Vamos iniciar o captulo apresentando trs exemplos prticos: Como limitar o controle de uma lista, com base no valor selecionado em outra lista. Utilizando o controle DataGrid para editar dados. Apresentaremos mais um exemplo prtico, no qual estaremos exibindo, em uma pgina ASP.NET, dados de uma planilha do Excel. Este exemplo importante, pois salienta a possibilidade de acessarmos dados das mais variadas fontes. Esta uma situao comum nas empresas, nos dias atuais. Os dados esto espalhados nos mais diversos formatos. Com o .NET podemos criar aplicaes que acessam dados das mais variadas fontes. Em seguida apresentaremos o conceito de Code Behind, que uma tcnica utilizada para facilitar a separao entre o cdigo responsvel pela lgica e o cdigo responsvel pela apresentao da pgina. Seguindo na apresentao da nossa Caixa de Ferramentas, falaremos sobre dois importantes objetos: HttpRequest e HttpResponse. Com estes objetos podemos ter um controle mais eficaz sobre a requisio que enviada pelo navegador do cliente e sobre a resposta que enviada de volta pelo servidor. Tambm iremos tratar sobre as diretivas de pgina. Uma diretiva , geralmente, includa no incio da pgina e utilizada para instruir o servidor sobre como efetuar o processamento da pgina. Por exemplo, podemos utilizar uma diretiva @OutputCache, para controlar a maneira como o servidor far o cache das pginas ASP.NET. O nosso prximo e final assunto ser sobre as configuraes de segurana atravs da utilizao de cdigo. Veremos uma srie de pontos sobre segurana, utilizando cdigo ASP.NET e classes do Framework .NET. Este captulo apresenta assuntos variados, mas de grande utilizao na construo de aplicaes Web. O objetivo dos exemplos apresentados salientar tcnicas que voc provavelmente utilizar nas aplicaes que estiver construindo.
CAPTULO
15
Caixa de Ferramentas do ASP.NET
641
www.juliobattisti.com.br
www.juliobattisti.com.br
642
auxSQL1 = Select PasDeDestino From Pedidos; auxSQL2 = Group By PasDeDestino Order By PasDeDestino;
} }
643
www.juliobattisti.com.br
if (ListaPaises.SelectedItem.Value!=) { OcultaControles(); auxSQL1 = Select CidadeDeDestino From Pedidos Order By CidadeDeDestino; Where PasDeDestino=;
comandoSQL = auxSQL1+auxSQL2;
MeuComando.Fill(ds);
www.juliobattisti.com.br
644
comandoSQL = auxSQL1+auxSQL2;
comandoSQL = auxSQL1+auxSQL2;
MeuComando.Fill(ds);
645
www.juliobattisti.com.br
</script>
<body>
<h3> <font face=Verdana> Selecione um Pas na lista de pases. <BR> Em seguida uma cidade na lista de cidades. <BR> E por ltimo, um pedido na lista de Pedidos. </font> </h3>
www.juliobattisti.com.br
646
<form runat=server>
DataValueField = PasDeDestino AutoPostBack = True onSelectedIndexChanged = PasSelecionado > </asp:DropDownList> </td> </tr> <tr> <td> <p align=right> <B>Selecione uma Cidade ->></B> </td>
647
www.juliobattisti.com.br
DataValueField = CidadeDeDestino AutoPostBack = True onSelectedIndexChanged = CidadeSelecionada > </asp:DropDownList> </td> </tr> <tr> <td> <p align=right> <B>Selecione um Pedido ->></B> </td>
DataValueField = NmeroDoPedido AutoPostBack = True onSelectedIndexChanged = PedidoSelecionado > </asp:DropDownList> </td> </tr> <tr> <td> <p align=right> <B>Nmero do Pedido:</B> </td> <td> <asp:TextBox
www.juliobattisti.com.br
648
649
www.juliobattisti.com.br
<tr> <td> <p align=right> <B>Frete:</B> </td> <td> <asp:TextBox runat=server id=txtFrete Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" Height=20" Width=200" Enabled=False /> </td> </tr> <tr> <td> <p align=right> <B>Nome do Destinatrio:</B> </td> <td> <asp:TextBox
www.juliobattisti.com.br
650
651
www.juliobattisti.com.br
</table> </div>
</form>
</body> </html>
Digite o cdigo da Listagem 15.1 e salve o mesmo em um arquivo chamado chap15ex1.aspx, na pasta chap15, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap15/chap15ex1.aspx Ao carregar a pgina voc obtm o resultado indicado na Figura 15.1. Inicialmente apenas a lista de pases est preenchida, conforme destacado na Figura 15.1. Esta lista preenchida com o auxlio do evento Page_Load, onde estabelecemos uma conexo com o banco de dados NorthWind.mdb e retornamos a lista de pases da tabela Pedidos. Por ltimo adicionamos um elemento em branco ( ), como primeiro elemento da lista de Pases. Este elemento adicionado para que nenhum pas esteja selecionado por padro, ou seja, o usurio deve abrir a lista e selecionar um pas:
ListaPaises.Items.Insert(0,);
Na lista de pises selecione Brasil. Ao selecionar um pas na lista, ser disparado o evento onSelectedIndexChanged, do controle ListaPaises. Em resposta a este evento, configuramos o procedimento PasSelecionado:
onSelectedIndexChanged = PasSelecionado
O procedimento PasSelecionado faz uma conexo com o banco de dados NorthWind.mdb e retorna apenas as cidades para o pas selecionado. Os dados retornados so atribudos ao controle ListaCidades, atravs do uso da propriedade DataSource e do mtodo DataBind. Por ltimo adicionamos um elemento em branco ( ), como primeiro elemento da lista de cidades. Este elemento adicionado para que nenhuma cidade seja selecionada por padro, ou seja, o usurio deve abrir a lista e selecionar uma cidade. Abra a lista de cidades e selecione So Paulo, conforme indicado na Figura 15.2.
www.juliobattisti.com.br
652
653
www.juliobattisti.com.br
O procedimento CidadeSelecionada faz uma conexo com o banco de dados NorthWind.mdb e retorna apenas os pedidos para a cidade selecionada. Os dados retornados so exibidos nos respectivos controles TextBox da pgina. O procedimento CidadeSelecionada tambm torna a propriedade Visible, dos controles TextBox, igual a True, de tal forma que estes controles sejam exibidos na pgina. Selecione o pedido nmero: 10494; os dados para o pedido selecionado sero exibidos, conforme indicado na Figura 15.3. Se voc selecionar uma outra cidade, os controles TextBox so ocultados e a lista de pedidos ser redefinida para que sejam exibidos os pedidos para a cidade selecionada. Isto feito pelo procedimento CidadeSelecionada, o qual disparado toda vez que uma nova cidade for selecionada. Se voc selecionar um novo pas, a lista de cidades ser redefinida para exibir as cidades do pas selecionado e o controle ListaPedidos ser desabilitado. Quando voc seleciona uma cidade, na lista de cidades, o controle ListaPedidos habilitado e passa a exibir os pedidos para a cidade selecionada. Neste exemplo vimos algumas tcnicas interessantes, as quais possibilitam a criao de formulrios para pesquisas com um ou mais critrios. O grande segredo deste exemplo a correta utilizao da propriedade onSelectedIndexChanged, do controle DropDownList.
www.juliobattisti.com.br
654
void BuscaDados() {
// Crio uma conexo com o banco de dados pubs localizado no servidor local. // Vamos acessar a instncia SERVIDOR\NETSDK.
// Conectamos com o banco de dados utilizando um comando SQL, // o qual retorna todos os dados da tabela Authors, do banco de // dados pubs.
SqlDataAdapter myCommand = new SqlDataAdapter(SELECT + au_id,au_fname,au_lname,phone FROM Authors Order By au_fname, myConnection);
655
www.juliobattisti.com.br
} void Page_Load(Object sender, EventArgs e) { if (!Page.IsPostBack) { txtTitulo.Text=Clique em Editar para alterar os dados de uma linha!; BuscaDados(); } }
void FazEdicao(Object sender, DataGridCommandEventArgs e) { txtTitulo.Text=Clique em Atualizar para Confirmar as alteraes!; txtTitulo2.Text=ou Clique em Cancelar para descartar as alteraes!; MinhaGrade.EditItemIndex = e.Item.ItemIndex; BuscaDados(); } void CancelaAlteracoes(Object sender, DataGridCommandEventArgs e) { txtTitulo.Text=Clique em Editar para alterar os dados de uma linha!; txtTitulo2.Text=; MinhaGrade.EditItemIndex = -1; BuscaDados(); }
void FazUpdate(Object sender, DataGridCommandEventArgs e) { // Crio uma conexo com o banco de dados pubs localizado no servidor local. // Vamos acessar a instncia SERVIDOR\NETSDK.
www.juliobattisti.com.br
656
// Conectamos com o banco de dados utilizando um comando SQL, // o qual retorna todos os dados da tabela Authors, do banco de // dados pubs.
SqlDataAdapter MeuDataAdapter = new SqlDataAdapter(SELECT + au_id,au_fname,au_lname,phone FROM Authors Order By au_fname, myConnection);
// Vamos definir o campo au_id como sendo a chave // primria da tabela Autores.
// Atribuo o valor dos campos da linha que est sendo editada, // a variveis do tipo String, pois todos os campos so do tipo String.
= ((TextBox)e.Item.Cells[0].Controls[0]).Text; = ((TextBox)e.Item.Cells[1].Controls[0]).Text;
657
www.juliobattisti.com.br
// Agora crio os comandos necessrios para enviar // as alteraes/incluses/excluses para o banco // de dados pubs, no servidor SQL Server 2000.
MeuDataAdapter.UpdateCommand= CriaComando.GetUpdateCommand();
MeuDataAdapter.Update(ds,authors);
</script>
<body>
<form runat=server>
<asp:Label
www.juliobattisti.com.br
658
<BR>
<HR>
<asp:DataGrid id=MinhaGrade BorderColor=black BorderWidth=1" CellPadding=3" AutoGenerateColumns=false runat=server EditItemStyle-BackColor=#c0c0c0" EditItemStyle-ForeColoer=blue OnEditCommand=FazEdicao OnUpdateCommand=FazUpdate OnCancelCommand=CancelaAlteracoes >
659
www.juliobattisti.com.br
<Columns>
</asp:BoundColumn>
</asp:BoundColumn>
</asp:BoundColumn>
www.juliobattisti.com.br
660
</asp:BoundColumn>
</asp:DataGrid>
</form>
</body> </html>
Digite o cdigo da Listagem 15.2 e salve o mesmo em um arquivo chamado chap15ex2.aspx, na pasta chap15, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap15/chap15ex2.aspx Ao carregar a pgina voc obtm uma tabela com os dados sobre os autores. Observe a ltima coluna onde temos um link Editar, conforme indicado na Figura 15.4. D um clique no link Editar, da primeira linha. Observe que os dados da linha passaram a ser exibidos em controles do tipo TextBox, nos quais podemos fazer as alteraes necessrias. Altere o sobrenome do autor para Battisti, conforme indicado na Figura 15.5. Observe que na ltima coluna, da primeira linha, ao invs do link Editar, passaram a ser exibidos dois links. Se voc clicar no link Atualizar, as alteraes sero enviadas para o banco de dados. Se voc clicar no link Cancelar, as alteraes sero descartadas e o DataGrid sair do modo de edio e voltar a ser exibido somente o link Editar. D um clique no boto Atualizar para confirmar as alteraes. Observe que o sobrenome foi atualizado para Battisti e o DataGrid continua no modo de edio. Agora altere o sobrenome do autor da primeira linha, de volta para Bennet. D um clique no boto Cancelar. Observe que a ltima alterao cancelada, isto , o sobrenome continua sendo Battisti e o DataGrid saiu do modo de edio, conforme indicado na Figura 15.6.
661
www.juliobattisti.com.br
www.juliobattisti.com.br
662
Para exibir a ltima coluna, onde so exibidos os links Editar, Atualizar ou Cancelar, dependendo do modo em que se encontra o DataGrid, utilizamos uma coluna do tipo EditCommandColumn:
<asp:EditCommandColumn EditText=Editar CancelText=Cancelar UpdateText=Atualizar />
663
www.juliobattisti.com.br
Quando a pgina carregada pela primeira vez, isto , quando no for um PostBack, o texto do incio da pgina definido e o procedimento BuscaDados chamado. Este procedimento faz a conexo com o banco de dados e exibe as informaes obtidas no controle DataGrid. Neste momento est habilitado apenas o link Editar.
if (!Page.IsPostBack) { txtTitulo.Text=Clique em Editar para alterar os dados de uma linha!; BuscaDados(); }
Quando o usurio clica no link Editar, dispara o evento OnEditCommand e executado o procedimento FazEdicao. Este procedimento altera o texto dos labels txtTitulo e txtTitulo1 e coloca a linha onde o usurio clicou no link Editar, no modo de edio:
void FazEdicao(Object sender, DataGridCommandEventArgs e) { txtTitulo.Text=Clique em Atualizar para Confirmar as alteraes!; txtTitulo2.Text=ou Clique em Cancelar para descartar as alteraes!; MinhaGrade.EditItemIndex = e.Item.ItemIndex; BuscaDados(); }
www.juliobattisti.com.br
664
Para retirar a linha do modo de edio atribumos o valor 1 propriedade EditItemIndex. Agora vamos analisar o procedimento FazUpdate, que o procedimento mais complexo. Na parte inicial deste procedimento criamos os objetos para conexo com o banco de dados e preenchimento de um objeto DataView, com as informaes originais da tabela authors. O prximo passo acessar os valores que foram digitados nos controles TextBox, da linha que est sendo editada. O ASP.NET cria uma coleo de controles do tipo TextBox, para a linha que est sendo editada. O primeiro controle possui o 0, o segundo o ndice 1 e assim por diante. Para atribuir estes valores a variveis do tipo string, utilizamos a seguinte sintaxe:
string txtCodAutor = ((TextBox)e.Item.Cells[0].Controls[0]).Text; string txtNome = ((TextBox)e.Item.Cells[1].Controls[0]).Text;
O argumento e do tipo DataGridCommandEventArgs. Este argumento tem uma propriedade chamada Item, a qual uma referncia linha atual do DataGrid, ou seja, a linha que estamos editando. A propriedade Item baseada na classe DataGridItem, a qual possui uma coleo chamada Cells, coleo esta que representa todas as colunas (cada coluna considerada uma clula) do DataGrid. Ento considere a seguinte referncia: e.Item.Cells[0] uma referncia primeira coluna da linha que est sendo editada. e.Item.Cells[1] uma referncia segunda coluna da linha que est sendo editada e assim por diante. Em cada clula do DataGrid posso ter um ou mais controles. Estes controles fazem parte da coleo Controls da clula. O primeiro controle acessado pelo ndice 0 Controls[0], o segundo pelo ndice 1 Controls[1] e assim por diante. No nosso caso temos ento: e.Item.Cells[0].Controls[0] uma referncia ao primeiro controle da primeira coluna da linha que est sendo editada.
665
www.juliobattisti.com.br
Para maiores detalhes sobre estes passos, consulte o Captulo 12, onde apresentamos explicaes detalhadas sobre cada um destes passos. Sem dvida a parte mais complexa deste procedimento o entendimento de como feita a referncia aos valores contidos em cada coluna da linha que est sendo editada. Podemos ver que existe uma hierarquia bem definida. O DataGrid formado por uma coleo de linhas. Cada linha formada por uma coleo de colunas. Cada coluna pode conter um ou mais controles, os quais fazem parte da coleo Controls da coluna. Cada controle um objeto com uma srie de propriedades e mtodos. Utilizamos a propriedade Text do controle, para acessar o valor contido em cada controle. Com o ASP 3.0, para implementarmos a mesma funcionalidade vista neste exemplo, temos que utilizar um componente COM vendido separadamente. Este componente simula as funcionalidades de edio que o DataGrid nos fornece apenas com a configurao de umas poucas propriedades.
www.juliobattisti.com.br
666
<%@ Page Language=C# %> <%@ Import Namespace=System.Data.OleDb %> <%@ Import Namespace=System.Data %> <%@ Import Namespace=System %>
<script language=C# runat=server> protected void Page_Load(Object Src, EventArgs E) { string strConn; strConn = Provider=Microsoft.Jet.OLEDB.4.0; + Data Source=C:\\Meus documentos\\Clientes.xls; + Extended Properties=Excel 8.0;;
//You must use the $ after the object you reference in the spreadsheet
667
www.juliobattisti.com.br
</script>
<body> <B> <asp:Label id=Label1 runat=server > <HR> Dados da planilha C:\Clientes.xls <HR>
</asp:Label> </B>
</body> </html>
Digite o cdigo da Listagem 15.3 e salve o mesmo em um arquivo chamado chap15ex3.aspx, na pasta chap15, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap12/chap15ex3.aspx Ao carregar a pgina voc obtm o resultado indicado na Figura 15.7, onde so exibidos os dados da planilha Clientes.xls.
www.juliobattisti.com.br
668
O atributo Extended Properties=Excel 8.0 que informa que o arquivo est no formato do Excel. Para acessar os dados da primeira plainlha Plan1, definimos um comando SQL:
OleDbDataAdapter myCommand = new OleDbDataAdapter(SELECT * FROM [Plan1$], strConn);
Observe que, aps o nome da planilha, devemos colocar um sinal de cifro [Plan1$] Poderamos, tambm, selecionar colunas individuais da planilha. Para isso basta alterar o comando SQL. Por exemplo, se quisssemos exibir apenas as colunas Cdigo do Cliente e Nome da Empresa, utilizaramos o seguinte comando:
OleDbDataAdapter myCommand = new OleDbDataAdapter(SELECT [Cdigo do Cliente],[Nome da Empresa] FROM [Plan1$], strConn);
669
www.juliobattisti.com.br
Este exemplo demonstra o poder e flexibilidade das classes do namespace System.Data.OleDb. Poderamos, sem maiores problemas, exibir na mesma pgina ASP.NET dados de um banco de dados do SQL Server, de uma tabela de um arquivo do Microsoft Access, de uma planilha do Microsoft Excel e de uma planilha do Lotus 123. Poderamos inclusive fazer clculos com dados das diferentes fontes e salvar os resultados em um banco de dados do ORACLE. Esta flexibilidade e possibilidade de trabalhar com diferentes formatos de dados que torna o Framework .NET uma opo muito interessante como plataforma para o desenvolvimento de aplicaes empresarias, quer sejam aplicaes Web, quer sejam aplicaes tradicionais.
www.juliobattisti.com.br
670
Considere o exemplo:
<% @Page Language=C# Inherits=Conecta Src=Conecta.cs %>
Vamos a um exemplo prtico, onde colocaremos o cdigo responsvel por fazer a conexo com o banco de dados NorthWind.mdb em um arquivo chamado conecta.cs. Neste arquivo criaremos uma classe chamada Conecta. Em seguida criaremos uma pgina ASP.NET que faz uso do cdigo contido no arquivo conecta.cs. Na Listagem 15.4 temos o cdigo para o arquivo conecta.cs.
671
www.juliobattisti.com.br
auxSQL1= SELECT CdigoDoCliente,NomeDaEmpresa,Endereo,Telefone,Pas; auxSQL2= FROM Clientes Where Pas=Brasil; auxSQL3= Order By NomeDaEmpresa;
ComandoSQL= auxSQL1+auxSQL2+auxSQL3;
} }
O mecanismo de Code Behind baseado na idia de herana. Observe, pelo cdigo da Listagem 15.4, que criamos uma nova classe chamada Conecta. A classe Conecta baseada na classe Page. Isto feito porque a classe Conecta ser herdada pelas pginas ASP.NET onde a classe for utilizada. Como ser herdada por pginas ASP.NET, a classe Conecta definida como do tipo Page, que a classe bsica para todas as pginas ASP.NET. Alm disso utilizamos uma srie de diretivas using, para fazer referncia aos namespaces utilizados pela classe:
using System; using System.Data; using System.Data.OleDb; using System.Web.UI; using System.Web.UI.WebControls; public class Conecta: Page
www.juliobattisti.com.br
672
Em seguida criamos um procedimento para o evento Page_Load. O cdigo deste procedimento simplesmente faz a conexo com o banco de dados NorthWind.mdb e retorna alguns campos da tabela Clientes. Em seguida estes dados so exibidos em um controle DataGrid. Agora vamos criar uma pgina ASP.NET que utiliza o cdigo da classe Conecta, contido no arquivo conecta.cs. Considere o cdigo da Listagem 15.5.
<html>
<body> <HR> <B> Exemplo de utilizao de Code Behind.</B> <HR> <ASP:DataGrid id=MinhaGrade1" runat=server Width=500" BackColor=#c0c0c0" BorderColor=black ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Verdana Font-Bold=True Font-Size=7pt HeaderStyle-BackColor=#aaaadd MaintainState=false />
<HR>
</body> </html>
673
www.juliobattisti.com.br
Como o arquivo conecta.cs est na mesma pasta da pgina Chap15ex4.aspx, informamos somente o nome do arquivo. Caso o arquivo .cs estivesse em uma subpasta, digamos Codigos, da pasta onde est a pgina .aspx, teramos que informar o caminho completo, conforme indicado no exemplo a seguir:
<%@ Page Language=C# Inherits=Conecta Src=Codigos\conecta.cs %>
www.juliobattisti.com.br
674
O Objeto HttpRequest
Quando o usurio digita um endereo e pressiona Enter, ou clica no boto Enviar de um formulrio, o navegador monta uma requisio e envia esta requisio, via HTTP, para o servidor. Na requisio enviada pelo navegador, existe uma srie de informaes. O objeto HttpRequest nos d acesso s informaes contidas na requisio enviada pelo navegador do cliente. Para acessarmos este objeto utilizamos simplesmente Request, conforme veremos nos exemplos no final deste tpico. O objeto HttpRequest baseado na classe HttpRequest, do namespace System.Web. A propriedade Request, do objeto Page, retorna um objeto do tipo HttpRequest, o qual contm informaes sobre a requisio feita pelo cliente. Por isso podemos utilizar diretamente Request, em uma pgina ASP.NET, que esta propriedade estar fazendo referncia a um objeto HttpRequest. Com o ASP 3.0, para acessarmos as chamadas Server Variables (nmero IP do cliente, tipo de navegador, etc.), tnhamos que utilizar a coleo ServerVariables. Com o objeto HttpRequest, do ASP.NET, as variveis de servidor esto disponveis como propriedades do objeto HttpRequest. Na Tabela 15.1, temos uma descrio das principais propriedades do objeto HttpRequest.
Tabela 15.1 Propriedades do objeto HttpRequest. Propriedade AcceptTypes ApplicationPath Browser Descrio Retorna um Array de strings, com todos os Mime Types aceitos pelo navegador do cliente. Retorna uma String, indicando o caminho virtual para a pastaraiz da aplicao. Retorna um objeto do tipo HttpBrowserCapabilities. As propriedades deste objeto fornecem informaes sobre o navegador do cliente.
675
www.juliobattisti.com.br
Propriedade Browser ClientCertificate ContentLength ContentType Cookies HttpMethod IsSecuryConnection Path PhysicalPath QueryString Url UserAgent UserHostAddres UserHostName
Descrio Retorna um objeto do tipo HttpBrowserCapabilities. As propriedades deste objeto fornecem informaes sobre o navegador do cliente. Retorna um objeto do tipo HttpClientCertificate. As propriedades deste objeto fornecem informaes sobre o certificado de segurana do Cliente. Retorna o tamanho, em bytes, da requisio enviada pelo cliente. Retorna uma string indicando o tipo do contedo requisitado pelo cliente. Retorna uma coleo de Cookies, enviados na requisio do cliente. Retorna o mtodo HTTP de transferncia utilizado pelo cliente. Pode ser: GET, POST ou HEAD. Retorna True se a conexo est utilizando HTTPS (sockets seguros) e False, caso contrrio. Retorna o caminho virtual da requisio atual. Retorna o caminho fsico correspondente a URL contida na requisio. Nos d acesso s variveis passadas na prpria URL, quando utilizado o mtodo GET para enviar as informaes contidas no campo de um formulrio. Retorna informaes sobre a URL da requisio atual. Retorna uma string que identifica o navegador do Cliente. Porexemplo: MSIE identifica o Internet Explorer da Microsoft. Retorna o nmero IP da estao do cliente. Retorna o nome DNS da estao do cliente.
A seguir temos um exemplo, onde utilizamos a propriedade Browser para exibir as capacidades do navegador do cliente.
www.juliobattisti.com.br
676
Digite o cdigo da Listagem 15.6 e salve o mesmo em um arquivo chamado chap15ex6.aspx, na pasta chap15, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap15/chap15ex6.aspx Ao carregar a pgina voc obtm um resultado semelhante ao indicado na Figura 15.10.
677
www.juliobattisti.com.br
Depois utilizamos uma srie de comando Response.Write, para retornar o valor das diversas propriedades do navegador do cliente. Vamos a mais um exemplo, onde utilizaremos outras propriedades do objeto HttpRequest.
www.juliobattisti.com.br
678
HttpClientCertificate cs = Request.ClientCertificate;
Response.Write(ClientCertificate Settings:<br>); Response.Write(Certificate = + cs.Certificate + <br>); Response.Write(Cookie = + cs.Cookie + <br>); Response.Write(Flags = + cs.Flags + <br>); Response.Write(IsPresent = + cs.IsPresent + <br>); Response.Write(Issuer = + cs.Issuer + <br>); Response.Write(IsValid = + cs.IsValid + <br>); Response.Write(KeySize = + cs.KeySize + <br>); Response.Write(SecretKeySize = + cs.SecretKeySize + <br>); Response.Write(SerialNumber = + cs.SerialNumber + <br>); Response.Write(ServerIssuer = + cs.ServerIssuer + <br>); Response.Write(ServerSubject = + cs.ServerSubject + <br>); Response.Write(Subject = + cs.Subject + <br>); Response.Write(ValidFrom = + cs.ValidFrom + <br>); Response.Write(ValidUntil = + cs.ValidUntil + <br>); Response.Write(Whats this = + cs.ToString() + <br>);
// Informaes sobre o nmero IP do cliente. String ClientIP; ClientIP = Request.UserHostAddress; Response.Write(<HR>); Response.Write(Nmero IP = + ClientIP + <br>);
String FileCaminho; FileCaminho = Request.FilePath; Response.Write(<HR>); Response.Write(Propriedade FilePath = + FileCaminho + <br>); String FisicalFileCaminho; FisicalFileCaminho = Request.PhysicalApplicationPath; Response.Write(<HR>); Response.Write(Propriedade PhysicalFilePath = + FisicalFileCaminho + <br>);
String FisicalCaminho;
679
www.juliobattisti.com.br
</script>
<body>
</body> </html>
Digite o cdigo da Listagem 15.7 e salve o mesmo em um arquivo chamado chap15ex7.aspx, na pasta chap15, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap15/chap15ex7.aspx Ao carregar a pgina voc obtm um resultado semelhante ao indicado na Figura 15.11.
www.juliobattisti.com.br
680
O Objeto HttpResponse
O objeto HttpResponse utilizado para enviar informaes para o navegador do cliente, em resposta a uma requisio. A propriedade Response, do objeto Page, retorna um objeto do tipo HttpResponse. Este objeto derivado da classe HttpResponse, do namespace System.Web. Por isso este objeto, suas propriedades e mtodos podem ser utilizados diretamente em uma pgina ASP.NET. Quando uma pgina requisitada, criada uma instncia da classe page na memria do servidor, conforme descrito no Captulo 6. Em qualquer local desta pgina podemos utilizar a propriedade Response; na prtica como se tivssemos criado uma instncia da classe HttpResponse. Por isso que, nos exemplos anteriores, utilizamos diretamente Response.Write. Quando fizemos isso, estamos utilizando o mtodo Write, da classe HttpResponse, classe essa acessada atravs da propriedade Response da pgina, ou diramos melhor, da classe Page. Na Tabela 15.2, temos uma descrio das principais propriedades do objeto HttpResponse.
Tabela 15.2 Propriedades do objeto HttpResponse. Propriedade Buffer Descrio Pode ser definido em True ou False. Se for True, toda a resposta ser processada, antes de ser enviada para o navegador do cliente. Caso seja False, medida que a resposta for sendo processada, ser enviada para o navegador do cliente. Pode ser definido em True ou False. Se for True, toda a pgina ser processada, antes de ser enviada para o navegador do cliente. Caso seja False, medida que a pgina for sendo processada, ser enviada para o navegador do cliente. Retorna um objeto do tipo HttpCachePolicy com informaes sobre as configuraes de cache para a resposta atual. Retorna a coleo de Cookies contida na resposta para o navegador do cliente. O mtodo mais conhecido do objeto HttpResponse , sem dvidas, o mtodoWrite, que utilizado para enviar texto para o navegador do Cliente. Com o ASP 3.0, utilizvamos, intensamente, o mtodo Write (Response.Write) para enviar as tags HTML que formavam a pgina de resposta, pgina esta que era enviada de volta para o cliente. Com os Web Server Controls (vistos nos Captulos 7, 8 e 9) e suas funcionalidades avanadas, o uso de Response.Write ficou bastante reduzido no ASP.NET, conforme podemos constatar nos diversos exemplos deste livro.
BufferOutput
681
www.juliobattisti.com.br
Diretivas de Pgina
As diretivas de pgina so utilizadas para definir uma srie de comportamentos que influenciam a maneira como uma pgina processada e exibida no navegador do cliente. As diretivas podem ser includas em qualquer local da pgina, mas de praxe colocarmos as diretivas no incio da pgina. Uma diretiva pode conter um ou mais atributos, que definem configuraes relacionadas com a diretiva. A sintaxe geral para as diretivas a seguinte:
<% @Diretiva Atributo1=Valor Atributo2=Valor ... Atributon=Valor %>
A Diretiva @Page
Esta diretiva utilizada para definir atributos especficos para a pgina ASP.NET. Os atributos so utilizados pelo processador ASP.NET para definir como a pgina ser processada, se ser ou no mantida em cache, como a resposta ser enviada para o cliente e assim por diante. A diretiva @Page somente pode ser utilizada em arquivos do tipo .aspx. A seguir descrevemos os principais atributos para esta diretiva. AspCompact: Pode conter o valor true ou false. Se for definida em true permite que a pgina .aspx acesse componentes COM antigos, criados em VB, que utilizam o modelo de Single-thread Apartment STA, para alocao de memria e execuo. Exemplo: <% @Page AspCompact=true %> Buffer: Define se o buffer est ou no habilitado. Pode conter os valores true ou false. Exemplo: <% @Page Buffer=false %> ClientTarget: Pode ser utilizado para informar ao processador ASP.NET qual o navegador do cliente, uma vez que a maneira como os controles so processados otimizada para cada tipo de navegador. Somente so vlidos os valores aceitveis pela propriedade User Agent, do objeto HttpRequest. Debug: Pode ser do tipo true ou false. J utilizamos em alguns exemplos deste livro. Se for definida em true, quando a pgina compilada, o processo de debug estar habilitado. Com o processo de debug habilitado, mais informaes so geradas caso acontea algum erro. Esta opo muito til quando a pgina est em desenvolvimento, devendo ser desabilitada quando a pgina estiver disponvel para uso. O padro false. Exemplo: <% @Page Debug=true %> EnableViewState: Pode conter os valores true ou false. Se for true (o padro), o estado ser mantido para a pgina e para os controles da pgina; se for false, o estado no ser mantido. ErrorPage: Define a URL de uma pgina de erro, para a qual o processamento ser redirecionado caso acontea algum erro para o qual no foi feito o devido tratamento de excees. Para mais informaes sobre o tratamento de excees, consulte o Captulo 5. Inherits: Utilizada para configurao do mecanismo de Code Behind. Para maiores detalhes consulte o tpico Um conceito importante: Code Behind, neste captulo.
www.juliobattisti.com.br
682
A Diretiva @Import
Esta diretiva utilizada para fazer referncia a um namespace. Se formos utilizar classe de um namespace, precisamos utilizar a diretiva import para fazer referncia ao respectivo namespace. Por exemplo, quando utilizamos classes do namespace System.Data.OleDb, para fazer conexo com um banco de dados do Microsoft Access, precisamos utilizar a seguinte diretiva:
<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>
Em cada diretiva @Import somente podemos fazer referncia a um namespace. Para fazermos referncia a diversos namespaces devemos utilizar vrias diretivas @Import. Existe um conjunto de namespaces aos quais j feita referncia automtica, ou seja, no precisamos fazer referncia explcita, utilizando a diretiva @Import. Na lista a seguir temos os namespaces aos quais feita referncia, automaticamente: System System.Collections System.Collections.Specialized System.Configuration System.IO System.Text System.Text.RegularExpressions System.Web System.Web.Caching System.Web.Security System.Web.SessionState System.Web.UI System.Web.UI.HtmlControls System.Web.UI.WebControls
Outras Diretivas
Existem outras diretivas, utilizadas com menor freqncia: @Import, @Implements, @Register, @Assembly, @OutputCache e @Reference. Para maiores informaes sobre estas diretivas consulte a documentao do Frame-
683
www.juliobattisti.com.br
NOTA: Para maiores informaes sobre a criao de usurios, criao de grupos e adio de usurios a grupos, consulte o Anexo I.
www.juliobattisti.com.br
684
Tabela 15.3 Propriedades da classe IDentity. Propriedade AuthenticationType IsAuthenticated Name Descrio Retorna o tipo de autenticao. Retorna true se o usurio foi autenticado com sucesso e false, caso contrrio. Retorna o nome do usurio autenticado.
O tipo de objeto IDentity retornado diferente, para os diferentes tipos de identificao. Para a autenticao Windows, o objeto retornado do tipo WindowsIdentity, derivado da classe de mesmo nome, pertencente ao namespace System.Security.Principal. Vamos inicialmente a um exemplo simples, onde retornaremos algumas informaes sobre o usurio autenticado. Antes de apresentarmos o exemplo, vamos configurar o arquivo Web.Config, para a pasta Chap15, de tal forma que esteja habilitada a autenticao do tipo Windows. Crie o arquivo Web.Config indicado na Listagem 15.8 e salve-o na pasta Chap15:
</system.web> </configuration>
685
www.juliobattisti.com.br
IMPORTANTE:No se esquea de configurar a pasta Chap15 como uma aplicao Web. Para maiores informaes sobre como tornar uma pasta virtual em uma aplicao Web, consulte o Captulo 13.
Figura 15.12: Tela de logon autenticao do tipo Windows habilitada no arquivo Web.Config.
Se o usurio fornecer um nome de logon que no tem permisso de acesso, a tela de logon ser exibida novamente. Isto feito trs vezes, e aps a terceira tentativa, ser exibida a mensagem de erro indicada na Figura 15.13.
www.juliobattisti.com.br
686
<html>
protected void Page_Load(Object Src, EventArgs E ) { / Variveis do tipo string que iro conter informaes / sobre o usurio autenticado.
687
www.juliobattisti.com.br
tring TipoDeAutenticacao
f (User.IsInRole(GROZA\\Gerentes)) { MostraNome.Text vindo!; MostraTipo.Text = Voc est autenticado usando: + TipoDeAutenticacao; = Sr. Gerente: + NomeDoUsuario + , seja bem
MinhaGrade.DataSource = source ; MinhaGrade.DataBind(); } else { MostraNome.Text , seja bem vindo!; MostraTipo.Text = Voc est autenticado usando: + TipoDeAutenticacao; Mensagem.Text = VOC NO TEM PERMISSO PARA ACESSAR AS INFORMAES DE CLEINTES!; } } = Prezado Funcionrio: + NomeDoUsuario +
</script>
<body>
www.juliobattisti.com.br
688
<BR>
<BR>
<HR>
<ASP:DataGrid id=MinhaGrade runat=server Width=500" BackColor=#ccccff BorderColor=black ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Verdana
689
www.juliobattisti.com.br
</body> </html>
Digite o cdigo da Listagem 15.8 e salve o mesmo em um arquivo chamado chap15ex8.aspx, na pasta chap15, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6. Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap15/chap15ex8.aspx Quando for solicitada a tela de logon faa o logon com as seguintes informaes:
Nome do usurio: Senha: abc12345 suser2
Domnio: GROZA
Como o usurio suser2 faz parte do grupo Gerentes, voc obter os resultados indicados na Figura 15.15.
www.juliobattisti.com.br
690
Domnio: GROZA
Como o usurio suser3 no pertence ao grupo Gerentes, voc obter os resultados indicados na Figura 15.16. Observe que, para obter as informaes sobre o cliente autenticado e o tipo de autenticao, simplesmente utilizamos propriedades do objeto User.Identity:
string NomeDoUsuario string TipoDeAutenticacao = User.Identity.Name; = User.Identity.AuthenticationType;
Para determinar se o usurio pertence ou no ao grupo de gerentes, utilizamos o mtodo IsInRole, para o qual passamos, como parmetro, o nome do grupo, no formato: DOMNIO\NomeDoGrupo:
if (User.IsInRole(GROZA\\Gerentes))
Concluso
Neste captulo apresentamos uma variedade de assuntos que podem ser teis para a utilizao nas aplicaes Web, com ASP.NET, que o leitor venha a desenvolver.
691
www.juliobattisti.com.br
www.juliobattisti.com.br
692
Introduo
Este captulo no faz parte do livro impresso: ASP.NET: Uma Nova Revoluo na Construo de Sites e Aplicaes Web. O presente captulo somente estar disponvel na Internet, no formato .pdf, para download. Para os leitores que adquiriram o livro, este captulo um brinde, uma vez que so tratados novos assuntos, os quais no foram tratados nos captulos do livro. Para os interessados em adquirir o livro, este captulo serve para que o leitor tenha uma idia do estilo do autor.
CAPTULO
16
Tratamento de Erros e Gerenciamento de Estado
IMPORTANTE: Para o completo entendimento deste captulo, so necessrios os conhecimentos tratados nos Captulos 1, 2, 3, 4, 5, 6, 7, 8 e 9 do livro. Os aspectos bsicos da linguagem C# e da criao de pginas ASP.NET no sero novamente detalhados.
Vamos iniciar o captulo falando sobre o Tratamento de Erros em pginas ASP.NET. Fazer o tratamento de erros torna nossas aplicaes, digamos, mais elegantes. Quando ocorre um determinado erro, este interceptado pelo cdigo de tratamento de erro e uma mensagem mais esclarecedora, sobre os possveis motivos do erro, pode ser gerada. Se no for feito o tratamento de erros, o usurio ter que se contentar com a mensagem padro emitida pelo servidor Web. Veremos que com o ASP.NET possvel fazer um tratamento estruturado dos erros que ocorrem em uma pgina ou aplicao Web. Tambm podemos fazer com que o Administrador do sistema seja notificado dos erros, seja escrevendo no Log de Eventos do Sistema Operacional ou fazendo com que o cdigo de tratamento de erros envie uma mensagem de e-mail para a Caixa Postal do Administrador. Concordo que tratamento de erros no , nem de longe, um assunto to interessante quanto acesso a Bases de Dados usando ADO.NET, segurana, ou outro qualquer; porm, para que nossas aplicaes se comportem de uma maneira adequada, de fundamental importncia que seja dada a devida ateno ao item: Tratamento de Erros. Faremos uma breve reviso das estruturas Try...Catch...Finally, j apresentadas no Captulo 5, para que o leitor possa relembrar da sintaxe e da forma de utilizao destes comandos. Para uma descrio detalhada destes comandos, consulte o Captulo 5. Para entender o funcionamento do mecanismo para tratamento de erros, utilizaremos diversos exemplos prticos, onde o leitor poder ver em
693
www.juliobattisti.com.br
anteriores do ASP. Os objetos do Framework .NET para tratamento de erros so mais poderosos e fceis de utilizar. Alm disso podemos fazer o tratamento estruturado de erros, utilizando as estruturas try...catch...finally. Uma das melhorias mais significativas que o tratamento de erros implementado pelo prprio CLR Common Language Runtime, parte integrante do Framework .NET. Com
isso as tcnicas e comandos de tratamento de erros so independentes da linguagem utilizada. Por exemplo, podemos passar uma exceo gerada em uma pgina ASP.NET, codificada em C#, para um componente de tratamento de erros criado com VB.NET. As estruturas, mensagens e cdigos de erro so os mesmos, independente da linguagem, pois estes elementos so parte integrante do Framework .NET. O CLR usa o mecanismo de excees para fazer o tratamento de erros. Toda vez que um erro acontece durante a execuo de um programa ou de uma pgina ASP.NET, uma exceo disparada. O tipo de exceo gerada depende do erro ocorrido. Neste captulo aprenderemos a detectar a ocorrncia de excees e a trat-las.
www.juliobattisti.com.br
694
Tabela 16.1 Propriedades da classe System.Exception. Propriedade HelpLink InnerException Descrio Define ou retorna um link para um arquivo de ajuda associado com a exceo. Obtm uma referncia ao objeto que representa a exceo que ocorreu em primeiro lugar, ou seja, a primeira exceo gerada na pilha de chamada dos mtodos relacionados com o erro que disparou a exceo. Conforme descrevemos anteriormente, uma exceo pode ter sido gerada em um mtodo, porm tratada em um outro mtodo chamado diretamente pelo mtodo que gerou a exceo ou chamado por um mtodo que foi chamado pelo mtodo original e assim por diante. Retorna a mensagem associada com a exceo. Retorna o nome do mtodo original, onde foi inicialmente disparada a exceo. Retorna o nome completo da exceo, a mensagem de erro, e outras informaes sobre a exceo.
695
www.juliobattisti.com.br
NOTA: Veremos exemplos dos usos destas propriedades nos exemplos prticos, mais adiante neste captulo.
Dois exemplos tpicos de excees: O programa tenta fazer uma leitura no disquete e no existe disquete no drive. Uma diviso por zero. As excees devem ser detectadas e opes devem ser oferecidas para o usurio do programa. Por exemplo, no caso do disquete que no est no drive, a exceo deve ser detectada e o programa deve exibir uma mensagem solicitando que o usurio insira um disquete no drive. Este procedimento muito mais amigvel do que simplesmente encerrar o programa. Outra grande vantagem do Framework .NET que o tratamento de excees padronizado, independentemente da linguagem que est sendo utilizada. Uma exceo gerada em um componente escrito em C++ pode ser tratada em um cliente escrito em C# e vice-versa. Neste tpico veremos como tratar excees com a linguagem C#.
class ex1cap16
www.juliobattisti.com.br
696
// Incio do bloco try. // Contm o cdigo que pode gerar a exceo. try
int divisao;
// Exibio dos resultados. Console.WriteLine(O valor da DIVISO } // Final do bloco try. -> {0},divisao);
// Incio do bloco catch. // Cdigo que ser executado se uma exceo // for gerada no bloco try.
697
www.juliobattisti.com.br
Digite o exemplo da Listagem 16.1 e salve-o em um arquivo chamado ex1cap16.cs, na pasta C:\Meus documentos. Compile e execute o exemplo da Listagem 16.1. Digite 10 para o numerador e 2 para o denominador. Voc obter os resultados indicados na Figura 16.1.
www.juliobattisti.com.br
698
699
www.juliobattisti.com.br
class ex2cap16 { // Exemplo 2 - Captulo 16. // Tratamento de excees com try e finally. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main() { // Bloco try. // Contm o cdigo que pode gerar a exceo.
try
int divisao;
www.juliobattisti.com.br
700
-> {0},divisao);
// Cdigo que ser executado mesmo que nenhuma exceo // seja gerada no bloco try.
finally
Digite o exemplo da Listagem 16.2 e salve-o em um arquivo chamado ex2cap16.cs, na pasta C:Meus documentos. Compile e execute o exemplo da Listagem 16.2. Digite 10 para o numerador e 2 para o denominador. Voc obter os resultados indicados na Figura 16.3. Observe que o cdigo do bloco finally foi executado, mesmo sem ter sido gerada nenhuma exceo.
701
www.juliobattisti.com.br
www.juliobattisti.com.br
702
NOTA: Para uma referncia completa a todos os objetos para tratamentos de excees disponveis no Framework .NET, consulte a documentao do produto ou o site www.msdn.com/net.
// Bloco Catch para tratar qualquer tipo de exceo, ou seja, uma exceo Genrica.
703
www.juliobattisti.com.br
<html>
try {
// Crio uma conexo com o banco de dados pubs localizado no servidor local. // Vamos acessar a instncia SERVIDORXYZ\NETSDK. // O Servidor: SERVIDORXYZ no existe. // Isso far com que seja gerada uma exceo do tipo SqlException,
www.juliobattisti.com.br
704
// Declaro uma varivel do tipo String: auxPropriedades. // A varivel auxPropriedades ir conter o valor das propriedades // da conexo minhaConexo.
ExibePropriedades.Font.Bold=true; ExibePropriedades.Text=auxPropriedades;
705
www.juliobattisti.com.br
MinhaConexo.Open();
// Declaro uma varivel do tipo String: auxPropriedades. // A varivel auxPropriedades ir conter o valor das propriedades // da conexo minhaConexo.
ExibePropriedades.Font.Bold=true; ExibePropriedades.Text=auxPropriedades;
www.juliobattisti.com.br
706
// Bloco Finally. sempre executado, mesmo que nenhuma exceo tenha sido gerada.
finally {
</script>
<asp:TextBox runat=server id=ExibePropriedades Text= Rows=10" Cols=70" Font_Face=Arial Font_Size=3" BackColor=lightblue TextMode=MultiLine />
</body> </html>
707
www.juliobattisti.com.br
Ao carregar a pgina voc ir obter uma pgina semelhante pgina indicada na Figura 16.6.
O servidor SERVIDORXYZ no existe. Neste caso ser gerada uma exceo do tipo SqlException, a qual ser tratada pelo primeiro bloco Catch. Este bloco disparado em resposta a uma exceo do tipo SqlException, que o tipo de exceo que disparada, quando tentamos conectar com um servidor SQL Server que no existe.
www.juliobattisti.com.br
708
No restante deste primeiro bloco Catch repetimos os comandos para estabelecer uma conexo com o servidor SQL Server, porm agora utilizamos o nome correto:
String strCon = server=SERVIDOR\\NETSDK;uid=sa;pwd=;database=pubs; SqlConnection MinhaConexo = new SqlConnection(strCon);
Com isso a conexo estabelecida e as propriedades da conexo so exibidas, no corpo da pgina em um Web Server control do tipo TextBox com mltiplas linhas. Colocamos um outro bloco Catch, o qual ser disparado em resposta a qualquer exceo que no seja do tipo SqlException. Por exemplo, se tivssemos uma operao de diviso na pgina e houvesse uma tentativa de diviso por zero (operao no permitida), uma exceo seria gerada. Como esta exceo no seria do tipo SqlException, ela seria tratada pelo bloco Catch para tratamento de excees genricas excees do tipo Exception:
// Incio do bloco Catch para tratamento da exceo do tipo Exception. catch (Exception ex) { Response.Write(Tratando uma exceo genrica<p>); }
NOTA: Para maiores informaes sobre Web Server Controls, consulte os Captulos 7, 8 e 9.
O bloco Finally ser sempre executado, independente de ter sido, ou no, gerada alguma exceo.
Concluso
Neste captulo, que um brinde para o amigo leitor, falei sobre os aspectos bsicos do tratamento de erros/excees em pginas ASP.NET. Fizemos uma breve reviso das estruturas Try...Catch...Finally e apresentamos alguns exemplos prticos. Com isso voc tem uma boa idia sobre o tratamento estruturado de excees. Um bom estudo a todos e no deixem de entrar em contato atravs do seguinte endereo: webmaster@juliobattisti.com.br
709
www.juliobattisti.com.br
Introduo
Este anexo trata de dois assuntos utilizados nos exemplos do livro: A utilizao da linguagem HTML. A criao de contas de usurios e grupos no Windows 2000.
ANEXO
1
Principais Tags do HTML e Criao de Contas e Grupos no Windows 2000
<body> controles e demais elementos da interface - Server controls - Web Forms - etc </body> </html>
www.juliobattisti.com.br
710
<body> controles e demais elementos da interface - Server controls - Web Forms - etc </body> </html>
Toda pgina ASP.NET tem esta estrutura. Uma parte inicial onde temos o cdigo, responsvel pela lgica da pgina. Na seo de cdigo, como chamada, podemos colocar comandos para fazer a conexo com um banco de dados, para realizar clculos, para responder a eventos que acontecem na pgina, como por exemplo um clique do usurio em um boto, enfim, toda a lgica de programao necessria ao funcionamento da pgina. A seo de cdigo representada pelo seguinte trecho.
<script language=C# runat=server> comando1 comando2 ... comandon </script>
Na segunda parte da pgina, a partir da tag <body>, colocamos os elementos de apresentao da interface. Nesta parte podemos colocar desde cdigo HTML bsico at controles mais avanados como os disponibilizados pelo ASP.NET. Aqui a importncia de conhecermos as principais tags da linguagem HTML, uma vez que na seo de apresentao da pgina podemos utilizar, alm dos controles do ASP.NET, qualquer tag HTML vlida. Em diversos exemplos deste livro utilizamos as tags HTML para criao de tabelas. Com o uso de tabelas fica mais fcil fazer o alinhamento dos diversos elementos da pgina. Tudo o que voc j conhece de HTML pode ser utilizado na seo de apresentao da pgina. Observe que a estrutura de uma pgina ASP.NET deixa bem clara a separao entre cdigo ASP.NET e cdigo de apresentao, bem diferente do que acontecia com o ASP 3.0 onde sees de cdigo ASP so intercaladas com sees de cdigo HTML.
711
www.juliobattisti.com.br
Onde temos os seguintes elementos: <HTML> e </HTML>. Estas tags marcam o incio e o fim de uma pgina HTML. Toda pgina dividida em duas partes: <HEAD>...</HEAD>: o cabealho da pgina, onde podemos inserir uma srie de tags que contm informaes sobre a prpria pgina. A tag mais utilizada na seo de Cabealho <TITLE> </TITLE>, a qual utilizada para definir o ttulo que exibido na Barra de Ttulos do navegador do cliente.
www.juliobattisti.com.br
712
Ao invs de uma cor de segundo plano, poderamos definir uma figura de segundo plano, conforme o exemplho indicado a seguir:
<body background=http://www.abc.com/imagens/texturas/padrao.jpg>
Na Listagem I.3 temos um exemplo onde so utilizadas as diversas tags de ttulos disponvies.
<h1>Esta uma tag h1</h1> <h2>Esta uma tag h2</h2> <h3>Esta uma tag h3</h3> <h4>Esta uma tag h4</h4> <h5>Esta uma tag h5</h5> <h6>Esta uma tag h6</h6>
</body> </html>
713
www.juliobattisti.com.br
Neste caso temos uma tabela com trs linhas. O passo final definir quantas colunas teremos em cada linha. No exemplo a seguir vamos definir duas clulas por linha. O resultado prtico que teremos uma tabela com trs linhas
www.juliobattisti.com.br
714
<body> <table border=1"> <tr> <td>Linha 1, Coluna 1</td> <td>Linha 1, Coluna 2</td> </tr>
<tr> <td>Linha 3, Coluna 1</td> <td>Linha 3, Coluna 2</td> </tr> </table> </body> </html>
Na Figura I.2 temos o resultado desta pgina. Observe que utilizamos o atributo border, para definir o tamanho das bordas (linhas de grade) da tabela. Podemos definir que uma tabela deva ocupar uma porcentagem especfica da janela do navegador, tanto na horizontal quanto na vertical:
<table border=1" width=90% height=50%>
715
www.juliobattisti.com.br
Podemos definir a cor de segundo plano, individualmente, para uma nica clula, utilizando o atributo bgcolor para a tag <td> que define a clula:
<td bgcolor=#ff0000">Contedo da clula</td>
<body>
<tr>
www.juliobattisti.com.br
716
Neste exemplo criamos uma linha com alinhamento esquerda, com espessura de 5 pixels e de cor vermelha. A tag <HR>, automaticamente, insere uma quebra de linha.
<head>
717
www.juliobattisti.com.br
<body>
<h2>Formatao de texto:</h2>
</body> </html>
www.juliobattisti.com.br
718
Formatao de Fonte
Utilizamos a tag <font> </font> para definir algumas caractersticas da fonte, como por exemplo: Cor da fonte Tipo de fonte Tamanho No exemplo da Listagem I.7 utilizamos a tag <font> para formatar texto.
<body>
<h2>Formatao de texto:</h2>
<p> <font face=Arial size=6" color=#FF0000"> Fonte arial, cor vermelha e tamanho 6 </font> </p>
<p> <font face=Arial size=4" color=#0000FF> Fonte arial, cor azul e tamanho 4 </font> </p>
719
www.juliobattisti.com.br
<p> <font face=Arial size=2" color=#FF8000"> Fonte arial, cor laranha e tamanho 2 </font> </p>
</body> </html>
A Tag <A></A>
Esta tag utilizada para criar links em uma pgina HTML. No exemplo da Listagem I.8 utilizamos a tag <A></A> para criar alguns links.
Figura I.5: Formatao bsica de fonte. Listagem I.8 Criando links com a tag <A></A>.
<html>
www.juliobattisti.com.br
720
</body> </html>
721
www.juliobattisti.com.br
NOTA: Tambm utilizamos as tags <ul></ul> e <li></li> para a criao de uma lista com bullets.
No Windows 2000 Server, podemos limitar os recursos aos quais cada usurio tem acesso, atravs do uso de permisses. As permisses de acesso podem ser atribudas para um usurio individualmente, ou para um Grupo de Usurios. Para que possamos atribuir permisses, cada usurio deve ser cadastrado no sistema. Cadastrar o usurio significa criar uma Conta de Usurio para o mesmo. Com uma conta o usurio pode efetuar o logon e receber permisses para acessar os mais variados recursos disponibilizados pelo Windows 2000 Server. Uma conta pode ser criada em um Controlador de Domnio situao em que a conta vlida e reconhecida em todo o domnio; ou a conta pode ser criada em um Servidor Membro situao em que a conta somente vlida e reconhecida no Servidor Membro onde ela foi criada. Contas criadas em um Controlador de Domnio so chamadas de Domain User Accounts (Contas de Usurios do Domnio). Essas contas permitem que o usurio faa o logon em qualquer computador do domnio e receba permisses para acessar recursos em qualquer computador do domnio. Vamos trabalhar e criar contas em um domnio chamado CARUNCHO, com um domnio DNS chamado caruncho.com. Para criar contas em Servidores Membro, o procedimento bastante semelhante, apenas a quantidade de campos de informao de cada conta um pouco menor. Contas criadas em um Servidor Membro so chamadas de Local User Accounts (Contas de Usurios Locais). Essas contas somente permitem que o usurio faa o logon e receba permisses para acessar recursos do computador onde a conta foi criada. Sempre que possvel evite criar Contas Locais em servidores que fazem parte de um domnio. Utilizar as contas do Domnio, as quais ficam armazenadas no Active Directory, torna a administrao bem mais fcil. Outro detalhe que voc deve observar a utilizao de um padro para o nome das contas de usurios. Voc deve estabelecer um padro para a criao de nomes, pois no podemos ter dois usurios com o mesmo nome de logon dentro da mesma Unidade Organizacional. Por exemplo se tivermos na mesma Unidade Organizacional, dois Jos da Silva e os dois resolverem utilizar como logon jsilva, estaremos com um problema. Para isso importante que seja definido um padro e no caso de nomes iguais deve ser definida uma maneira de diferenci-los. Por exemplo poderamos usar como padro a primeira letra do nome e o ltimo sobrenome. No caso de nomes iguais, acrescentam-se nmeros. No nosso exemplo, o primeiro Jos da Silva cadastrado ficaria como jsilva, j o segundo a ser cadastrado ficaria como jsilva1. Caso no futuro tivssemos mais um Jos da Silva dentro da mesma Unidade Organizacional, este seria o jsilva2 e assim por diante.
NOTA: Para maiores informaes sobre Domnios, Controladores de Domnio e Member Servers, consulte o Captulo 4 do livro: Srie Curso Bsico & Rpido Microsoft Windows 2000 Server, de minha autoria, publicado pela Axcel Books (www.axcel.com.br).
www.juliobattisti.com.br
722
IMPORTANTE: Para as senhas, o Windows 2000 Server distingue letras maisculas de minsculas. Por exemplo a senha Abc123 diferente da senha abc123.
Tabela I.1 Contas de Usurios do Domnio CARUNCHO Nome da conta jsilva maria paulo Senha Nome completo
Para criar a Conta para o usurio Jos da Silva: 1. 2. 3. Efetue o logon como Administrador. D um clique no boto Iniciar, aponte para Programas e, dentro de Programas, aponte para Ferramentas administrativas. No menu que surge, d um clique na opo: Usurios e computadores do Active Directory.
Ser inicializado o MMC e carregado o Snap-In para Gerenciamento do Diretrio, conforme indicado pela Figura I.7 4. D um clique no sinal de + ao lado de caruncho.com (provavelmente o nome do seu domnio seja diferente, d um clique no sinal de + ao lado do nome do seu domnio). Abaixo de caruncho.com surgem diversas opes.
723
www.juliobattisti.com.br
www.juliobattisti.com.br
724
IMPORTANTE: Nome de logon do usurio o nome que o usurio utiliza para efetuar o logon em computadores com o Windows 2000 Server. J Nome de logon do usurio (anterior ao Windows 2000) o nome que o usurio utiliza para efetuar o logon em computadores com verses mais antigas do Windows, tais como o Windows NT Server 4.0. Por simplicidade estes dois nomes devem ser iguais; observe que medida que voc digitar o primeiro, o segundo ser automaticamente preenchido.
NOTA: medida que voc for digitando o Nome, Iniciais e Sobrenome, o Windows 2000 Server vai preenchendo o campo Nome completo. Caso voc queira, possvel alterar o Nome completo, sem que isso provoque mudana nos demais campos.
Figura I.10: Cadastrando a senha para o usurio.
725
www.juliobattisti.com.br
www.juliobattisti.com.br
726
NOTA: Crie as contas para os usurios maria e paulo, com as senhas indicadas na Tabela I.1, e depois faa o logon com cada uma das contas, para testar se as mesmas foram criadas corretamente.
D um clique no boto Iniciar, aponte para Programas e dentro de Programas aponte para Ferramentas administrativas. No menu que surge, d um clique na opo: Usurios e computadores do Active Directory. Ser inicializado o MMC e carregado o Snap-In para Gerenciamento do Diretrio. D um clique no sinal de + ao lado de caruncho.com (provavelmente o nome do seu domnio seja diferente, d um clique no sinal de + ao lado do nome do seu domnio).
727
www.juliobattisti.com.br
Voc ter voltado janela Usurios e computadores do Active Directory. Observe que a coluna Descrio para o usurio Jos da Silva j exibe o valor que voc digitou no campo Descrio da guia Geral.
NOTA: Altere as propriedades das contas maria e paulo, criadas anteriormente. Preencha os campos Descrio, Escritrio, Telefone e Correio eletrnico. Invente valores para esses campos, o objetivo fixar os passos para alterar as propriedades de uma conta de usurio.
www.juliobattisti.com.br
728
Ser inicializado o MMC e carregado o Snap-In para Gerenciamento do Diretrio. 4. 5. 6. 7. D um clique no sinal de + ao lado de caruncho.com (provavelmente o nome do seu domnio seja diferente, d um clique no sinal de + ao lado do nome do seu domnio). Abaixo de caruncho.com surgem diversas opes. D um clique na opo Users. No painel da direita exibida uma listagem com o nome de todos os usurios cadastrados. Localize o usurio Jos da Silva e d um clique duplo sobre o mesmo para abrir as propriedades da conta deste usurio. Surge uma janela, com diversas guias, atravs das quais podemos configurar uma srie de propriedades, conforme indicado na Figura I.12. Ao abrir as propriedades de uma conta de usurio, a guia Geral j vem selecionada por padro. 8. D um clique na guia Endereo. Preencha os campos conforme indicado na Figura I.13.
729
www.juliobattisti.com.br
www.juliobattisti.com.br
730
NOTA: Para selecionar um dia todo, por exemplo Domingo, basta clicar no boto Domingo. Isso muito mais fcil do que arrastar o mouse sobre todos os quadradinhos do Domingo. O mesmo vlido para o boto das horas. Se voc clicar no boto 8, estar selecionando o quadradinho correspondente s 8 horas de todos os dias.
Figura I.16: Logon permitido somente de segunda sexta-feira, das 8:00 s 18:00 hs.
15. Agora vamos limitar os computadores nos quais o usurio jsilva pode efetuar o logon. Esse procedimento normalmente adotado com empregados temporrios ou estagirios, de tal forma que o Administrador possa controlar em quais computadores esses usurios podem efetuar o logon.
731
www.juliobattisti.com.br
www.juliobattisti.com.br
732
NOTA: Altere as propriedades das contas maria e paulo. Invente informaes para os endereos das mesmas. Configure as contas para que as mesmas somente possam efetuar o logon das 7:00 s 12:00, de tera sexta-feira. Limite o logon destas contas apenas ao computador com o nome de server1.
IMPORTANTE: Quando falamos em renomear um usurio, significa renomear o Nome de logon do usurio. No nosso exemplo vamos alterar o nome de logon de jsilva para jsilva2.
733
www.juliobattisti.com.br
IMPORTANTE: Renomeie o usurio maria para maria2 e tente efetuar o logon como maria2 e para a senha digite senha123, para verificar se o usurio maria foi renomeado com sucesso para maria2. Lembre-se que renomear o usurio alterar o seu nome de logon.
www.juliobattisti.com.br
734
735
www.juliobattisti.com.br
www.juliobattisti.com.br
736
IMPORTANTE: Com as modificaes que fizemos nesta lio, as senhas devem ser alteradas de 30 em 30 dias (diretiva Tempo de vida mximo de senha) , devem ter no mnimo 8 caracteres (letras, nmeros, e qualquer um dos caracteres especiais permitidos) diretiva Comprimento mnimo de senha , e ao alterar a senha, o usurio no poder repetir uma das trs ltimas senhas utilizadas (diretiva Enforce password history).
NOTA: Altere as diretivas de segurana, de tal maneira que o tamanho mnimo permitido para as senhas seja 10, que no seja permitida utilizar uma senha igual s 4 ltimas e que o tempo mximo de vida seja de 45 dias.
737
www.juliobattisti.com.br
www.juliobattisti.com.br
738
739
www.juliobattisti.com.br
www.juliobattisti.com.br
740
Para alterar o Grupo1 e adicionar os usurios jsilva2, maria e paulo, a este grupo, faa o seguinte: 1. 2. 3. 4. 5. Faa o logon com Administrador. D um clique no boto Iniciar, aponte para Programas e aponte para Ferramentas administrativas. No menu de opes que surge, d um clique na opo Usurios e computadores do Active Directory. Surge o console para criao de contas de usurios e grupos. No painel da direita, localize Grupo1 e d um clique duplo para abrir as propriedades do mesmo. Surge a janela indicada na Figura I.26, onde a guia Geral vem selecionada por padro. Preencha os campos Descrio e Comentrios, conforme indicado na Figura I.26. 6. 7. D um clique na guia Membros. Vamos utilizar esta guia para adicionar os usurios jsilva, maria e paulo como membros de Grupo1. A Figura I.27 mostra a guia Membros, sem nenhum membro adicionado. Para adicionar membros ao grupo, d um clique no boto Adicionar.
741
www.juliobattisti.com.br
www.juliobattisti.com.br
742
NOTA: Crie um grupo de escopo global, do tipo segurana, chamado de Contabilidade. Adicione os usurios maria e paulo ao grupo Contabilidade. Como descrio coloque: Grupo para receber permisses seo de contabilidade.
IMPORTANTE:Existem algumas contas de usurio que so criadas no momento em que o Windows 2000 Server instalado. Essas contas so conhecidas como Built-in Accounts. A mais importante delas a conta Administrador. Essa conta tem poderes totais sobre o domnio, no possuindo nenhuma restrio de segurana. Muito cuidado com quem vai usar essa conta em um ambiente de produo. Precisa ser uma pessoa qualificada e que saiba o que est fazendo. A conta Administrador pode ser renomeada, porm no pode ser excluda nem bloqueada.
743
www.juliobattisti.com.br
www.juliobattisti.com.br
744
Introduo
Neste Anexo aprenderemos sobre os conceitos bsicos de bancos de dados relacionais. Durante as dcadas de 70 e 80 as aplicaes eram baseadas em computadores de grande porte, conhecidos como Mainframes. Nesta poca as aplicaes normalmente eram desenvolvidas em linguagens como Cobol, PL1, Algol ou Natural Adabas, que ficavam residentes nos Mainframes. Os dados tambm ficavam residentes nos Mainframes. A lgica para acesso aos dados estava embutida dentro da prpria aplicao. Com isso, se mudasse a estrutura de armazenamento das informaes, a aplicao teria que ser reescrita. Para acessar as aplicaes, o usurio utilizava os chamados Terminais burros (tambm conhecidos como Terminais verdes, devido cor das letras normalmente ser verde em um fundo preto). Estes terminais eram, simplesmente, uma extenso do Mainframe, equipados com teclado e vdeo. Nenhum processamento era realizado no prprio terminal. Todo e qualquer comando devia ser enviado para processamento no Mainframe, e os resultados enviados de volta para o terminal. Observe que utilizei os verbos sempre no passado. Voc deve estar pensando: Este cara est maluco, pois ainda hoje muitas aplicaes rodam, e bem, no bom e velho Mainframe. E eu serei obrigado a concordar com o amigo leitor. Muitas e importantes so as aplicaes que ainda rodam em Mainframes e duvido que em um futuro prximo, digamos cinco anos, todas estas aplicaes sejam migradas para outras plataformas e modelos de desenvolvimento. Mas tambm precisamos admitir que muito pequeno, para no dizer mnimo, o desenvolvimento de novas aplicaes para o modelo Terminal Mainframe. Com o deslocamento do modelo de desenvolvimento do Mainframe; primeiro para o modelo Cliente Servidor clssico de duas camadas, depois a evoluo para o modelo de desenvolvimento Web com 3 ou mais camadas, tambm sofreram modificaes os Bancos de dados que do suporte ao desenvolvimento destas aplicaes. O Mainframe utiliza formatos de Bancos de dados proprietrios, criados pelos fabricantes dos equipamentos, na maioria dos casos a IBM. Com a expanso cada vez maior das Redes locais de computadores e a utilizao do modelo Cliente Servidor, a utilizao dos chamados Bancos de dados Relacionais cresceu bastante. Hoje a grande maioria das novas aplicaes baseada em Bancos de dados Relacionais. Neste anexo falaremos sobre os princpios bsicos dos Bancos de dados Relacionais, que o modelo de banco de dados utilizado pelo Microsoft SQL
ANEXO
2
O Modelo de Dados Relacional
745
www.juliobattisti.com.br
www.juliobattisti.com.br
746
Entidades e Atributos
Toda a informao de um Banco de dados relacional armazenada em Tabelas, as quais tambm so chamadas de Entidades. Por exemplo, poderamos ter uma Tabela Clientes, onde seriam armazenadas informaes sobre os diversos clientes, uma tabela Produtos, onde so armazenadas informaes sobre os produtos e assim por diante. Para cada um dos Clientes poderamos armazenar informaes tais como: Nome, Rua, Bairro, Telefone, CEP, Data de Nascimento, etc. Essas diversas caractersticas de cada Cliente so os Atributos do Cliente, muitas vezes chamados de campos da entidade Cliente, ou, de maneira mais simples: Os campos da tabela Clientes. O Conjunto de todos os Atributos de um cliente e os valores dos atributos forma o Registro do Cliente. Com isso teremos a tabela constituda por um conjunto de Registros (uma linha completa com informaes sobre o cliente) e cada Registro formado por um conjunto de atributos (Nome, Endereo, etc.). Resumindo: Entidade ou Tabela Um conjunto de registros sobre um determinado assunto. Campos ou Atributos Caractersticas individuais de cada Entidade. Considere o Exemplo da Figura 1.1, onde temos uma tabela Clientes com os seus diversos Campos (atributos): No exemplo da Figura II.1, temos uma entidade: Clientes e seus diversos atributos: Cdigo do Cliente Nome da Empresa Nome do Contato Cargo do Contato Endereo Em cada linha temos um conjunto de atributos e seus valores. Cada linha forma um Registro que identifica um Cliente. Cada Coluna um atributo da tabela Clientes.
747
www.juliobattisti.com.br
www.juliobattisti.com.br
748
749
www.juliobattisti.com.br
www.juliobattisti.com.br
750
751
www.juliobattisti.com.br
www.juliobattisti.com.br
752
NOTA: O campo do lado vrios do relacionamento tambm conhecido como sendo uma Chave Estrangeira. No exemplo da Figura II.6, o campo NmeroDoPedido, na tabela Detalhes do Pedido, seria a nossa Chave Estrangeira do relacionamento em questo.
753
www.juliobattisti.com.br
Integridade Referencial
A Integridade Referencial utilizada para garantir a integridade dos dados entre as diversas tabelas relacionadas, evitando inconsistncias nos dados, bem como repeties desnecessrias. Por exemplo, existe um relacionamento do tipo Um para Vrios entre a tabela Clientes e a tabela Pedidos (um cliente pode fazer vrios pedidos). Com a Integridade Referencial, o banco de dados no permite que seja cadastrado um Pedido para um Cliente que ainda no foi cadastrado na tabela Clientes. Atravs da Integridade Referencial, tambm podemos garantir o seguinte: Quando o Cdigo de um cliente for alterado na tabela Clientes, o banco de dados atualiza, automaticamente, todos os Cdigos do Cliente na tabela Pedidos, de tal maneira que no fiquem registros rfos, isto , registros de Pedidos com um Cdigo de Cliente que no existe mais na tabela Clientes. Essa ao conhecida como Propagar atualizao dos campos relacionados ou Propagar atualizaes em cascata. Quando um cliente for excludo da tabela Clientes, podemos fazer com que o banco de dados exclua, na tabela Pedidos, todos os Pedidos para o cliente que est sendo excludo. Essa opo conhecida como Propagar
www.juliobattisti.com.br
754
Normalizao de Tabelas
O objetivo da normalizao evitar os problemas provocados por falhas no Projeto do banco de dados, bem como eliminar a mistura de assuntos e as correspondentes redundncias de dados. Uma Regra de Ouro que devemos observar quando do projeto de banco de dados a de No Misturar assuntos em uma mesma Tabela. Por exemplo na tabela Clientes devemos colocar somente campos relacionados com o assunto Clientes. No devemos misturar campos relacionados com outros assuntos, tais como Pedidos, Produtos, etc. Essa Mistura de Assuntos em uma mesma tabela acaba por gerar repetio desnecessria dos dados bem como inconsistncias. O Processo de Normalizao aplica uma srie de regras sobre as entidades de um banco de dados, para verificar se estas esto corretamente projetadas. Embora existam 5 formas normais (ou regras de Normalizao), na prtica usamos um conjunto de trs Formas Normais. Normalmente, aps a aplicao das regras de Normalizao, algumas tabelas acabam sendo divididas em duas ou mais tabelas, o que no final acaba gerando um nmero maior de tabelas do que o originalmente existente. Este processo causa a simplificao dos atributos de uma tabela, colaborando significativamente para a estabilidade do modelo, reduzindo-se consideravelmente as necessidades de manuteno. Vamos estudar e entender o Processo de Normalizao na Prtica, atravs de exemplos.
755
www.juliobattisti.com.br
www.juliobattisti.com.br
756
IMPORTANTE: A Distino entre a Segunda e a Terceira forma normal, que veremos no prximo item, muitas vezes confusa. A Segunda Forma normal est ligada ocorrncia de chaves primrias compostas.
757
www.juliobattisti.com.br
IMPORTANTE: Com isso podemos concluir que, como resultado do processo de Normalizao, iremos obter um nmero maior de tabelas, porm sem problemas de redundncia e inconsistncia dos dados, ou com estes problemas minimizados.
www.juliobattisti.com.br
758
NOTA: Neste item estamos falando do projeto fsico do banco de dados, isto , a definio de quais tabelas e do relacionamento entre as mesmas. O resultado final desta fase ser o que chamamos de Diagrama Entidade x Relacionamentos. O projeto completo de uma aplicao de n camadas que ir rodar na rede de uma empresa envolve vrias outras etapas. A descrio completa de todas as etapas foge ao escopo deste anexo, sendo disciplina de Anlise de Sistemas. Um bom livro sobre o assunto o seguinte: Analyzing Requirementes and Defining Solution Architectures MCSD Training Kit, Microsoft Press, ISBN: 0735608547
759
www.juliobattisti.com.br
Concluso
Os conceitos apresentados neste anexo fornecem as bases necessrias para que voc entenda o modelo de dados relacional. Sem um correto entendimento deste modelo, fica muito difcil entender e utilizar as classes do Framework .NET para trabalho com banco de dados.
www.juliobattisti.com.br
760
Introduo
Nos exemplos deste livro, utilizamos uma srie de comandos para realizar uma srie de operaes sobre os dados armazenados, como por exemplo: Selecionar um conjunto de registros com base em critrios especificados Ordenar um conjunto de registros com base em um ou mais campos de dados Alterar informaes no banco de dados Excluir informaes no banco de dados Inserir informaes no banco de dados Para realizar estas operaes, utilizada uma linguagem conhecida com SQL Structured Query Language. A linguagem SQL foi desenvolvida pela IBM, porm, devido ao seu poder e facilidade de utilizao, rapidamente tornou-se um padro de mercado, sendo hoje utilizada pela maioria dos bancos de dados que seguem o modelo Relacional.
ANEXO
3
A Linguagem SQL
NOTA: Pequenas diferenas podem existir entre os comandos SQL de diferentes bancos de dados como por exemplo o Microsoft SQL Server e o Oracle. Neste anexo estaremos utilizando a sintaxe dos comandos SQL utilizados pelo Microsoft SQL Server.
Conhecendo o SQL
O SQL foi desenvolvido para ser uma linguagem padro para operaes em banco de dados. A linguagem SQL foi elaborada para ser independente de hardware ou
761
www.juliobattisti.com.br
Uma Instruo SQL descreve o conjunto de dados que voc deseja recuperar (quais campos, de quais tabelas, Critrios de filtragem, classificao, Expresses Calculadas, etc.). Todas as instrues SQL so conduzidas com um nico comando que contm uma descrio completa da informao exigida. Ao escrever uma instruo SQL, voc no deve se preocupar em como os dados so recuperados, mas somente com o contedo do conjunto de dados. Esse o principal benefcio do mtodo SQL. Lembre-se de que o SQL um padro de mercado para expresses de consulta em banco de dados. Embora a maior parte das verses do SQL compartilhe elementos bsicos, elas no so idnticas. O Access SQL usa algumas palavraschave que voc no encontra em outras verses do SQL. Tambm existem pequenas diferenas entre o Microsoft Access e o Microsoft SQL Server. Veremos atravs de exemplos a utilizao das principais palavras-chaves do SQL para a construo de expresses SQL para pesquisa em banco de dados.
A Instruo SELECT
Esta com certeza a Instruo SQL mais importante; no existe pesquisa que no utilize esta instruo. Vamos conhec-la em detalhes. A Instruo Select utilizada para especificar quais os campos de quais tabelas faro parte da consulta, quais os critrios de pesquisa que sero utilizados, qual a ordem de classificao, etc.
www.juliobattisti.com.br
762
Tabela III.1 Os principais elementos da instruo Select. Elemento campo1, campo2, ... campon nome_da_tabela WHERE GROUP BY Descrio Nome dos campos a serem retornados a partir de uma ou mais tabelas. Nome da tabela a partir da qual os dados devem ser recuperados. Permite que sejam especificados critrios de pesquisa. Podemos agrupar os resultados em torno de um ou mais campos de dados. Por exemplo, em um relatrio de vendas anuais, posso ter os resultados agrupados por ms, com a soma das vendas do ms logo aps a listagem de vendas do ms. Especifica critrios para serem utilizados juntamente com Group By. Podemos ordenar os resultados obtidos com base em um ou mais campos de dados. Por exemplo, podemos ordenar uma listagem de vendas em ordem alfabtica do nome do cliente ou do nome do vendedor.
HAVING ORDER BY
Vamos analisar alguns exemplos prticos de utilizao da Linguagem SQL. Exemplo 1: Criar uma instruo SQL que retorne o campo NmeroDoPedido, o campo DataDoPedido, o campo Frete e o campo PasDeDestino da tabela Pedidos.
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete FROM Pedidos
Observe que os nomes dos campos esto separados por vrgula, e alm disso estamos utilizando o nome completo, isto : Nome_da_tabela.Nome_do_campo. Tambm poderamos utilizar o comando, sem o nome da tabela antes do nome do campo, conforme indicado no seguinte comando:
SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos
763
www.juliobattisti.com.br
IMPORTANTE: Somente obrigatria a utilizao do nome da tabela antes do nome do campo quando o mesmo campo existir em duas ou mais tabelas que fazem parte da instruo Select.
Observe a utilizao da clusula ORDER BY Frete para classificar os registros em ordem Crescente. A classificao em ordem crescente o padro . Quando formos classificar em ordem decrescente, precisamos especificar a palavra DESC, conforme indicado no seguinte comando:
SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos ORDER BY Frete DESC
Exemplo 3: Agora vamos inserir condies. Muitas vezes as condies so chamadas de filtro, uma vez estabelecida uma condio, somente os registros que atendem a condio especificada sero retornados. Desta forma a condio atua como se fosse um filtro. Neste exemplo vamos alterar a instruo SQL anterior para que sejam exibidos somente os pedidos cujo PasDeDestino seja Brasil.
SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos WHERE PasDeDestino=Brasil ORDER BY Frete
Observe a utilizao da Clusula WHERE para filtrar somente os pedidos cujo PasDeDestino seja Brasil. Como o campo PasDeDestino um campo do tipo texto, o valor do critrio (Brasil) tem que vir entre apstrofes. Vamos trabalhar um pouco mais com a clusula WHERE. Exemplo 4: Altere a instruo SQL anterior para que sejam exibidos somente os pedidos para o Brasil ou Alemanha como PasDeDestino.
SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos WHERE Pedidos.PasDeDestino=Brasil Or Pedidos.PasDeDestino=Alemanha ORDER BY Frete
Observe a utilizao da clusula OR ligando os dois Critrios. Lembre que a clusula OR retorna um registro se o PasDeDestino atender um dos dois critrios, isto , se for Brasil ou se for Alemanha, o registro ser selecionado, que exatamente o que desejamos, ou seja, todos os pedidos para o Brasil ou para a Alemanha. Exemplo 5: Altere a instruo SQL anterior, retirando o critrio para PasDeDestino. Adicione um critrio para NmeroDoPedido maior do que 10500, retire a classificao do campo Frete a classifique pelo campo NmeroDoPedido.
www.juliobattisti.com.br
764
Observe a clusula WHERE utilizando o operador de comparao maior do que ( > ) e a classificao atravs da clusula ORDER BY no campo NmeroDoPedido. Podemos ver, atravs dos exemplos, que a linguagem SQL no to difcil como pode parecer primeira vista. Observe que a sintaxe da linguagem bastante intuitiva e orientada extrao de dados atravs das consultas. Vamos continuar analisando alguns exemplos de aplicao da Linguagem SQL com a utilizao de recursos mais avanados. Exemplo 6: Alterar a instruo SQL anterior, e adicionar um critrio de tal maneira que somente sejam exibidos os pedidos para o Ano de 1995. Tirar o critrio do campo Nmero do Pedido.
SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos WHERE Year(DataDoPedido)=1995 ORDER BY NmeroDoPedido
Observe a utilizao da funo Year para extrairmos apenas o Ano do campo DataDoPedido a fim de especificarmos como critrio o Ano=1995. Tambm a clusula Order By foi mantida, classificando a listagem em ordem crescente pelo nmero do pedido. A utilizao de funes junto com os comando SQL nos fornece inmeras possibilidades de refinamento em nossas consultas. Exemplo 7: Alterar a instruo SQL anterior, para que sejam exibidos somente os pedidos no Perodo de 01/01/1995 a 31/07/1995 e que tenham como PasDeDestino Brasil, Argentina, Alemanha ou Canad.
SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos WHERE DataDoPedido Between 1/1/95 And 8/31/95 AND PasDeDestino In (Brasil,Argentina,Alemanha,Canad) ORDER BY NmeroDoPedido
Observe a utilizao de vrios critrios em diferentes campos. Colocamos critrios nos campos DataDoPedido e PasDeDestino. Os critrios de dois ou mais campos so ligados atravs do operador AND, indicando que um registro deve atender ambos os critrios para ser selecionado. Tambm temos a utilizao dos operadores Between (Entre) para selecionar as datas dentro de um determinado intervalo e do operador In (Em) para selecionar o campo PasDeDestino que seja igual a um dos valores apresentados na lista. Observe, tambm, que os valores de data vm delimitados por apstrofes (). Se voc estiver utilizando o Microsoft Access, o valor para os campos do tipo Data deve vir entre sinais de #, ao invs do apstrofe. Exemplo 8: Criar uma instruo SQL que retorne o campo NmeroDoPedido, o campo DataDoPedido, o campo DataDeEntrega, o campo Frete e o campo PasDeDestino da tabela Pedidos. Criar uma coluna adicional que calcula o nmero de dias entre a DataDeEntrega e a DataDoPedido. Chamar esta coluna de Dias_Ped_Entr.
765
www.juliobattisti.com.br
Veja que a coluna calculada DataDeEntrega-DataDoPedido est junto com a listagem dos campos no incio da instruo Select. Alm disso foi utilizada a palavra AS para atribuir um nome (apelido) para esta coluna calculada. Este nome o que ser utilizado para fazer referncia coluna, em uma pgina ASP.NET ou um programa desenvolvido em Visual Basic, por exemplo. Voc tambm pode classificar a listagem em ordem crescente ou decrescente de um campo calculado. Por exemplo, se voc quisesse classificar a listagem do item anterior, em ordem crescente, do nmero de dias entre a DataDeEntrega e a DataDoPedido, bastaria utilizar a seguinte instruo SQL:
SELECT NmeroDoPedido, DataDoPedido, DataDeEntrega, PasDeDestino, Frete, DataDeEntrega-DataDoPedido AS Dias_Ped_Entr FROM Pedidos WHERE (DataDoPedido Between 1/1/95 And 8/31/95) AND (PasDeDestino In (Brasil,Argentina,Alemanha,Canad)) ORDER BY DataDeEntrega-DataDoPedido
Exemplo 9: Alterar a instruo SQL anterior, eliminando os critrios para a DataDoPedido e para o PasDeDestino. Colocar um novo critrio para PasDeDestino, onde sejam exibidos apenas os pedidos cujo PasDeDestino tem a Primeira Letra na faixa de A at M. Utilize o operador Like.
SELECT NmeroDoPedido, DataDoPedido, DataDeEntrega, PasDeDestino, Frete, DataDeEntrega-DataDoPedido AS Dias_Ped_Entr FROM Pedidos WHERE PasDeDestino Like [A-M]% ORDER BY PasDeDestino
Observe a utilizao do Operador Like no critrio de Pesquisa para esta consulta. Nunca demais salientar que a utilizao das instrues SQL juntamente com as funes e operadores como o Like, nos fornece um amplo conjunto de possibilidades. O caractere % utilizado como um caractere curinga. Por exemplo, se especificarmos o seguinte critrio:
WHERE NomeDoCLiente Like Joo%
sero retornados todos os registros para Clientes cujo nome inicia com Joo. O caractere curinga % significa, em termos simples: qualquer coisa, ou seja, o critrio especifica que o nome inicie com Joo, no importando (qualquer coisa) o que vier depois.
www.juliobattisti.com.br
766
IMPORTANTE: Aqui cabe um aviso importante para os usurios do Microsoft Access. No Microsoft Access, o caractere curinga o *, j no Microsoft SQL Server 2000, utilizamos como caractere curinga o %, o qual tambm utilizado na construo de pginas ASP.NET.
767
www.juliobattisti.com.br
Observe que esta listagem ir trazer vrios registros para cada Pedido, tantos quantos forem os itens de cada pedido. Mas se, ao invs do CdigoDoProduto, ns quisssemos que fosse exibida a Descrio do Produto? Em primeiro lugar esta informao encontra-se na tabela Produtos; logo, teremos que adicionar a Tabela Produtos nossa consulta, a qual ir se ligar tabela Detalhes Do Pedido atravs do campo CdigoDoProduto; logo teremos mais um Join. Para trs tabelas teremos dois Joins. Aps adicionar a tabela Produtos e substituir o campo CdigoDoProduto pelo campo NomeDoProduto, a nossa instruo SQL deve ficar conforme indicado no seguinte comando:
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete, Produtos.NomeDoProduto, DetalhesdoPedido.PreoUnitrio, DetalhesdoPedido.Quantidade FROM Produtos INNER JOIN (Pedidos INNER JOIN DetalhesdoPedido ON Pedidos.NmeroDoPedido = DetalhesdoPedido.NmeroDoPedido) ON Produtos.CdigoDoProduto=DetalhesdoPedido.CdigoDoProduto ORDER BY Pedidos.NmeroDoPedido
Observe que neste caso temos um INNER JOIN dentro do outro. Dentro do parnteses feita a ligao entre as tabelas Pedidos e DetalhesdoPedido, atravs do campo NmeroDoPedido, e externamente feita a ligao entre as tabelas Produtos e DetalhesdoPedido, atravs do campo NmeroDoPedido. Podemos utilizar diversos nveis de INNER JOIN, embora esta no seja uma prtica recomendada, pois, se aumentarmos muito os nveis de INNER JOIN, posso ter como resultado pesquisas mais lentas em conseqncia do aumento da complexidade das consultas. At 3 ou 4 nveis considerado normal, acima disso preciso repensar a maneira de construir a consulta. Exemplo 11: Alterar a instruo SQL do item anterior para que somente sejam exibidos os pedidos para os produtos cujo NomeDoProduto inicie com uma letra na faixa de A at J. Tirar a classificao do campo NmeroDoPedido e classificar em ordem crescente do campo NomeDoProduto.
www.juliobattisti.com.br
768
Observe, alm dos dois INNER JOIN, a utilizao da clusula WHERE em conjunto com Operador LIKE para especificar o critrio desejado. At este momento estivemos construindo Instrues SQL que executam consultas no banco de dados. Especificamos quais campos sero exibidos, critrios de filtragem para estes campos e uma ordem de classificao. A partir de agora aprenderemos a utilizar Instrues SQL para a construo de outros tipos de operaes, as quais realizam alteraes e incluses em tabelas de banco de dados.
A Instruo UPDATE
A instruo UPDATE utilizada para alterar informaes em um banco de dados. Poderamos, por exemplo, criar um formulrio onde o usurio pode alterar os seus dados cadastrais. Primeiro os dados so recuperados a partir do banco de dados,e em seguida as alteraes so enviadas de volta para o banco de dados, atravs de uma instruo UPDATE. Vamos estudar esta instruo atravs de exemplos, assim como fizemos com a instruo SELECT. Exemplo 1: Criar uma instruo SQL que aumenta o PreoUnitrio em 20 % na tabela DetalhesdoPedido, devido a um ajuste na moeda e uma desvalorizao em relao ao Dlar.
UPDATE DetalhesdoPedido SET PreoUnitrio = PreoUnitrio*1.2
Observe a simplicidade da instruo SQL. Utilizamos uma instruo UPTADE, seguida do nome da tabela onde ser feita a atualizao. Em seguida uma instruo SET com a expresso de atualizao para aumentar em 20 % o PreoUnitrio em todos os registros da tabela DetalhesdoPedido. Vamos alterar a instruo anterior, para incluir um critrio na consulta de atualizao. Exemplo 2: Alterar a instruo SQL do item anterior para que somente sejam aumentados em 20%, o campo PreoUnitrio dos registros cujo PreoUnitrio for maior ou igual a R$ 20,00.
769
www.juliobattisti.com.br
Adicionamos uma clusula WHERE, para atualizar apenas os registros cujo PreoUnitrio seja maior ou igual a R$ 20,00. Exemplo 3: Alterar a instruo SQL do Exemplo anterior para que somente sejam aumentados os registros cujo PreoUnitrio for maior ou igual a R$ 20,00 e cujo NmeroDoPedido seja menor do que 10500.
UPDATE DetalhesdoPedido SET PreoUnitrio = PreoUnitrio*1.2 WHERE (PreoUnitrio>=20) AND (NmeroDoPedido<10500)
Observe que utilizamos critrios em dois campos (PreoUnitrio e NmeroDoPedido) e que estes critrios esto ligados por um operador AND, o que significa que um registro somente ser atualizado se ele atender aos dois critrios ao mesmo tempo (PreoUnitrio maior ou igual a 20 e NmeroDoPedido menor do que 10500). Se o registro atender apenas uma das condies, o registro no ter o seu PreoUnitrio atualizado. Vamos refinar um pouco mais a nossa consulta de atualizao. Vamos fazer com que somente sejam atualizados os Pedidos para o ano da DataDoPedido igual a 1995, e ainda iremos manter os critrios adicionados at agora. Exemplo 4: Alterar a instruo SQL do Exemplo anterior para incluir um critrio para que o Ano da DataDoPedido seja 1995. Voc ter que incluir a tabela Pedidos, uma vez que o campo DataDoPedido encontra-se nesta tabela.
UPDATE Pedidos INNER JOIN DetalhesdoPedido ON Pedidos.NmeroDoPedido = DetalhesdoPedido.NmeroDoPedido SET DetalhesdoPedido.PreoUnitrio = PreoUnitrio*1.2 WHERE (DetalhesdoPedido.PreoUnitrio>=20) AND (DetalhesdoPedido.NmeroDoPedido<10500) AND Year(DataDoPedido)=1995)
Temos diversos detalhes interessantes a observar nesta instruo SQL. Primeiro um INNER JOIN relacionando as tabelas Pedidos e DetalhesdoPedido, atravs do campo NmeroDoPedido. Isso mostra que perfeitamente possvel utilizar um INNER JOIN dentro de uma consulta de
www.juliobattisti.com.br
770
A Instruo INSERT
A instruo INSERT utilizada para adicionar registros em uma tabela de um banco de dados. Por exemplo, quando o usurio preenche os dados de um formulrio de cadastro e envia estes dados para o banco de dados, podemos utilizar a instruo INSERT para inserir os dados em uma tabela do banco de dados. Vamos analisar alguns exemplos. Exemplo 1: Este exemplo cria um novo registro na tabela Funcionrios:
INSERT INTO Funcionrios (Nome, Sobrenome, Cargo) VALUES (Paulo, Braga, Estagirio)
Esta instruo insere um registro na tabela Funcionrios com os seguintes dados: Nome: Paulo Sobrenome: Braga Cargo: Estagirio Exemplo 2: Este exemplo seleciona todos os estagirios de uma tabela Estagirios que tenham sido contratados h mais de 30 dias e adiciona os registros selecionados tabela Funcionrios.
INSERT INTO Funcionrios SELECT Estagirios.* FROM Estagirios WHERE DataDaContratao < Date() - 30
Observe que utilizamos a funo Date( ) para capturar a data do Sistema e subtramos 30, para obter apenas os funcionrios contratados h mais do que 30 dias.
A Instruo DELETE
A instruo DELETE utilizada para excluir registros de um banco de dados. Vamos supor que voc tenha desenvolvido uma aplicao Web para agenda eletrnica, onde o usurio pode cadastrar contatos, endereos, telefones e compromissos. Podemos criar uma pgina ASP.NET que permite ao usurio eliminar dados que no sejam mais necessrios na agenda. Neste caso podemos fazer uso da instruo DELETE. Vamos a um exemplo prtico. Exemplo 1: Criar uma instruo SQL que elimine todos os Pedidos da tabela Pedidos cujo PasDeDestino seja a Alemanha.
771
www.juliobattisti.com.br
A instruo to simples que praticamente dispensa comentrios. A nica recomendao importante que no devemos utilizar uma instruo DELETE, sem a utilizao de uma clusula WHERE. Utilizar um DELETE sem uma clusula WHERE significa que estaremos eliminando todos os registros da tabela. Neste item apresentamos uma breve introduo linguagem SQL, que no Microsoft SQL Server chamada de Transact-SQL. De maneira alguma foram apresentadas todas as instrues e comandos disponveis.
www.juliobattisti.com.br
772
Tabela III.2 Campos Tabelas Campo NmeroDoPedido DataDoPedido CdigoDoProduto PreoUnitrio Quantidade Tabela Pedidos Pedidos Detalhes do Pedido Detalhes do Pedido Detalhes do Pedido
Esta listagem ir retornar uma linha para cada item de cada pedido, com os campos indicados na Tabela III.2. Por exemplo, se um campo tiver 5 itens sero retornadas 5 linhas, com o mesmo valor para o campo NmeroDoPedido e OrderDate e diferentes valores para os demais campos. Para construir a listagem solicitada, utilizamos o seguinte comando:
SELECT [Pedidos].[NmeroDoPedido], [Pedidos].[OrderDate], [Detalhes do Pedido].[ProductID], [Detalhes do Pedido].[UnitPrice],[Detalhes do Pedido].[Quantity] FROM JOIN [Pedidos] ON [Detalhes do Pedido].[NmeroDoPedido] = [Pedidos].[NmeroDoPedido] [Detalhes do Pedido]
Observe que estamos utilizando a sintaxe [NomeDaTabela].[NomeDoCampo]. O resultado parcial indicado na listagem a seguir:
NmeroDoPedido DataDoPedido 10248 10248 10248 10249 10249 10250 10250 10250 ... 4/7/1996 11 4/7/1996 42 4/7/1996 72 5/7/1996 14 5/7/1996 51 8/7/1996 41 8/7/1996 51 8/7/1996 65 ... Cdigo 14 9,8 12 10 PreoUnitrio
773
www.juliobattisti.com.br
Alm do JOIN ligando as duas tabelas, devemos especificar qual o campo em comum nas duas tabelas. Isto feito pela clusula ON.
Tipos de JOIN
Existem trs tipos de JOIN, conforme listado a seguir: INNER JOIN: Este o JOIN padro, isto , se no especificarmos o tipo de JOIN a ser utilizado, ser utilizado um INNER JOIN. A caracterstica do INNER JOIN que somente so retornados os registros que tm valores coincidentes nas duas ou mais tabelas. Por exemplo, se tivermos um INNER JOIN ligando as tabelas Clientes e Pedidos, somente sero retornados os registros para os clientes que tm algum pedido na tabela Pedidos. Clientes que no efetuaram pedidos (portanto no tm registros coincidentes na tabela Pedidos) no faro parte do resultado da operao INNER JOIN. A seguir um exemplo de utilizao de um INNER JOIN, entre as tabelas Clientes e Pedidos:
SELECT [Clientes].[CdigoDoCliente], [Clientes].[NomeDaEmpresa], [Clientes].[Cidade],[Pedidos].[NmeroDoPedido], [Pedidos].[DataDoPedido] FROM [Clientes]
Este comando retorna todos os clientes que tm pedidos e os respectivos pedidos. Se um cliente tiver 10 pedidos, retornaro 10 registros para este cliente, um para cada pedido. Clientes que no tm pedido, no aparecero na listagem. LEFT OUTER JOIN: Este tipo retorna todos os registros da primeira tabela e os registros relacionados da segunda tabela. No nosso exemplo, na listagem anterior, se trocarmos o INNER JOIN por um LEFT OUTER JOIN, sero retornados todos os Clientes e os pedidos relacionados, e tambm os clientes que no possuem pedidos. Para aqueles clientes que no possuem pedidos, os campos NmeroDoPedido e DataDoPedido tero o valor Null. A seguir temos o comando que utiliza um LEFT OUTER JOIN:
www.juliobattisti.com.br
774
Na Figura III.1 podemos observar que foram retornados inclusive os clientes que no possuem pedidos, o que indicado pelos valores NULL nos campos NmeroDoPedido e OrderDate.
IMPORTANTE: Se voc utilizar o Banco de dados Northwind que vem com o SQL Server 2000, sero retornados todos os clientes, pois existem pedidos para todos. Para poder exemplificar neste exerccio, eu exclu os pedidos para os clientes com os seguintes cdigos: ALFKI, ANATR, ANTON, AROUT.\
Na Figura III.2 podemos observar que foram retornados todos os pedidos da tabela pedidos, mas apenas os clientes que possuem pedidos, isto , todos os registros da segunda tabela (Pedidos) e apenas os registros relacionados da primeira tabela (Clientes).
775
www.juliobattisti.com.br
Tabela III.3 Campos Tabelas Campo CdigoDoCliente NomeDaEmpresa NmeroDoPedido DataDoPedido TotalPedido Tabela Clientes Clientes Pedidos Pedidos ([Quantidade]*[PreoUnitrio])*(1-[Desconto])
Teremos uma listagem com o cdigo e o nome do cliente, o nmero, a data e o total do pedido, sendo que o total calculado a partir de dados da tabela Detalhes do Pedido. Com isso estamos acessando campos de trs tabelas: Clientes, Pedidos e Detalhes do Pedido. Trs tabelas = dois joins.
www.juliobattisti.com.br
776
Berglunds snabbkp 10278 Berglunds snabbkp 10280 Berglunds snabbkp 10384 Berglunds snabbkp 10444 Berglunds snabbkp 10445 Berglunds snabbkp 10524 ... ... ...
Vamos fazer alguns comentrios sobre o comando anterior. Primeiro vamos considerar o trecho onde feito o JOIN entre as trs tabelas. Na verdade o JOIN feito sempre entre duas tabelas, dizemos duas a duas, conforme indicado no trecho a seguir:
FROM [Detalhes do Pedido] INNER JOIN [Pedidos]
777
www.juliobattisti.com.br
Primeiro fizemos o JOIN entre as tabelas [Detalhes do Pedido] e [Pedidos], atravs do campo [NmeroDoPedido]. Depois feito o JOIN entre as tabelas [Pedidos] e [Clientes], atravs do campo CdigoDoCliente. Tambm utilizamos GROUP BY, para agrupar os diversos itens de cada pedido e a funo SUM, para calcular a soma de todos os itens do pedido. No final ordenamos pelo cdigo do cliente [CdigoDoCliente].
Utilizando Subconsultas
Uma subconsulta um comando SELECT dentro de outro comando SELECT, ou seja, uma consulta dentro da outra. Uma consulta pode ser utilizada em qualquer local onde uma expresso seja aceita. Em alguns casos, podemos obter os mesmos resultados utilizando JOINs ao invs de subconsultas. Um detalhe para o qual devemos estar atentos quando utilizamos subconsultas em relao ao desempenho. De uma forma geral, devemos utilizar subconsultas quando quisermos dividir uma consulta complexa, em uma srie de passos mais simples, mas que combinados geram o resultado da consulta complexa. Alguns detalhes a serem considerados quando utilizamos subconsultas: Subconsultas devem estar dentro de parnteses. Podemos ter diversos nveis de subconsultas, isto , uma consulta dentro da outra. Porm mais uma vez quero chamar ateno para a questo do desempenho. Para vermos as subconsultas em ao, vamos a um exemplo. Exemplo: Criar uma listagem onde so exibidos os campos NmeroDoPedido da tabela Pedidos, o campo DataDoPedido da tabela Pedidos e o maior preo unitrio dos itens que fazem parte do pedido. Para criar esta consulta, utilizamos o seguinte comando:
SELECT [Pedidos].[NmeroDoPedido], [Pedidos].[DataDoPedido], (SELECT MAX([Detalhes do Pedido].[PreoUnitrio]) FROM [Detalhes do Pedido] WHERE [Pedidos].[NmeroDoPedido] = [Detalhes do Pedido].[NmeroDoPedido]) AS MaiorPreoUnitrio FROM [Pedidos]
www.juliobattisti.com.br
778
Observe a subconsulta
(SELECT MAX([Detalhes do Pedido].[PreoUnitrio]) FROM [Detalhes do Pedido] WHERE [Pedidos].[NmeroDoPedido] = [Detalhes do Pedido].[NmeroDoPedido]) AS MaiorPreoUnitrio
Esta consulta pesquisa os diversos itens para cada pedido e retorna o maior preo unitrio. Outro uso tpico de uma subconsulta como parmetro da filtragem da consulta. Considere o comando a seguir:
SELECT NmeroDoPedido, CdigoDoCliente,DataDoPedido As MaisRecente FROM Pedidos WHERE DataDoPedido=(Select MAX(DataDoPedido) FROM Pedidos)
Este comando retorna os pedidos mais recentes, ou seja, para o valor mximo da data. O valor mximo da data significa a data mais recente no banco de dados. O resultado desta consulta o seguinte:
Nmero 11077 11076 11075 11074 Cdigo RATTC BONAP RICSU SIMOB MaisRecente 1998-05-06 1998-05-06 1998-05-06 1998-05-06
A subconsulta determina a data mais recente, data esta que utilizada como critrios para a clusula WHERE. Em resumo, o resultado retornado pela subconsulta passado para a clusula WHERE. Se trocarmos o MAX por MIN, teremos uma listagem dos pedidos mais antigos. Execute o seguinte comando:
SELECT NmeroDoPedido, CdigoDoCliente,DataDoPedido As MaisAntigo FROM Pedidos WHERE DataDoPedido=(Select MIN(DataDoPedido) FROM Pedidos)
779
www.juliobattisti.com.br
ORDER BY [Funcionrios].[Nome]
Vamos explicar o funcionamento desta subconsulta em quatro passos: 1. 2. 3. 4. Os valores obtidos pela consulta externa (primeiro SELECT) so passados para a consulta interna. Lembre que para cada registro obtido pela consulta externa, a consulta interna executada. A consulta interna (segundo SELECT) utiliza o valor passado pela consulta externa e executa o comando SELECT da subconsulta. Aps a execuo, a subconsulta retorna o seu resultado para a consulta principal. Com base no valor retornado pela subconsulta, em conjunto com a funo EXISTS, o registro retornado pela consulta externa includo ou descartado do resultado final. O prximo registro retornado pela consulta externa passado para a consulta interna, a qual executa novamente. E o processo continua, at que todos os registros da consulta principal tenham sido passados para a consulta interna. Desta maneira vemos que a consulta interna executada tantas vezes, quantos forem os registros retornados pela consulta externa. A seguir temos os resultados do comando deste exemplo:
NomeCompleto Andrew Fuller Anne Dodsworth Janet Leverling Laura Callahan Margaret Peacock Michael Suyama Cdigo 2 9 3 8 4 6
www.juliobattisti.com.br
780
A correta utilizao de subconsultas pode facilitar a obteno de resultados aparentemente complexos de se obter com um nico comando SELECT. Porm, mais uma vez, vou ressaltar o cuidado em relao ao desempenho, quando tratamos com subconsultas.
Concluso
Neste anexo apresentamos uma noo bsica da Linguagem SQL. Aprendemos a utilizar diversos elementos da linguagem, como por exemplo: A instruo Select e as suas diversas clusulas A instruo Update A instruo Insert INTO A instruo Delete O operador Like As clusulas WHERE e ORDER BY O operador In Os operadores AND e OR Tambm apresentamos alguns conceitos avanados do SQL, como por exemplo: Utilizao de JOIN Subconsultas
781
www.juliobattisti.com.br
Introduo
Neste antexo apresento uma lista de sites com informaes sobre .NET, C# e ASP.NET. Nestes sites voc encontrar informaes tais como: Artigos. Exemplos de cdigo. Componentes e Web Services gratuitos. Componentes e Web Services pagos. Na Tabela IV.1 temos a lista de sites indicados.
ANEXO
4
Sites Sobre ASP.NET, C# e XML
msdn.microsoft.com/net Site oficial da Microsoft sobre o .NET. Aqui voc encontra link para fazer o Download do Framework .NET, link para encomendar os CDs de avaliao do Visual Studio .NET. Tambm est disponvel a documentao atualizada para todas as linguagens e tecnologias do .NET. , sem dvida, referncia obrigatria para quem est iniciando os estudos de .NET. Eu recomendo. www.asp.net Um portal de informaes sobre ASP.NET, C# e tecnologias .NET em geral. Contm links para outros excelentes sites. Referncia obrigatria. Simplesmente fantstico. Eu recomendo. Excelente site, com links para artigos, classificados por categoria: Banco de dados, segurana, Web Services, etc. Contm links para diversos sites especializados em ASP.NET. Eu recomendo. timo site com lies gratuitas sobre os aspectos bsicos do ASP.NET. Site pago. A assinatura anual custa U$ 50,00. Contm uma grande quantidade de artigos e tutoriais sobre ASP.NET. Link para artigos, sites, componentes. Links para assuntos diversos como SOAP, PHP, XML, C# e .NET em geral. timo site com lies gratuitas sobre os aspectos bsicos do ASP.NET.
www.123aspx.com
www.aspnextgen.com
www.juliobattisti.com.br
782
Descrio Um grande nmero de artigos com o cdigo disponvel. Links para outros sites. Trata de assuntos tais como: ASP, ASP.NET, C#. Fantstico, eu recomendo. O mais completo portal sobre ASP.NET. Centenas de links divididos por categorias: Aplicaes, Exemplos e Tutoriais, Cdigos, Componentes, Comunidades, Hospedagem com suporte a ASP.NET, etc. Excelente, eu recomendo. Bom site com informaes sobre ASP, ASP.NET, C# (melhor rea do site), XML, SOAP, ADSI e VB. Uma comunidade de especialistas em .NET, onde so publicados artigos sobre ASP.NET, XML, SOAP, C#, alm de links para diversos outros sites relacionados. Site interessante com diversos exemplos prticos. Cdigo dos exemplos disponvel. Explicaes detalhadas sobre cada exemplo. Site com tutoriais, artigos e links sobre ASP, ASP.NET e Web Services. Excelente site. Com muitos artigos, links e informaes sobre: ASP, ASP.NET, PHP, Java, Java Script e CGI. Eu recomendo. Maravilhoso. Artigos, Revistas, links, tutoriais. Tudo muito bem organizado e fcil de localizar. Destaque para informaes sobre Web Services. Eu recomendo. Bom site. Com links para artigos divididos por categoria. Tambm contm links para outros sites sobre ASP.NET. Bom site. Com artigos, dicas e tutoriais. Bom design e navegao intuitiva.
www.aspwire.com
www.15seconds.com/focus/.NET.htm Lista com diversos artigos gratuitos sobre ASP.NET, XML, Web Services, ADSI e outros assuntos relacionados. www.devasp.net/net Site simplesmente fantstico. Links para artigos,tutoriais, cdigo gratuito. Trata de VB.NET, ASP.NET, C#, XML, SOAP, Download de Componentes. Um dos melhores sites de .NET que eu conheo. Eu recomendo. Revista sobre ASP.NET com links para grupos de discusso.
www.aspnetpro.com
Tabela IV.2 Sites sobre C#. Site www.csharp.net Descrio Excelente portal sobre C#. Links para artigos, tutoriais, cdigos gratuitos e outros sites com informaes sobre C#. Excelente site. Eu recomendo.
783
www.juliobattisti.com.br
Descrio Site pago. A assinatura anual custa U$ 50,00. Contm uma grande quantidade de artigos e tutoriais sobre C#. Bom site. Com artigos, e links para C#, ADO.NET, VB.NET e demais tecnologias .NET. Excelente. Tutoriais, links para outros sites sobre C#. Exemplos divididos por categorias, componentes, Web Services, XML, SOAP e .NET em geral. Eu recomendo. Excelente. Tutoriais, links para outros sites sobre C#. Exemplos divididos por categorias, componentes, Web Services, XML, SOAP e .NET em geral. Eu recomendo. timo. Suporte a dvidas, cdigo, exemplos, tutoriais, Base de Conhecimentos sobre C#, links para outros sites e novidades sobre .NET. Eu recomendo. timo. Site gratuito para desenvolvedores .NET que utilizam C#. Contm artigos, cdigofonte, tutoriais e grupos de discusso. Contm links e tutoriais. Bom site.
Outros sites sobre C# www.csharp.com www.csharpfree.com www.csharpgoodies.com www.c-sharpcenter.com www.easycsharp.com/ pages.zoom.co.uk/seesharp/ ManyQuestions.com www.hitmill.com Na Tabela IV.3 temos a lista de sites indicados para XML.
Tabela IV.3 Sites sobre XML. Site www.xml.org www.vbxml.com www.wdvl.com Descrio Excelente portal sobre XML. Links para artigos, tutoriais e outros sites sobre XML. Eu recomendo. Bom site. Links, artigos, tutoriais e muita informao para programadores VB e ASP/ ASP.NET, que trabalham com XML. Excelente site sobre uma variedade de tecnologias para desenvolvimento Web. Excelentes artigos e tutoriais sobre XML.
www.juliobattisti.com.br
784
Descrio Links, artigos e timos tutoriais. Ideal para quem est iniciando no estudo do XML. Site com a especificao oficial para o XML. Eu recomendo. Um portal com grande quantidade de informaes sobre XML. Excelente. Eu recomendo. Outro excelente portal com grande quantidade de informaes sobre XML. Eu recomendo. Site da Microsoft sobre XML. Eu recomendo.
Concluso
Com o contedo apresentado neste livro, mais as referncias deste Anexo, o leitor tem condies de entender este novo conceito que est agitando a indstria de desenvolvimento de Software: .NET. Se voc tem sugestes sobre assuntos que gostaria de ver em futuras edies deste livro, ou publicados no site da editora, por favor entre em contato pelo e-mail: webmaster@juliobattisti.com.br O cdigo com os exemplos deste livro, est disponvel para download no seguinte endereo: www.axcel.com.br. No site do autor voc encontrar artigos sobre ASP.NET, C#, Certificaes Microsoft, Matemtica para Concursos e cursos gratuitos: www.juliobattisti.com.br Um bom estudo a todos.
785
www.juliobattisti.com.br