You are on page 1of 801

CAPTULO 8: VALIDATION SERVER CONTROLS

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Nota sobre direitos autorais:


Este ebook de autoria de Jlio Battisti, sendo comercializado diretamente atravs do site www.juliobattisti.com.br ou atravs do site de leiles Mercado Livre: www.mercadolivre.com.br, pelo usurio GROZA. Nenhum outro usurio, pessoa ou site est autorizado a vender este ebook. Ao adquirir este ebook voc tem o direito de l-lo na tela do seu computador e de imprimir quantas cpias desejar. vetada a distribuio deste arquivo, mediante cpia ou qualquer outro meio de reproduo, para outras pessoas. Se voc recebeu este ebook atravs do e-mail ou via ftp de algum site da Internet, ou atravs de um CD de Revista, saiba que voc est com uma cpia pirata, no autorizada. A utilizao de uma cpia pirata, no autorizada, crime de Violao de Direitos Autorais, sujeita a pena de Cadeia. O valor cobrado por este arquivo praticamente simblico, pelas horas e horas de trabalho que ele representa. Novos e-books somente podero ser desenvolvidos pela honestidade de pessoas que adquirem o arquivo do e-book e no o distribuem livremente para outras pessoas. Se voc recebeu uma cpia deste arquivo sem t-la adquirido diretamente com o autor, seja honesto, entre em contato com o autor, atravs do e-mail webmaster@juliobattisti.com.br, para regularizar esta cpia. Ao regularizar a sua cpia voc estar remunerando, mediante uma pequena quantia, o trabalho do autor e incentivando que novos trabalhos sejam disponibilizados. Se voc tiver sugestes sobre novos cursos que gostaria de ver disponibilizados, entre em contato pelo email: webmaster@juliobattisti.com.br. Visite periodicamente o site www.juliobattisti.com.br para ficar por dentro das novidades:

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

CAPTULO 8: VALIDATION SERVER CONTROLS

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

Conhea Outros Livros do Autor Jlio Battisti


Manual de Estudos Para o Exame 70-217 752 pginas
Chega ao mercado editorial mais um aguardado lanamento da Axcel Books Editora - Certificao Microsoft - Guia de Estudos Para o MCSE - Exame 70217, onde o autor Jlio Battisti descreve, de forma detalhada e com exemplos passo-a-passo, todos os tpicos que fazem parte do programa oficial da Microsoft para o exame de certificao 70-217. A obra apresenta e explica desde os princpios bsicos, incluindo os fundamentos do Active Directory; passando por servios tais como DNS, gerenciamento de compartilhamentos, Master Operations, permisses NTFS, Grupos de Usurios, Unidades Organizacionais e Group Policy Objects, os GPOs; alm de ainda tratar de questes como a configurao de Auditoria de Objetos, o gerenciamento do Schema, entre outros. Um curso completo de Active Directory para o Windows 2000 Server

Windows Server 2003 Curso Completo 1568 pginas


O livro ensina desde os fundamentos bsicos do Active Directory, passando pela instalao do Windows Server 2003 e por dicas sobre o projeto, implementao e migrao do Windows 2000 Server para o Windows Server 2003. Voc aprender, em detalhes, sobre os servios de compartilhamento de arquivos e impressoras, segurana, como tornar o Windows Server 2003 um servidor Web, aprender sobre os servios de rede: DNS, DHPC, WINS, RRAS, IPSec, Anlise de Segurana, Group Policy Objects e muito mais. Confira, vale a pena.

Manual de Estudos Para o Exame 70-216 712 pginas


Neste aguardado lanamento da Axcel Books Editora - Certificao Microsoft - Guia de Estudos Para o MCSE - Exame 70-216, o autor Jlio Battisti descreve, de forma detalhada e com exemplos passo-a-passo, todos os tpicos que fazem parte do programa oficial da Microsoft para o exame de certificao. A obra apresenta e explica desde os princpios bsicos, incluindo os fundamentos do protocolo TCP/IP; passando por instalao, configurao e administrao do DNS, DHCP, WINS e RRAS; alm de ainda tratar de questes quanto ao roteamento, NAT, Certificados Digitais, IPSec, entre outros.

www.juliobattisti.com.br

IV

Windows XP Home & Professional 840 pginas


O novo mundo do Windows XP, que representa a nova era do sistema operacional para usurios e administradores est reunido nesta obra. Jlio Battisti apresenta a nova interface do sistema, completamente redesenhada e com a experincia de um profissional certificado da Microsoft. Na obra, os leitores iro aprender a implementar, configurar e utilizar o Windows XP, desvendando as funcionalidades, alm das configuraes de segurana, de desempenho e de estabilidade do sistema. O livro aborda ainda toda a parte de Internet do Windows XP - conectando e usando a Internet; configurando o firewall de conexo; alm dos novos recursos do correio eletrnico. Veja tambm os detalhes sobre o Active Directory, as configuraes de rede e protocolo TCP/IP, criptografia, registry do Windows, entre tantos outros assuntos. O leitor ainda vai poder contar com um captulo exclusivo e um simulado com 100 questes/respostas destinados aos interessados no exame de Certificao 70-270 da Microsoft.

Manual de Estudos Para o Exame 70-290 1021 pginas


Um Manual de Estudos Completo para o Exame 70-290: Gerenciando e Mantendo um Ambiente Baseado no Windows 2000 Server. (Managing and Maintaining a Microsoft Windows Server 2003 Environment). Este o exame de Administrao do Windows 2000 Server, equivalente ao Exame 70-215 para o Windows 2000 Server. O Exame 70-290 um exame obrigatrio para o candidato que deseja obter a certificao MCSE-2003.UM GUIA INDISPENSVEL PARA QUEM QUER PASSAR NO EXAME 70-290 Este manual apresenta as seguintes caractersticas: Curso em Portugus, baseado no Windows Server 2003 em Portugus, Completo, abrangente, abordando todos os tpicos do programa oficial, Repleto de exemplos prticos, passo-a-passo, detalhadamente explicados, Simulado com 60 questes, Questes com respostas e comentrios detalhados.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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

Captulo 2: Entendendo o CLR


Introduo CLR Common Language Runtime Compilar ou no Compilar, eis a Questo? O Papel dos Metadados (Metadata) Integrao Entre Diferentes Linguagens: Promessa ou Realidade? O Processo de Execuo de Cdigo do CLR Mais Algumas Observaes Sobre o JIT Assemblies Uma Definio em Poucas Palavras Funes do Assembly Componentes do Assembly O que Temos no Manifesto? CTS Common Type System Classificao dos Tipos do CTS .NET Framework Class Library Biblioteca de Classes do Framework .NET Conceitos Bsicos de Orientao a Objetos O que um Objeto? Mensagens Classes Herana Reutilizao de Cdigo Mais Alguns Detalhes Antes de Iniciarmos a Parte Prtica Concluso

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

Captulo 4: Classes, Mtodos, Herana e Polimorfismo com o C#


Introduo Operadores e Mais Operadores Built-in Operators Operadores Aritmticos Operador de Incremento: ++ Operador de Decremento Operadores Relacionais e Lgicos Operadores de Atribuio (Assignment) Precedncia de Operadores Classes Para Comear um Exemplo Simples Membros de uma Classe Campos (Fields) Mtodos (Methods) Propriedades (Properties) Constantes (Constants)

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

Captulo 5: Tpicos Diversos em C#


Introduo A Classe System.Math Operaes Matemticas Campos da Classe System.Math Mtodos da Classe System.Math A Estrutura System.DateTime Datas e Horas Campos da Estrutura System.DateTime Propriedades da Estrutura System.DateTime O Namespace System.IO Operaes com Arquivos e Pastas A Classe System.IO.File Operaes com Arquivos Mtodos da Classe System.IO.File A Classe System.IO.FileInfo Informaes Sobre Arquivos Propriedades da Classe System.IO.FileInfo O Tratamento de Excees Utilizando try e catch Utilizando try e finally Concluso

160
160 161 161 162 174 176 176 178 178 179 182 182 184 185 188 195

PARTE 2: Fundamentos do ASP.NET Captulo 6: Uma Introduo ao ASP.NET


Introduo Mais uma Verso? Uma Introduo Tecnologia ASP Contedo Dinmico na Internet Novidades e Melhorias do ASP.NET Faz Parte do Framework .NET Suporte a Mltiplas Linguagens Menos Cdigo Para Mais Trabalho Separao Entre o Cdigo HTML e o Cdigo ASP Maiores Facilidades Para Criao e Utilizao de Componentes Compatibilidade com Qualquer Navegador

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

Captulo 7: HTML Server Controls


Introduo Uma Classe Chamada Page Eventos ao Carregar uma Pgina ASP.NET A Classe Page Os Eventos da Classe Page As Propriedades da Classe Page Mtodos da Classe Page O Processamento de uma Pgina ASP.NET Manuteno de Estado Fundamental HTML Server Controls Uma Definio Para HTML Server Controls HTML Server Controls Disponveis A Classe Base System.Web.UI.HtmlControls.HtmlControl HTMLForm Control HTMLInputText Control HTMLInputCheckBox HtmlTextArea Control HTMLInputRadioButton Control Controles Para a Criao de Tabelas: HtmlTable, HtmlTableRow e HtmlTableCell Controls O Controle HtmlTable O Controle HtmlTableRow O Controle HtmlTableCell Um Exemplo Prtico HTMLSelect Control

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

Captulo 8: Validation Server Controls


Validation Controls: Definio e Propriedades Gerais Como que Utilizamos os Controles de Validao? A Me de Todos? Ou Seria o Pai de Todos? Principais Propriedades da Classe BaseValidator Principais Mtodos da Classe BaseValidator Um Exemplo, s Para Comear O Controle RequiredFieldValidator O Controle CompareValidator O Controle RangeValidator O Controle CustomValidator O Controle RegularExpressionValidator Concluso

279
280 281 282 282 282 283 287 293 297 300 305 308

Captulo 9: Web Form Controls


Introduo A Classe Bsica WebControl Principais Propriedades da Classe WebControl Principais Mtodos da Classe WebControl Principais Eventos da Classe WebControl TextBox Web Server Control Label Web Server Control CheckBox Web Server Control RadioButton Web Server Control Button Web Server Control ListBox Web Server Control Table, TableCell e TableRow Web Server Controls Panel Web Server Control Image Web Server Control HyperLink Web Server Control LinkButton Web Server Control ImageButton Web Server Control Concluso

309
309 310 310 311 312 312 318 320 324 326 329 331 337 343 345 347 350 353

XI

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Captulo 10:Acessando Bancos de Dados com ASP.NET Parte 1


Introduo Uma Viso Geral do Acesso a Dados Quais as Principais Diferenas do ADO.NET em Relao ao ADO? Bancos de Dados Utilizados nos Exemplos O Banco de Dados do Microsoft Access NorthWind.mdb O Banco de Dados do SQL Server Pubs Uma Introduo ao ADO.NET Informando que Voc Deseja Utilizar Classes de um Determinado Namespace Classe ou Objeto; Objeto ou Classe? Estabelecendo Conexes Estabelecendo uma Conexo com o SQL Server 2000 SqlConnection Estabelecendo uma Conexo com o Microsoft Access OleDbConnection Uma Viso Geral do Processo de Acesso a Dados Criando Objetos Command Retornando Dados com DataAdapter O Objeto DataSet O Objeto DataView Um Pouco Mais Sobre o Controle DataGrid Primeira Maravilha do DataGrid: Paginao Segunda Maravilha do DataGrid: Mais do que um Conjunto de Dados na Mesma Pgina Concluso

355
355 356 358 359 359 360 362 362 363 363 364 369 374 376 380 382 388 405 405 407 413

Captulo 11:Acessando Bancos de Dados com ASP.NET Parte 2


Introduo Um tal de Data Binding Maneira Antiga: Criando uma Lista Dinmica com ASP 3.0 A Evoluo: Data Binding com ASP.NET. Data Binding de Valores Simples Sintaxe Para o Data Binding Data Binding de Mltiplos Valores. repeated-value-binding O Controle CheckBoxList O Controle DropDownList O Controle RadioButtonList Mais um Pouco Sobre o Controle DataGrid Ordenao com o Controle DataGrid Filtrando Dados com o Controle DataGrid O Controle DataGrid em Detalhes Um Exemplo de Criao Manual de Colunas BoundColumn Implementando Paginao com o Controle DataGrid

414
414 415 415 418 422 422 425 425 434 435 440 440 446 456 460 465

www.juliobattisti.com.br

XII

SUMRIO Concluso 473

Captulo 12: Acessando Bancos de Dados com ASP.NET Parte 3


Introduo No Esquea, Estamos em um Modelo Desconectado O Objeto DataTable Alteraes nos Dados Desconectados Inserindo, Excluindo e Adicionando Dados com o Objeto DataTable Sincronizando Dados com o Banco de Dados Excluindo Registros a Propriedade DeleteCommand Adicionando Registros a Propriedade InsertCommand Concluso

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

Captulo 14: Segurana de Aplicaes Web com o IIS 5.0 e ASP.NET


Introduo Autenticao de Usurios com o IIS 5.0 Autenticao Annima Como Definir a Conta Para Acesso Annimo no IIS 5.0 Verificando as Configuraes da Conta Para Acesso Annimo no Windows 2000 Server Configurando Permisses NTFS em Pastas do Servidor Web

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

Captulo 15: Caixa de Ferramentas do ASP.NET


Introduo Criao de Listas Dinmicas Edio de Dados com o Controle DataGrid Acessando Dados de uma Planilha do Excel Um Conceito Importante: Code Behind O Objeto HttpRequest O Objeto HttpResponse Diretivas de Pgina A Diretiva @Page A Diretiva @Import Outras Diretivas Configuraes de Segurana Atravs de Programao Acessando Informaes Sobre o Usurio Autenticado Concluso

641
641 642 655 667 670 675 681 682 682 683 683 684 684 691

www.juliobattisti.com.br

XIV

SUMRIO

Captulo 16: Tratamento de Erros e Gerenciamento de Estado


Introduo Tratamento de Erros no Framework .NET Excees e a Classe Exception Revisando as Estruturas Try...Catch...Finally Utilizando try e catch Utilizando try e finally Mltiplos Blocos Catch e Tratamento de Excees Especficas Um Exemplo de Tratamento de Exceo do Tipo SqlException Concluso

693
693 694 694 696 696 700 703 704 709

ANEXO 1: Principais Tags do HTML e Criao de Contas e Grupos no Windows 2000


Introduo Um Passeio Pelo HTML Criao de Contas de Usurios e Grupos no Windows 2000 A Estrutura Bsica de uma Pgina HTML Relao das Principais Tags do HTML Utilizadas nos Exemplos do Livro As Tags Para Criao de Ttulos Tags Para a Criao de Tabelas Inserindo uma Linha Horizontal Tags Para Formatao Bsica do Texto Formatao de Fonte A Tag <A></A> O Conceito de Contas de Usurios no Windows 2000 Alterando Propriedades Importantes das Contas de Usurios Definindo as Polticas de Senhas Grupos de Usurios e Tipos de Grupos Existentes no Windows 2000 Server Criando Grupos de Usurios e Adicionando Usurios aos Grupos Introduo

710
710 710 712 712 713 713 714 717 717 719 720 722 727 734 737 740 745

Anexo 2: O Modelo de Dados Relacional


Conceitos Bsicos de Bancos de Dados Relacionais Entidades e Atributos O Conceito de Chave Primria Relacionamentos Entre Tabelas Relacionamento do Tipo Um Para Um Relacionamento do Tipo Um Para Vrios Relacionamento do Tipo Vrios Para Vrios Integridade Referencial Normalizao de Tabelas

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

ANEXO 3: A Linguagem SQL


Introduo Noes Bsicas da Linguagem SQL Structured Query Language Conhecendo o SQL A Instruo SELECT A Instruo UPDATE A Instruo INSERT A Instruo DELETE Comandos Avanados da Linguagem T-SQL Pesquisando Dados em Mltiplas Tabelas Detalhes e Exemplos Tipos de JOIN JOIN com Mais do que Duas Tabelas Utilizando Subconsultas Concluso

761
761 761 761 762 769 771 771 772 772 774 776 778 781

ANEXO 4: Sites Sobre ASP.NET, C# e XML


Introduo Concluso

782
782 785

www.juliobattisti.com.br

XVI

INTRODUO

Uma Nova Revoluo no Desenvolvimento de Software?


.NET, DOT.NET ou Microsoft.NET, no importa. O fato que uma grande mudana est acontecendo. Esta mudana tem dois aspectos extremamente relevantes:

INTRODUO

promovida pela Microsoft uma mudana de Paradigma

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


componentes e a substituio por outros, o que fez com que cdigos criados para a verso Beta 1 no fossem compatveis com a verso Beta 2. Durante este ano entre o lanamento da verso Beta 1 e da verso Beta 2 , proliferaram inmeros sites na Internet, com milhares de artigos sobre o .NET. Isso fez com que a iniciativa da Microsoft tivesse uma visibilidade e divulgao jamais alcanadas por outras empresas. Inmeros livros foram lanados baseados na verso Beta 1, o que indica o sucesso da iniciativa. Voc j viu algum livro de Excel, por exemplo, baseado em uma verso Beta 1 do Office? Nesta introduo veremos o que voc precisa para iniciar com os estudos de .NET. Iremos mostrar qual o equipamento mnimo de que voc dever dispor para poder instalar o Microsoft .NET Framework SDK e acompanhar os exemplos deste livro. Tambm iremos orient-lo sobre a obteno e instalao do Microsoft .NET Framework SDK.

Quem Deveria Ler Este Livro?


Mesmo que voc no conhea nada sobre .NET, C# ou ASP.NET, voc ser capaz de acompanhar todos os captulos deste livro. Os captulos foram organizados de tal maneira que os conceitos e exemplos so apresentados em uma ordem natural e intuitiva. Em outras palavras, procurei imaginar o que faria um leitor que nada conhecesse sobre .NET, C# e ASP.NET e quisesse iniciar os seus estudos. Com esta idia em mente, procurei organizar os captulos em uma seqncia que facilitasse o aprendizado de tais tecnologias. O conhecimento da tecnologia ASP pode facilitar e acelerar o aprendizado de alguns conceitos, porm no um pr-requisito obrigatrio. Ainda que o amigo leitor nada conhea sobre as verses anteriores do ASP, mesmo assim voc ser capaz de acompanhar todo o contedo deste livro. Para usurios que j trabalham com as verses anteriores do ASP, o livro oferece a

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.

Neste livro estarei utilizando as vrias denominaes, indiscriminadamente.

Equipamento e Software Necessrios


Para acompanhar todos os exemplos propostos no livro, precisamos de um computador com Windows 2000 Server ou Windows 2000 Professional instalado. O IIS 5.0 Internet Information Services tambm deve estar instalado. Mais adiante veremos como confirmar se o IIS est instalado e, caso o mesmo no esteja instalado, como proceder instalao do mesmo.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


entender um determinado assunto atravs da utilizao do mesmo para resoluo de um problema prtico do dia-adia. Muitos dos exemplos apresentados podem ser facilmente adaptados para uso em aplicaes que voc esteja desenvolvendo. Situaes como acesso a Banco de dados atravs de pginas Web, indexao e pesquisa de contedos, implementao de mecanismos de segurana, etc.; so comuns na maioria das aplicaes Web atuais. Agora vamos verificar se o IIS 5.0 est instalado e, caso o mesmo no esteja, aprenderemos a fazer a instalao.

Instalando e Testando o IIS 5.0


Caso voc no tenha instalado o IIS 5.0, quando da instalao do Windows 2000 Server ou Professional, possvel fazer a instalao a qualquer momento. Agora aprenderemos, passo a passo, a instalar o IIS 5.0. Nunca demais lembrar que, sem o IIS 5.0, no ser possvel testar os exemplos prticos, propostos neste livro. Para instalar o IIS 5.0: 1. 2. 3. 4. Faa o logon no Windows 2000 Server ou Professional. Abra o Painel de controle (Iniciar -> Configuraes -> Painel de controle). Abra a opo Adicionar ou remover programas. Surgir a janela indicada na Figura 1.

Figura 1: A janela Adicionar ou remover programas.


5. No lado esquerdo da janela, d um clique na opo Adicionar ou remover componentes do Windows.

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.

Figura 2: A janela para alterar a instalao do Windows.

Figura 3: O Assistente de componentes do Windows.

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


11. Se esta opo estiver marcada, o IIS 5.0 j est instalado. Neste caso clique no boto Cancelar. Depois s fechar a janela Adicionar ou remover programas e o Painel de controle. 12. Se esta opo estiver desmarcada, significa que o IIS 5.0 no foi instalado quando da instalao do Windows 2000. Marque esta opo para instalar o IIS 5.0. 13. Observe que, ao marcar a opo, o boto Detalhes habilitado. O IIS 5.0 formado por uma srie de componentes e funcionalidades. Existe um servidor de pginas Web (servidor HTTP), um servidor de ftp, um servidor de notcias (NNTP), etc.

Figura 4: Servio Internet Information Services (IIS).

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

Snap-In do Internet Information Services.

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.

Figura 5: Indicao do espao necessrio no disco rgido.


19. D um clique no boto Avanar para ir para a prxima etapa do assistente. 20. O Windows 2000 Server exibe uma janela indicando o progresso da Instalao. 21. Caso o Windows 2000 Server no encontre os arquivos necessrios instalao, no Disco rgido, voc ser solicitado a inserir o CD de instalao do Windows, conforme indicado pela Figura 6.

Figura 6: Mensagem solicitando o CD de instalao do Windows.


22. Insira o CD e d um clique em OK. O Windows 2000 inicia o processo de cpia dos arquivos. 23. Depois de concluda a cpia dos arquivos, o Assistente emite uma mensagem dizendo que o processo foi concludo com sucesso.

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


24. D um clique no boto Concluir, para encerrar o Assistente. 25. Voc estar de volta janela Adicionar ou remover programas. D um clique no boto Fechar para sair desta janela. 26. Voc estar de volta ao Painel de controle. Feche o Painel de controle. 27. Agora o IIS 5.0 est instalado e pronto para funcionar. Agora que j temos o IIS 5.0 instalado, vamos testar se o mesmo est funcionando corretamente. Para testar se o IIS 5.0 foi instalado com sucesso: 1. 2. 3. Abra o Internet Explorer. Digite o seguinte endereo: http://localhost. Deve surgir uma janela conforme indicado na Figura 7.

Figura 7: A pgina padro do IIS 5.0, logo aps a instalao.


4. 5. 6. Esta a pgina inicial padro, do IIS 5.0, logo aps a instalao. Isto comprova que o IIS 5.0 foi instalado com sucesso. Feche o Internet Explorer.

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.

Como Obter e Instalar o Microsoft .NET Framework SDK


Para que seja possvel a criao de pginas ASP.NET no IIS 5.0 precisamos instalar o Microsoft .NET Framework SDK. O mesmo pode ser obtido a partir do site da Microsoft, para Download, no seguinte endereo: http:// msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-f iles/027/000/976/ msdncompositedoc.xml&frame=true Neste endereo temos a opo de baixar um arquivo nico, com 126 MB ou dividir o download em diversas partes, conforme indicado na Figura 8.

Figura 8: Pgina para download do Microsoft .NET Framework SDK.

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Se voc optar pelo download do arquivo completo, aps concludo o download voc ter um arquivo chamado Setup.exe de 126 MB. Este o arquivo completo para a instalao do Framework .NET. Mais adiante veremos como proceder instalao deste arquivo. Para que o Microsoft .NET Framework SDK Beta 2 possa ser instalado com todas as suas funcionalidades, voc tambm precisa instalar MDAC Microsoft Data Access Components 2.7, Beta 2. Voc pode fazer o download desta verso do MDAC, no seguinte endereo: http://download.microsoft.com/download/platformsdk/MDAC2.7/1.0/ NT45XP/EN-US/MDAC_TYP_dnld.exe O arquivo MDAC_TYP_dnld.exe possui cerca de 5MB. Antes de instalar o Framework .NET vamos instalar o MDAC 2.7 Beta 2. Para instalar o MDAC 2.7 Beta 2 faa o seguinte: 1. 2. 3. 4. 5. 6. Localize o arquivo MDAC_TYP_dnld.exe que voc copiou anteriormente. D um clique duplo no mesmo para iniciar a instalao do MDAC 2.7. Surge uma tela com o contrato de licena de uso do MDAC 2.7. D um clique no boto Yes para aceitar o contrato. Surge uma tela perguntando em que pasta temporria voc deseja descompactar os arquivos. Digite C:\temp e d um clique no boto OK. Os arquivos necessrios sero descompactados na pasta C:\temp. V para a pasta C:\temp e execute o arquivo MDAC_TYP.EXE. Surge uma tela onde voc precisa marcar uma caixa de controle para concordar com o contrato de licena. Marque esta caixa de controle, conforme indicado na Figura 9 e d um clique no boto Avanar.

Figura 9: Contrato de licena para o MDAC 2.7.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Esta opo nos d acesso Documentao completa sobre a plataforma .NET. A verso sempre atualizada desta documentao pode ser encontrada no site MSDN da Microsoft, no seguinte endereo: http://msdn.microsoft.com/net

Figura 10: Andamento da instalao.

Configuraes do Servidor Utilizado Neste Livro


Para criar os exemplos deste livro, utilizei um servidor com as seguintes configuraes:

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

Uma Viso Geral do Contedo do Livro


O livro est dividido em trs partes, conforme descrito a seguir:

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

PARTE

1
O Framework .NET e a Linguagem C#

www.juliobattisti.com.br

14

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Veremos, de uma maneira genrica, o papel de cada um destes componentes no Framework .NET. Estaremos estudando, detalhadamente, cada um destes itens nos demais captulos deste livro. Apresentamos uma viso geral de cada um deles, para que o leitor j possa ter uma idia do Framewok .NET e de seus principais componentes, bem como da funo de cada um. Este captulo, embora bastante terico, forma a base para o entendimento dos conceitos apresentados ao longo de todo o livro. Por isso importante que voc entenda os conceitos apresentados. A documentao atualizada, sobre os conceitos apresentados, pode ser consultada no seguinte endereo: http://msdn.microsoft.com/net.

O Primeiro Contato com o Framework .NET


Definir exatamente o que o Framework .NET no uma tarefa das mais simples. Como no sou muito afeito a definies formais, vou mostrar qual a proposta do Framework .NET, quais os componentes e qual a funo de cada componente. Em primeiro lugar podemos afirmar que, com a iniciativa .NET, a Microsoft est mudando radicalmente o modelo de desenvolvimento e utilizao de software. No livro Introducing .NET, da editora Wrox (www.wrox.com), encontramos duas afirmaes interessantes sobre o Framework .NET:

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.

Apresentando o Conceito de Servios Web Services


Realmente a mudana bastante grande. Programadores, analistas e gerentes de projeto precisaro de muito estudo e tempo para absorver os conceitos desta nova plataforma. Tambm verdade que, desde a sua concepo, o .NET foi projetado para a Internet. Em muitas publicaes especializadas aparece a seguinte afirmao: A iniciativa .NET a viso da Microsoft de um mundo onde o Software se transforma em servios, na verdade pequenos componentes que podem ser utilizados por qualquer aplicao. Um software de uma empresa brasileira pode utilizar um servio que est residente em um servidor de uma empresa do Japo, desde que tenha permisses para isso. Este servio pode oferecer, por exemplo, a funcionalidade para validao de uma transao via carto de crdito. Um dispositivo mvel, como um celular WAP ou um Handled, pode utilzar um servio de cotao de aes de um servidor da bolsa de valores de Londres. E como todos estes componentes fazem para se comunicar? Evidentemente que atravs da Internet. Por isso a Internet como ponto principal do projeto .NET. Conforme veremos mais adiante, estes servios, que podem ser acessados via Internet ou atravs de qualquer Intranet, so chamados de Web Services.

www.juliobattisti.com.br

16

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET


Ao invs de programas monolticos, em que toda a funcionalidade necessria faz parte do prprio programa, construiremos programas como se fosse um jogo de montar. As diversas funcionalidades necessrias ao programa podem ser oferecidas atravs do acesso a servios j implementados. Na Figura 1.1 temos uma pequena ilustrao deste conceito. No site da empresa www.minhaempresa.com, criamos, por exemplo, uma pgina ASP.NET para venda de livros. O preo dos livros est em dlares e deve ser convertido para a moeda do pas do cliente, no momento da compra. No exemplo da Figura 1.1, a pgina ASP.NET utiliza um Web Service do servidor www.cotacoes.com, para obter a cotao atualizada do dlar em relao moeda do pas do cliente. A pgina ASP.NET recebe esta informao, faz os clculos necessrios e exibe para o cliente. O prximo passo efetivar a venda. Agora o cliente digita o nmero do seu carto de crdito. Para validar o nmero do carto de crdito do cliente, acessado um outro Web Service, o qual est instalado no servidor www.validacao.com.

Figura 1.1: Um programa que utiliza diversos servios.


Com esta arquitetura, a criao de software fica bastante simplificada, uma vez que podemos agregar ao nosso programa funcionalidades disponibilizadas atravs de Web Services que esto instalados em qualquer servidor da Internet. Desta maneira somente precisamos criar o que especfico do nosso programa. Com isso estamos reaproveitando cdigo ou como preferem os puristas: reutilizando cdigo. Como diferentes Web Services, criados por diferentes empresas, podero se comunicar e trocar informaes? Esta comunicao possvel, porque todo programa criado para a plataforma .NET utiliza um padro para troca de informaes. No caso temos dois padres:

17

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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.

Apresentando o CLR Common Language Runtime


O CLR um ambiente de execuo, e poderamos at dizer que o Corao do .NET, o qual d suporte a todas as linguagens de programao habilitadas para o .NET. Ao instalarmos o Microsoft .NET Framework SDK, temos disponveis as seguintes linguagens:

VB.NET (Visual Basic .NET) C# (leia-se C Sharp) ASP.NET Jscript.NET

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

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET

Figura 1.2: O ambiente de execuo do CLR.


A partir da Figura 1.2 temos algumas observaes importantes:

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.

.NET Framework Class Library


Este o segundo elemento fundamental do Framework .NET. A .NET Framework class library (biblioteca de classes do Framework .NET), como o prprio nome sugere, uma coleo de classes ou tipos completamente integrada com o ambiente de execuo CLR. Quando falamos em um conjunto de Classes, estamos utilizando o conceito originado no modelo de Programao Orientado a Objetos. Conforme veremos no decorrer deste livro, o Framework .NET fortemente baseado nos conceitos de orientao a objetos, principalmente nos conceitos de Classes, Herana e Polimorfismo.

19

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Os programas criados em qualquer linguagem habilitada ao .NET podem utilizar este conjunto de tipos e classes. Por exemplo, existe uma classe chamada System.Data, a qual oferece uma srie de objetos e mtodos para acesso s mais variadas fontes de dados. Vamos a um exemplo mais especfico: existe uma classe chamada System.SqlCliente (na verso Beta 1 existia uma classe chamada System.SQL, que foi descontinuada na verso Beta 2), a qual fornece uma srie de mtodos para acesso nativo aos dados de um servidor Microsoft SQL Server. Podemos utilizar a classe System.SqlCliente em um programa feito em VB.NET, C#, em uma pgina ASP.NET ou qualquer linguagem que venha a ser habilitada para o .NET. Ao fornecer um conjunto de classes e tipos, estamos facilitando a vida do programador, uma vez que grande parte da funcionalidade necessria fornecida diretamente pelo Framework .NET e, o principal, utilizada de uma maneira padronizada, pois a maneira de utilizar uma classe da biblioteca de classes do .NET a mesma, independente da linguagem. So muitas as funes disponibilizadas pela biblioteca de classes do .NET, conforme veremos no decorrer deste livro. Apenas a ttulo de exemplo, vamos citar algumas funes disponibilizadas:

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.

Figura 1.3: Principais elementos do Framework .NET.

www.juliobattisti.com.br

20

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET

Um Pequeno Parnteses Para falar mal dos Modelos Anteriores


Vamos falar um pouco sobre o modelo de desenvolvimento atual, mais especificamente sobre o modelo baseado em COM/COM+ da Microsoft. Para falar sobre este assunto vamos fazer um histrico sobre o desenvolvimento, desde os bons e velhos tempos do MS-DOS.

Ai que Saudade do MS-DOS???


No, no saudade da poca do MS-DOS, apenas uma breve recapitulao. Para desenvolver aplicaes para o ambiente MS-DOS, utilizamos diversas linguagens de programao, tais como:

Clipper Pascal Turbo Pascal Basic C Turbo C C++

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Prazer. Eu Sou o Windows!


Com a chegada do Windows tivemos a popularizao das interfaces grficas e de termos como: mouse, cone, atalho e janelas. As ferramentas para desenvolvimento no ambiente Windows custaram a chegar. No incio, a programao tinha que ser feita em linguagem C, utilizando as APIs (Application Program Interface) do Windows. Com o lanamento do Visual Basic 1.0 teve incio a era das ferramentas grficas para desenvolvimento de programas para o Ambiente Windows. Com o Windows j passou a existir o conceito de Instalar o programa. A instalao do programa no se limitava a uma simples cpia de arquivos. Ao instalar um programa no Windows, o mesmo gravava uma srie de informaes de configurao: no Windows 3.x em arquivos .ini e no Windows 9x na Registry do Sistema Operacional. Alm destas informaes de configurao, partes do programa eram disponibilizadas no formato de arquivos .DLL (Dynamic Link Library). Falando assim parecia um modelo, digamos, bastante elegante. Um local centralizado para informaes sobre configurao e o programa dividido em partes menores, que no conjunto forneciam a funcionalidade do programa. Porm o modelo de programao para o Windows comeou a apresentar uma srie de inconvenientes. Vamos falar destes inconvenientes, atravs de exemplos:

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

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET

Redes e Internet Mais Problemas (ou Solues) Vista!


Com o advento das redes como uma realidade nas empresas e com a exploso da Internet como uma plataforma vivel para fazer negcios, os modelos de desenvolvimento de aplicaes sofreram profundas mudanas. Primeiro, com as redes, foi a poca da febre em descentralizar as estruturas de TI e migrar para o modelo Cliente/ Servidor, baseado em redes locais. Neste modelo, tambm conhecido como modelo de duas camadas, temos um ou mais equipamentos de maior capacidade de processamento, atuando como Servidores. Nas estaes de trabalho dos usurios, conhecidas como clientes, so instalados programas, que fazem acesso a recursos residentes nos servidores. O exemplo mais tpico de aplicao Cliente/Servidor seria uma aplicao desenvolvida em Visual Basic ou Delphi, a qual acessa dados de um servidor SQL Server 2000, instalado em um servidor da rede. Na Figura 1.4, temos uma viso geral do modelo Cliente/Servidor. Vamos falar um pouco mais sobre o modelo de duas camadas.

Figura 1.4: O modelo Cliente/Servidor.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 1.5: O Modelo de desenvolvimento em duas camadas.


Sendo a aplicao cliente um programa para Windows (na grande maioria dos casos), a mesma deve ser instalada em cada uma das estaes de trabalho da rede. o processo de instalao normal, para qualquer aplicao Windows. No modelo de 2 camadas, a aplicao Cliente responsvel pelas seguintes funes:

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

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET


gerar a necessidade de atualizar a aplicao, em centenas ou milhares de computadores. O que j era complicado piorou um pouco mais. Com a evoluo do mercado e as alteraes da legislao, mudanas nas regras do negcio so bastante freqentes. Com isso, o modelo de duas camadas demonstrou-se de difcil manuteno e gerenciamento, alm de apresentar um TCO Total Cost Ownership (Custo Total de Propriedade) bastante elevado. A outra camada, no modelo de 2 camadas, o Banco de dados, o qual fica armazenado no Servidor de banco de dados. Sempre que um determinado modelo apresenta problemas, aparentemente intransponveis, a indstria de informtica parte para a criao de novos modelos. Em busca de solues para os problemas do modelo de duas camadas que surgiu a proposta do modelo de 3 camadas, conforme analisaremos a seguir.

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:

Figura 1.6: O modelo de desenvolvimento em trs camadas.


Todo o acesso do cliente, aos dados do servidor de Banco de dados, feito de acordo com as regras contidas no Servidor de Aplicaes. O cliente no tem acesso aos dados do servidor de Banco de dados, sem antes passar pelo servidor de aplicaes. Com isso, as trs camadas so as seguintes:

25

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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.

Aplicaes em Quatro Camadas


Como uma evoluo do modelo de trs camadas, surge o modelo de quatro camadas. A idia bsica do modelo de 4 camadas retirar a apresentao do cliente e centraliz-la em um determinado ponto, o qual na maioria dos casos um servidor Web. Com isso o prprio Cliente deixa de existir como um programa que precisa ser instalado em cada computador da rede. O acesso aplicao, feito atravs de um Navegador, como, por exemplo, o Internet Explorer ou o Netscape Navigator. A Figura 1.7 nos d uma viso geral do modelo em quatro camadas. Para acessar a aplicao, o cliente acessa o endereo da aplicao, utilizando o seu navegador, como no exemplo: http://intranet.minhaempresa.com/sistemas/vendas.aspx. Todo o acesso do cliente ao Banco de dados feito de acordo com as regras contidas no Servidor de aplicaes. O cliente no tem acesso ao Banco de dados, sem antes passar pelo Servidor de aplicaes. Com isso temos as seguintes 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

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET


todos os computadores da rede. Fica muito mais fcil garantir que todos esto tendo acesso verso mais atualizada da aplicao. A nica coisa que o cliente precisa ter instalado na sua mquina o navegador.

Figura 1.7: O modelo de desenvolvimento em quatro camadas.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


componentes em diversos equipamentos conhecido como Modelo de Aplicaes Distribudas. Tambm podemos colocar os componentes em mais do que um servidor para obtermos um melhor desempenho, ou redundncia, no caso de um servidor falhar.

Questes a Considerarmos nos Modelos de 3 ou Mais Camadas Utilizados Atualmente


Muitas so as vantagens dos modelos de 3 ou mais camadas, em relao facilidade de gerenciamento e atualizao das aplicaes. Mas, se tudo funciona to bem, por que precisamos de um novo modelo de programao leia-se Framework .NET? Para responder a pergunta anterior, vamos continuar colocando alguns problemas com o modelo de desenvolvimento em uso atualmente, que o modelo de n-camadas, com aplicaes que utilizam componentes distribudos atravs de diversos servidores: Servidor Web, de aplicaes, de Banco de dados, etc. O modelo de programao atual, para o ambiente Windows, fortemente baseado no conceito de componentes. No exemplo do modelo de 4 camadas, quando uma aplicao cliente acessa uma regra de negcio, esta regra de negcio implementada na forma de um componente COM/COM+. A regra de negcio pode utilizar um outro componente para fazer a conexo com o Banco de dados e retornar os dados solicitados pela aplicao. Para que os diversos componentes possam comunicar-se e trocar informaes, os mesmos precisam de um padro para a troca de mensagens. O padro determina a estrutura interna do componente e a maneira como cada componente expe suas funcionalidades. O padro para o ambiente Windows chamado, a partir do Windows 2000, de COM+. Para o Windows NT 4.0 e verses anteriores, tnhamos o COM/DCOM trabalhando em conjunto com o MTS Microsoft Transaction Server. Mas se existe um padro para troca de mensagens qual o problema? Acontece que a implementao de componentes utilizando COM/COM+ no das tarefas mais simples. Se utilizarmos linguagens como o Visual C++, a criao e disponibilizao de componentes uma tarefa que exige programadores altamente especializados. J com ferramentas como o Visual Basic e Delphi, a criao de componentes para o padro COM+ um pouco mais fcil. Porm a grande dificuldade fazer com que componentes implementados em diferentes linguagens sejam capazes de trabalhar em conjunto e trocar mensagens entre si. Agora imagine as dificuldades em um ambiente em que devemos criar aplicaes para a Internet, onde deve existir uma maneira padronizada para que os diversos componentes sejam capazes de se comunicar. A Microsoft, com a sua iniciativa DNA, procurou disponibilizar informaes para que seja possvel tirar o mximo do modelo COM+, na criao de aplicaes em n-camadas para a Internet. Porm a prpria Microsoft reconheceu as limitaes e dificuldades deste modelo, ao propor uma nova revoluo nos mtodos e prticas de desenvolvimento, revoluo essa que atende pelo singelo nome de .NET. Outro fator importante a considerar que o padro COM/COM+ um padro proprietrio, desenvolvido pela Microsoft. Como fazer com que um padro proprietrio possa ser utilizado, sem maiores problemas para aplicaes distribudas na Internet? Fica muito difcil, para no dizer impraticvel. J com o .NET, conforme comentamos anteriormente, utiliza-se padres no proprietrios, como XML para os dados e SOAP sobre HTTP como protocolo de transporte. Desta forma, a comunicao entre Web Services acontece de uma maneira fcil, sem maiores problemas.

www.juliobattisti.com.br

28

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET


Para que um componente COM/COM+ possa ser utilizado, o mesmo precisa ser registrado no servidor que ir disponibilizar o componente para isso. Ao registrar o componente, so gravadas informaes sobre o mesmo, na registry do Sistema Operacional. O programador precisa preocupar-se em garantir que o componente seja registrado corretamente, pois, caso contrrio, o mesmo no poder ser acessado. J os servios do .NET no necessitam de registro, sendo que toda a informao necessria para que os mesmos funcionem est contida no prprio servio, no formato de metadados Metadata. Mais adiante falaremos um pouco mais sobre Metadata. Com componentes COM/COM+, o programador precisa preocupar-se em carregar o componente na memria, retirar o componente da memria quando o mesmo no for mais utilizado e uma srie de outras funes necessrias ao funcionamento do componente. Com o .NET, todas estas preocupaes foram transferidas para o Framework .NET. Isto faz com que o programador somente tenha que codificar a funcionalidade do servio que est sendo desenvolvido, a parte mais, digamos assim, chata, ser de responsabilidade do Framework .NET, mais especificamente do CLR. Isso aumenta a produtividade do programador e evita erros mais graves, os quais normalmente fazem com que o componente no funcione corretamente. J apresentamos os principais problemas do modelo atual; no restante deste captulo veremos os demais elementos que compem o Framework .NET e como cada um destes elementos procura solucionar problemas que os modelos anteriores no foram capazes de resolver.

De Volta ao Framework .NET: os Demais Elementos


Agora vamos falar um pouco mais sobre os diversos aspectos do Framework .NET e como cada um destes aspectos se prope a solucionar problemas do modelo atual de desenvolvimento.

Linguagens Habilitadas ao .NET


O que significa uma linguagem ser habilitada ao .NET? Significa que a linguagem capaz de gerar, como resultado da compilao, cdigo MSIL. Uma vez gerado o cdigo MSIL, o mesmo executado sob o controle do CLR. Ou seja, para o Framework .NET, uma vez gerado o cdigo MSIL, no importa a partir de qual linguagem o mesmo foi gerado, pois a maneira como o mesmo executado sempre a mesma. Juntamente com o Framework .NET, a Microsoft disponibiliza as seguintes linguagens:

Visual Basic .NET (VB.NET) C++ C#

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


a opo de compilar um programa Delphi para gerar cdigo MSIL. Uma vez gerado o cdigo MSIL, para o CLR no importa em qual linguagem o programa foi codificado. Mais adiante, nos captulos 3, 4 e 5 estaremos apresentando uma introduo aos principais elementos da linguagem C#. Nos captulos restantes do livro, estaremos utilizando a linguagem C# para a criao de pginas ASP.NET.

Um Rpida Apresentao do VB.NET


Com exceo do C# que uma nova linguagem, o VB.NET a linguagem que mais sofreu modificaes em relao s verses anteriores. Foram introduzidas algumas caractersticas h muito tempo esperadas, tais como:

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 Rpida Apresentao do C#


O C# a nova linguagem da Microsoft, apresentada juntamente com o Framework .NET. O C# foi construdo com base nos conceitos de Orientao a objetos. As diretivas bsicas para a criao do C# foram as seguintes:

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

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET


Como no poderia deixar de ser, vamos dar o tradicional exemplo do Hello World !!!, utilizando o C#. Apresentarei o cdigo e os passos para compilar e rodar o nosso primeiro programa em C#. Nos demais captulos deste livro aprenderemos mais sobre esta linguagem. Para criar o nosso primeiro programa, utilizaremos o Bloco de Notas do Windows . Abra o Bloco de Notas e digite o texto indicado na Listagem 1.1.

Listagem 1.1 Hello World !


using System; class primeiroprograma { // Meu primeiro programa em C# // O tradicional Hello World !!

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 1.8: Compilando o primeiro programa em C#.

Figura 1.9: Executando o primeiro programa em C#.

Common Type System


O Framework .NET disponibiliza, na forma de objetos, um conjunto de tipos de dados comuns, os quais podem ser utilizados por todas as linguagens habilitadas ao .NET. Isso significa que uma varivel do tipo Long ter a mesma estrutura e ocupar o mesmo nmero de bytes, quer seja no VB.NET, no C#, no C++ ou em qualquer outra linguagem habilitada ao .NET. Este conjunto de tipos comuns, que pode ser utilizado por qualquer linguagem, chamado de Common Type System, que a partir de agora abreviaremos por CTS. Dentre outras coisas, o CTS que facilita a integrao entre os programas e servios criados, utilizando-se de diferentes linguagens do .NET. No modelo antigo, uma das dificuldades de fazer com que um Componente COM+ criado com o Visual C++ pudesse ser utilizado por um programa escrito em Visual Basic que as linguagens possuam um diferente conjunto de tipos bsicos. Para que os componentes, escritos em diferentes linguagens, pudessem se comunicar,

www.juliobattisti.com.br

32

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET


o programador tinha que mapear os tipos de uma linguagem, para os tipos correspondentes em outra linguagem, fazendo as converses necessrias. Vejam o quanto este procedimento trabalhoso. Com o CTS do .NET simplesmente esta preocupao no existe, uma vez que todas as linguagens tm acesso a um conjunto de tipos comum a todas elas. Conforme descrito na documentao do Framework .NET, so as seguintes as principais funes do CTS:

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:

Nome e verso do componente.

33

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


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

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET


Para resolver o problema de verses e evitar o inferno das DLLs, o CLR utiliza assemblies da seguinte maneira:

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.

Um assembly composto de dois elementos bsicos:


Manifesto. Um conjunto de mdulos.

Interfaces com o Usurio


No Framework .NET a nomenclatura utilizada para representar os elementos que

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.

Em termos de interface com o usurio, temos dois elementos a considerar:


Windows Forms Web Forms

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Um Win Form, como tudo no Framework .NET, um objeto, o qual obtido a partir da instanciao de uma classe bsica. Todos os formulrios no Framework .NET so baseados em uma das seguintes classes:

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.

Figura 1.10: Uma aplicao Win32 com o Framework .NET.

www.juliobattisti.com.br

36

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET


Com o uso de Web Forms, uma pgina ASP.NET dividida em dois componentes bsicos:

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 1.11: Uma aplicao Web com ASP.NET e Web Forms.


de utilizar a tecnologia de Cluster e Balanceamento de Cargas do Windows 2000. Outras diretivas bsicas para estes servidores so as seguintes:

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.

Facilidade de gerenciamento: Dentro da filosofia da Microsoft de construir interfaces

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

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET


Application Center 2000 Host Integration Server 2000 Internet Security and Acceleration Server 2000 Mobile Information 2001 Server

SQL Server 2000


O SQL Server 2000 o servidor de banco de dados relacionais da Microsoft. Oferece funcionalidades avanadas como replicao, stored procedures, acesso a diferentes fontes de dados, mltiplas instncias em um nico servidor, mecanismo de segurana refinado e integrado com o Windows 2000, transaes distribudas, etc. Podemos acessar os dados de um servidor SQL Server 2000, no formato XML, utilizando um navegador, atravs do protocolo HTTP. Para maiores informaes sobre o SQL Server 2000, consulte as seguintes fontes:

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).

Exchange Server 2000


um servidor de mensagens e correio eletrnico, alm de uma plataforma para desenvolvimento de aplicaes do Workflow. Cada vez mais o Exchange vem ganhando mercado de concorrentes como o Lotus Notes da IBM e o Novel Groupwise da Novel. O Exchange 2000 completamente integrado com o Active Directory do 2000, o que facilita a criao e manuteno de contas de usurios. O suporte ao XML tambm foi introduzido nesta verso do Exchange. Maiores informaes sobre Exchange podem ser encontradas nos seguintes endereos:

http://www.microsoft.com/exchange http://www.swynk.com

BizTalk Server 2000


Com a consolidao do comrcio eletrnico, principalmente do chamado B2B Business to Business, que o comrcio entre empresas, cada vez faz-se mais necessria a integrao entre sistemas de informao de diferentes empresas. Um dos maiores problemas que estes diferentes sistemas de informao utilizam diferentes formatos de dados. Durante muito tempo, uma das solues adotadas foi o EDI Exchange Data Interchange. Porm o EDI apresenta algumas limitaes, alm de um custo elevado. Com o advento da Internet e do padro XML, a troca de informaes entre empresas tem migrado para solues onde o XML o formato universalmente aceito, o que facilita a troca de informaes. O Biztalk Server 2000 a soluo da Microsoft que facilita a criao, desde o modelo conceitual at a implementao, de aplicaes baseadas em XML, para troca de informaes entre diferentes empresas. Maiores informaes e uma verso de avaliao para download podem ser encontradas no seguinte endereo: http:// www.microsoft.com/biztalk

39

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Commerce Server 2000


O Commerce Server trabalha em conjunto com o IIS. Na verdade o Commerce Server facilita a criao de um site para comrcio eletrnico, quer seja B2C Business to Consumer, quer seja B2B Business to Business. Atravs de uma srie de modelos prontos e atravs da utilizao de assistentes, podemos rapidamente criar um site para comrcio eletrnico. Aps a criao, possvel personalizar o site de acordo com as necessidades da empresa. Pode trabalhar integrado com os demais servidores .NET. Por exemplo, pode utilizar o SQL Server 2000 para armazenar informaes sobre o catlogo de produtos, preos e estoque Maiores informaes e uma verso de avaliao para download podem ser encontradas no seguinte endereo: http://www.microsoft.com/commerceserver

Application Center 2000


O Application Center 2000 a ferramenta da Microsoft para a implementao e gerenciamento de Web sites que devero suportar uma elevada carga de acesso, com um grande nmero de acessos simultneos. Tambm oferece ferramentas para a distribuio de um site entre diversos servidores, com o objetivo de distribuir a carga entre diversos equipamentos. Com o uso do Application Center fica mais fcil realizar tarefas como por exemplo manter sincronizado o contedo dos diversos servidores, bem como fazer o gerenciamento e a distribuio de cargas.

Host Integration Server 2000


Esta a nova verso do antigo SNA Server da Microsoft, s que com o nome alterado. O Host Integration Server possibilita a integrao de redes Windows com outros ambientes, como por exemplo, Mainframes baseados na arquitetura SNA da IBM. Maiores informaes e uma verso de avaliao para download podem ser encontradas no seguinte endereo: http://www.microsoft.com/hiserver

Internet Security and Acceleration Server 2000


De certa maneira o successor do Proxy Server 2.0 da Microsoft, com algumas melhorias. utilizado para conectar a rede local da empresa, de uma maneira segura, Internet. Suas funes bsicas so as seguintes:

Firewall Cache de pginas

Maiores informaes e uma verso de avaliao para download podem ser encontradas no seguinte endereo: http:// www.microsoft.com/isaserver

Mobile Information 2001 Server


O Framework .NET no foi concebido apenas para o desenvolvimento de aplicaes que sero acessadas atravs de PCs ligados em rede ou computadores tradicionais. Com o Framework .NET, a Microsoft pretende fornecer uma slida plataforma de desenvolvimento, tambm para os diversos dispositivos mveis existentes, tais como telefones celulares, assistentes pessoais, Palm Pilots, etc. Dentro desta estratgia, o Mobile Information 2001 Server desempenha um papel fundamental, fornecendo suporte ao protocolo WAP 1.1. Usando o Mobile Information 2001 Server ser

www.juliobattisti.com.br

40

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET


possvel, por exemplo, fazer com que as suas mensagens do Exchange sejam convertidas para o formato em que possam ser lidas por um celular ou qualquer outro dispositivo habilitado ao WAP. Maiores informaes e uma verso de avaliao para download podem ser encontradas no seguinte endereo: http:// www.microsoft.com/servers/miserver/default.htm

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

Figura 1.12: Acessando dados com ASP 3.0.


Activex Data Objects para o Framework .NET (ADO.NET) um conjunto de classes que expem servios para acesso a diversas fontes e formatos de dados, para os programadores, utilizando qualquer linguagem habilitada ao .NET. Cabe ressaltar que ADO.NET no um substituto para o ADO, pois as duas verses de componentes para acesso a dados podem continuar existindo em um mesmo servidor Web, por exemplo. Ao instalarmos o Framework .NET, o mesmo instala, alm do suporte a pginas ASP.NET, todo o conjunto de classes do Framework .NET. Porm o acesso a pginas ASP tradicionais continua disponvel, o que significa que, mesmo aps instalar o Framework .NET, todas as aplicaes criadas com ASP 3.0 ou verses anteriores do ASP continuaro funcionando sem problemas, at que voc possa migr-las para ASP.NET. Ento em um mesmo servidor Web podemos ter uma pgina ASP, que acessa dados de

41

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


um arquivo .mdb do Access utilizando ADO, convivendo com um aplicativo criado com ASP.NET, o qual acessa informaes de uma caixa de correio do Exchange, utilizando ADO.NET. ADO.NET foi projetado pensando nos desafios de criar programas baseados no modelo de 3 camadas, para a Internet, os quais precisam acessar dados de diferentes fontes. Alm disso, as aplicaes Internet atuais esto bem mais sofisticadas, onde necessrio manter o conceito de estado, o que difcil em um mundo como o da Internet, conhecido como Connection Less. Na Internet o usurio faz a conexo com o servidor, requisita a pgina, recebe o resultado e desfaz a conexo. Para manter o estado entre uma conexo e outra, no ASP 3.0, utilizvamos os objetos Session e Application. Conforme veremos nos exemplos prticos, a partir do Captulo 6, manter o estado ficou muito mais simples com ASP.NET e ADO.NET. Outro fator importante a ser considerado que, cada vez mais, as aplicaes esto utilizando dados no padro XML. ADO.NET fornece meios de utilizar dados no padro XML. Conforme veremos, os objetos e mtodos de ADO.NET so bastante diferentes dos utilizados com ADO. Um dos primeiros objetos de que sentiremos falta o tradicional Recordset. Na Figura 1.13 temos uma viso geral da arquitetura do ADO.NET.

Figura 1.13: Uma viso geral da arquitetura do ADO.NET.


Observe que no temos o tradicional objeto Recordset.

NOTA: Esta figura foi retirada da documentao do Framework .NET.

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

CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


com os componentes COM/COM+. Alm disso os metadados que possibilitam que diferentes verses de um componente coexistam em um computador, podendo inclusive as diferentes verses serem executadas simultaneamente. Vimos que a unidade bsica de empacotamento chamada de assembly. Um assembly contm todos os elementos necessrios ao funcionamento de um componente. Falaremos mais sobre assemblies no prximo captulo. Seguindo, passamos a tratar das interfaces com o usurio, onde vimos os conceitos de Windows Forms e Web Forms, onde foram apresentados diagramas ilustrativos da utilizao destes elementos. Voltaremos ao assunto Web Forms nos demais captulos deste livro. Tambm no poderamos deixar de fora uma breve apresentao dos servidores .NET. Uma linha de servidores da Microsoft, para facilitar o desenvolvimento de aplicaes .NET, os quais fornecem uma srie de funcionalidades, desde um servidor de Banco de Dados Relacionais (SQL Server 2000), at um servidor para garantir a segurana na Internet Internet Security and Acceleration Server 2000. Para encerrar fizemos uma breve apresentao do ADO.NET. Voltaremos a tratar de ADO.NET, principalmente nos captulos que tratam de conexo de pginas ASP.NET com Bancos de dados e outras fontes de dados.

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

CAPTULO 2: ENTENDENDO O CLR

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Polimorfismo e funes virtuais Encapsulamento e visibilidade Todo o Framework .NET foi criado com base nos conceitos de Orientao a Objetos. A linguagem C# totalmente orientada a objetos, onde tudo so classes. Claro que alguns puristas poderiam dizer que o C# no completamente orientado a objetos porque no suporta herana mltipla. Na verdade veremos que o C# foi projetado para conciliar os benefcios da orientao a objetos e ao mesmo tempo ser simples e prtico. Para isso foram eliminadas algumas caractersticas da orientao a objetos, caractersticas estas que mais causavam problemas do que propriamente forneciam solues.

CLR Common Language Runtime


No Captulo 1 falamos rapidamente sobre o CLR. Agora chegou o momento de apresentarmos mais alguns detalhes sobre este, que, com certeza, o principal elemento do Framework .NET. O CLR o ambiente de execuo do Framework .NET. O CLR gerencia a execuo de qualquer aplicativo .NET, alm de fornecer uma srie de servios que facilitam e agilizam o desenvolvimento de aplicaes. Conforme discutido no Captulo 1, o maior benefcio do CLR que o mesmo fornece uma srie de servios e funcionalidades que nos modelos de desenvolvimento anteriores ao .NET tinham que ser codificados na prpria aplicao. Ao fornecer este conjunto de servios e funcionalidades, estamos evitando que o programador tenha que se preocupar como a maneira com a aplicao vai ser executada, com a alocao de memria, com liberao de memria e tantos outros aspectos que dificultavam o desenvolvimento de aplicaes. Com o suporte fornecido pelo CLR, o programador somente precisa se preocupar com a lgica da sua aplicao e no com a infraestrutura necessria para a mesma funcionar. O Cdigo que executado sob o controle do CLR chamado de Managed Code; vamos arriscar uma traduo: Cdigo Gerenciado. Este gerenciado significa: Sob o controle do CLR. Em contrapartida cdigo que no for executado sob o controle do CLR, no caso de programas no .NET, chamado de non Managed Code, que traduziremos por Cdigo no gerenciado. Os programas criados com linguagens habilitadas ao .NET e, portanto, executados sob o comando do CLR, podem se beneficiar das seguintes vantagens: Fcil integrao e interoperabilidade entre programas criados em diferentes linguagens. Fcil implementao e controle da segurana da aplicao. Utilizar a biblioteca de classes do Framework .NET. Melhor gerenciamento das diferentes verses de um mesmo componente, inclusive com a possibilidade de execuo simultnea de diferentes verses do mesmo componente, o que conhecido por: Syde-by-syde execution. Gerenciamento automtico da alocao e liberao da memria.

www.juliobattisti.com.br

46

CAPTULO 2: ENTENDENDO O CLR

Compilar ou no Compilar, eis a Questo?


Outro ponto importante a esclarecer se os programas .NET so compilados ou interpretados. Confesso que, na opinio deste autor, pouca importncia tem se compilado ou interpretado, desde que o desempenho final seja satisfatrio. Mas como todo programador que se preza um pouco teimoso, e apaixonado por uma discusso acalorada, vamos esclarecer este assunto antes que os nimos se exaltem. Ao criarmos um programa, utilizando uma linguagem habilitada ao .NET, como por exemplo o VB.NET ou o C#, o cdigo-fonte do programa, ao ser compilado, gera cdigo MSIL Microsoft Intermediate Language. Senhores! Com calma. Ainda no hora de comear a malhar o .NET. O CLR, que ser responsvel pela execuo e controle do cdigo MSIL gerado, COMPILA o cdigo MSIL para cdigo nativo. Com isso, o cdigo que executado pelo CLR cdigo nativo da plataforma onde est instalado o Framework .NET. At o momento, a nica plataforma compatvel a dobradinha Windows/Intel. Porm a Microsoft est tornando disponvel, publicamente, as especificaes para CLR e MSIL, o que possibilita que outras empresas desenvolvam um Framework .NET para outras plataformas, como, por exemplo, o UNIX. Nos veremos mais adiante, que mesmo uma pgina ASP.NET compilada no servidor Web, antes de ser enviada para o Navegador do cliente. Em resumo, todo e qualquer cdigo executado pelo CLR, cdigo compilado nativo. Agora sim. Fiquem vontade para discutir, dizer que no bem assim, que esse tal de MSIL no tem nada a ver, mais um chope e assim por diante.

O Papel dos Metadados (Metadata)


Para que o CLR possa fornecer uma srie de servios ao managed code, os compiladores das linguagens habilitadas ao .NET devem ser capazes de criar metadados. Os metadados contm informaes sobre os tipos, membros e referncias contidas no cdigo do programa. Os metadados so gravados com o prprio cdigo do programa. Desta maneira toda a informao necessria para que o programa funcione est contida no seu prprio cdigo, o que faz com que no seja necessrio o registro do mesmo, diferente do que acontecia com os componentes COM/COM+. O CLR utiliza metadados para localizar e carregar programas ou componentes, organizar as vrias instncias de um mesmo componente na memria, resolver a chamada de mtodos, gerar cdigo nativo, garantir a segurana de acesso e definir os limites para o contexto de execuo de um componente ou programa. O CLR automaticamente gerencia a alocao de objetos na memria, bem como as referncias aos objetos. Quando no houver mais nenhuma referncia ao objeto, o que significa que o mesmo no est mais sendo utilizado, o CLR automaticamente remove o objeto, liberando mais memria para o sistema. Com isso, os tradicionais problemas de memory leaks programas que alocam recursos de memria e no liberam, fazendo com que a quantidade de memria disponvel fique reduzida, at o ponto de fazer com que o prprio sistema operacional fique instvel e a mquina tenha que ser reinicializada deixam de existir. Vejam o quanto fica simplificada a tarefa de desenvolvimento, uma vez que o programador no precisa preocupar-se com alocao e liberao de memria, apenas com a lgica do seu programa.

Integrao Entre Diferentes Linguagens: Promessa ou Realidade?


Com o CLR fica fcil a criao de componentes e aplicaes nas quais os objetos sejam capazes de interagir, mesmo que codificados em diferentes linguagens. Por exemplo, podemos criar uma Classe chamada Clientes, em VB.NET.

47

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Podemos criar uma classe Clientes Especiais, em C#, herdada da classe Clientes. Com isso, a nossa classe Clientes Especiais ir herdar todas as propriedades e mtodos da classe Clientes. Essa integrao entre diferentes linguagens possvel, pois todas as linguagens habilitadas ao .NET tm acesso a um sistema de tipos comuns CTS Common Type System. Falaremos um pouco mais sobre o CTS mais adiante, neste captulo. Alm disso cada componente ou aplicativo possui informaes, na forma de metadados, sobre a sua estrutura, sobre os mtodos e propriedades que o mesmo possui e que podem ser acessados por outros componentes.

NOTA: No final do captulo apresentaremos os principais conceitos de orientao a objetos, como por exemplo: classes e herana.

O Processo de Execuo de Cdigo do CLR


Vamos ver quais os passos envolvidos, desde a criao de uma aplicao utilizando uma das linguagens habilitadas ao .NET, at a execuo da mesma, sob o controle do CLR. Os passos para a criao e execuo de uma aplicao .NET podem ser resumidos da seguinte maneira: Cria a aplicao ou componente utilizando uma linguagem habilitada ao .NET (VB.NET, C#, etc). Compila o cdigo da sua aplicao ou componente para gerar cdigo MSIL. O compilador da linguagem que voc est utilizando compila o seu cdigo-fonte para MSIL e acrescenta os meta dados necessrios. Em tempo de execuo, um compilador JIT (Just In Time) do CLR transforma o cdigo MSIL em cdigo nativo, COMPILADO. O cdigo nativo executado, utilizando toda a infraestrutura disponibilizada pelo CLR. Na Figura 2.1, temos uma ilustrao destes passos. Conforme ilustrado na Figura 2.1, quando compilamos o cdigo-fonte criado por uma linguagem habilitada ao .NET, estamos gerando MSIL, a qual um conjunto de instrues, independente da CPU, conjunto este que pode ser convertido (pelo JIT) para cdigo nativo. O cdigo MSIL inclui instrues para carregar, armazenar, inicializar e chamar mtodos, instrues para operaes aritmticas e lgicas, controle de fluxo do programa, acesso direto a memria, tratamento de excees e demais operaes necessrias execuo do programa. Antes que o cdigo MSIL possa ser executado, o mesmo precisa ser convertido para cdigo especfico da CPU em questo. Isto feito pelo JIT Just in time compiler. O CLR disponibiliza compiladores JIT para cada arquitetura suportada pelo CLR; desta maneira o mesmo conjunto de instrues MSIL pode ser compilado e executado em qualquer arquitetura para a qual exista um compilador JIT. Esta a estratgia da Microsoft para fazer com que o cdigo MSIL de aplicaes .NET possa ser executado em diferentes plataformas, desde servidores Windows ou no Windows, at dispositivos mveis para os quais esteja disponvel um compilador JIT. claro que a implementao em outras plataformas que no o Windows, como por exemplo o UNIX, depender da implementao de terceiros. Por exemplo, a HP pode querer implementar um compilador

www.juliobattisti.com.br

48

CAPTULO 2: ENTENDENDO O CLR


JIT que rode no HP-UX, fazendo com que aplicaes .NET possam rodar nesta plataforma. Se surgiro implementaes para outras plataformas uma questo que somente o tempo e o mercado diro.

Figura 2.1: O processo de execuo de cdigo do CLR.


Quando o compilador de uma linguagem habilitada ao .NET produz o cdigo MSIL, o mesmo tambm cria os metadados necessrios. O cdigo MSIL e os metadados esto contidos em um arquivo PE portable executable. O portable significa que este arquivo pode, em tese, ser compilado e executado em qualquer plataforma para a qual existe um compilador JIT. A presena dos metadados, juntamente com o cdigo MSIL, torna o cdigo autodescritivo, o que significa que no temos mais a necessidade de bibliotecas de tipo (type libraries) ou IDL Interface Definition Language, dispositivos que eram necessrios ao funcionamento de componentes baseados no modelo COM/COM+. Voltamos a salientar este ponto, o componente criado para o .NET possui, na forma de metadados, toda a informao necessria ao seu funcionamento e necessria para que possa ser acessado por outros componentes. O CLR localiza e extrai os metadados do arquivo PE durante a execuo, medida que isso vai sendo necessrio.

Mais Algumas Observaes Sobre o JIT


O processo de compilao utilizado pelo JIT procura fazer uma srie de otimizaes, para tornar o cdigo nativo gerado o mais enxuto e veloz possvel. O JIT detecta se algum mtodo ou propriedade no ser utilizado durante a execuo do programa. Ao invs de converter todo o cdigo MSIL, contido no arquivo PE, o JIT converte apenas o cdigo que realmente ser necessrio

49

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


para a execuo do programa. Isso faz com que a compilao seja mais rpida, com que sejam poupados recursos como por exemplo memria, e o cdigo resultante seja otimizado, tanto em termos de tamanho quanto de velocidade de execuo. Como parte da compilao do MSIL para cdigo nativo, o cdigo deve passar por um processo de verificao, a no ser que tenha sido definida uma poltica de segurana que permite ao cdigo passar pela verificao. O processo de verificao faz uma anlise do cdigo MSIL e dos metadados, para definir se o cdigo pode ser definido como type safe. Para que o cdigo possa ser definido como type safe, o mesmo somente deve acessar regies de memria para as quais o mesmo tem autorizao. Este processo necessrio para garantir que os objetos estejam isolados uns dos outros, de tal maneira que um objeto no tente alterar ou corromper dados de outros objetos. Na plataforma Windows 9x, quando um programa tenta acessar a rea de memria utilizada por outro programa, gerada uma Falha Geral de Proteo, com a famigerada mensagem Voc Executou uma Operao Ilegal e o seu programa ser fechado. Para que o cdigo passe no teste de type safe, o mesmo deve atender as seguintes condies: Todas as referncias feitas a um determinado tipo so compatveis com o tipo que est sendo referenciado. Somente operaes devidamente definidas so invocadas pelo objeto. possvel verificar e confirmar a identidade do objeto. Isso evita que um componente, por exemplo um vrus, se faa passar por um componente vlido, porm com um comportamento bem diferente do verdadeiro componente. O processo de verificao tambm faz uma anlise do cdigo MSIL, para ver se o mesmo foi corretamente gerado. Se as polticas de segurana da nossa aplicao definem que o cdigo deve passar na verificao de type safe e o cdigo no passar nesta verificao, uma exceo ser gerada quando o cdigo for executado. Um detalhe importante que nem todo o cdigo MSIL compilado para cdigo nativo, de uma s vez. A compilao acontece em nvel de mtodo. Quando um mtodo chamado, o cdigo MSIL do mesmo compilado, o cdigo nativo gerado pelo JIT e o mtodo executado. O cdigo nativo gerado mantido. Quando o mtodo for chamado pela segunda vez, o cdigo nativo gerado na primeira chamada ser executado, evitando, com isso, que o cdigo do mtodo tenha que ser compilado a cada chamada do mesmo, o que acarretaria uma perda considervel de desempenho.

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

CAPTULO 2: ENTENDENDO O CLR

Uma Definio em Poucas Palavras


Para aplicaes tradicionais do Windows, anteriores ao modelo .NET, a aplicao final um arquivo executvel ou um arquivo executvel mais um conjunto de .DLL e componentes. Uma DLL pode conter um objeto COM/COM+ em uma biblioteca de tipos (typelib). Para o Framework .NET, os diversos componentes de uma aplicao so empacotados atravs da utilizao de assemblies. Um assembly contm todo o cdigo MSIL gerado pelo compilador, os metadados e os demais arquivos necessrios ao funcionamento da aplicao. Cada assembly tambm contm um manifesto. O manifesto contm as seguintes informaes: Uma lista dos arquivos contidos no assembly. A definio de quais tipos e recursos do assembly podem ser acessados por outros componentes ou programas. Um mapeamento entre os tipos e recursos disponibilizados pelo assembly e os arquivos que contm os tipos e recursos. Uma lista de outros assemblies, dos quais o assembly depende para o seu correto funcionamento. Informaes sobre a identidade do assembly, incluindo o nome e a verso do assembly. Se o assembly for pblico, como por exemplo um Web Service, o manifesto tambm pode conter a chave pblica do assembly. Este um mecanismo semelhante, em funcionalidade, utilizao de um Certificado Digital, para identificar a origem de um controle ActiveX. Um assembly contm toda a informao necessria ao seu funcionamento. Ao definirmos um assembly, o mesmo pode estar contido em um nico arquivo ou em mltiplos arquivos. A vantagem de utilizar mltiplos arquivos que as diferentes partes do assembly podem ser carregadas e executadas medida que as mesmas forem sendo utilizadas.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


uma unidade de distribuio das aplicaes .NET. Quando uma aplicao inicializada, somente o assembly chamado na inicializao da aplicao precisa estar disponvel. Outros assemblies somente so chamados medida que forem sendo utilizados. Essa uma caracterstica muito importante, principalmente para aplicaes Web, onde a velocidade das conexes sempre um fator muito importante a ser considerado. Assemblies podem ser estticos ou dinmicos. Assemblies estticos podem incluir tipos do Framework .NET (interfaces e classes), alm dos recursos utilizados pelo assembly (bitmaps, .jpg files, arquivos de som ou imagem, etc.). Assemblies estticos so gravados em disco em arquivos PE. Na verdade um arquivo PE pode ser gravado na forma de um EXE ou uma DLL. Assemblies dinmicos rodam diretamente da memria e no so salvos no disco antes de serem executados. Aps a execuo, podemos salvar assemblies dinmicos em disco.

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.

Figura 2.2: Assembly e seus componentes em um nico arquivo.

www.juliobattisti.com.br

52

CAPTULO 2: ENTENDENDO O CLR


Os componentes do assembly tambm podem estar divididos em diversos arquivos. Estes arquivos podem conter mdulos de cdigo compilado, recursos (como por exemplo arquivos grficos ou de vdeo) ou qualquer outro arquivo necessrio ao funcionamento da aplicao .NET. Existem duas razes para a colocao dos componentes de um assembly em mltiplos arquivos: Quando precisamos combinar, na mesma aplicao, componentes ou mdulos criados em diferentes linguagens. Para otimizar o download dos componentes de uma aplicao, de tal maneira que os componentes ou mdulos menos utilizados somente sejam carregados quando forem necessrios. Esta uma alternativa importante, principalmente para aplicaes Web. Na Figura 2.3 temos o exemplo de um assembly composto de quatro arquivos: Um arquivo o mdulo principal. criado em VB.NET. Outro arquivo o mdulo com funes (Criado em C#) usadas pelo assembly principal. Um arquivo .bmp. Um arquivo .jpg.

Figura 2.3: Exemplo de um assembly com vrios arquivos.

53

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

O que Temos no Manifesto?


O Manifesto contm o seguinte conjunto de informaes (metadados): Qual a relao entre os diferentes componentes do assembly. Informaes sobre a verso do assembly. Escopo. Informaes para resolver referncias a outras classes e componentes. O manifesto pode estar contido em um arquivo PE Portable executable (pode ser um .exe ou uma .dll), juntamente com o cdigo MSIL ou pode estar em um arquivo PE separado, o qual contm somente o manifesto. Esta ltima situao acontece quando temos um assembly formado de diversos arquivos. As informaes contidas no manifesto so responsveis pelas seguintes funes: Relao dos arquivos que compem o assembly. Gerencia o mapeamento entre os tipos e recursos disponibilizados pelo assembly e os arquivos onde esto contidas as declaraes e implementaes dos respectivos tipos e recursos. Relaciona os assemblies dos quais o assembly em questo dependente. Em resumo, reforando o que j foi comentado no Captulo 1, este conjunto de informaes fornece uma autonomia ao assembly, de tal maneira que o mesmo contm toda a informao necessria ao seu funcionamento. Isso evita que o assembly tenha que ser registrado. Com estes recursos, o processo de instalar uma aplicao .NET est resumido a copiar os arquivos necessrios. Como diriam os ainda apaixonados pelo DOS, voltamos ao estilo xcopy de instalao, em referncia ao comando xcopy, o qual utilizado para copiar arquivos ou pastas.

CTS Common Type System


O CTS desempenha um papel fundamental para garantir e facilitar e interoperabilidade entre programas e componentes criados em diferentes linguagens. O CTS define a maneira como os tipos de dados so declarados, usados e gerenciados pelo CLR. Atravs do CTS temos a garantia de que, por exemplo, um inteiro ter as mesmas caractersticas, independente da linguagem na qual o mesmo estiver sendo utilizado. Uma das maiores dificuldades, no modelo COM/COM+, em fazer com que componentes escritos em diferentes linguagens pudessem interagir o fato de que cada linguagem possui o seu prprio conjunto de tipos, o qual no compatvel com o conjunto de tipos das demais linguagens. Colocando de uma maneira mais simples: o tamanho, forma de armazenamento e demais caractersticas de cada tipo dependente da linguagem, no modelo COM/COM+. O CTS responsvel pelas seguintes funes: Fornecer uma estrutura de dados e tipos padronizados, estrutura esta que torna a integrao entre diferentes linguagens uma realidade, alm de garantir uma execuo mais rpida, uma vez que as converses de tipo passam a ser coisa do passado. Fornece um modelo orientado a objetos, o qual capaz de suportar qualquer linguagem habilitada ao .NET.

www.juliobattisti.com.br

54

CAPTULO 2: ENTENDENDO O CLR


Define algumas regras e padres que as linguagens habilitadas ao .NET devem obedecer, o que ajuda a garantir que objetos escritos em diferentes linguagens sero capazes de interagir e trocar mensagens.

Classificao dos Tipos do CTS


Temos duas categorias principais de tipos no CTS: Value types: Toda linguagem de programao fornece um conjunto de tipos bsicos de dados, como por exemplo: inteiros, caracteres, nmeros reais, strings, etc. Estes tipos bsicos so passados por valores. Em outras palavras, se tenho uma varivel x cujo valor 5, utilizo o seguinte comando:
y=x

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.

.NET Framework Class Library Biblioteca de Classes do Framework .NET


O Framework .NET fornece uma biblioteca hierrquica de classes. Esta biblioteca pode ser acessada por qualquer linguagem habilitada ao .NET. Nesta biblioteca temos milhares de classes, interfaces e estruturas, que disponibilizam os mais variados tipos de servios e funcionalidades, como por exemplo: Acesso a fontes variadas de dados.

55

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Configuraes de segurana. Desenvolvimento de componentes e Web services. Manipulao de objetos grficos. Leitura e escrita em disco. Servio de Sockets, com a possibilidade do envio e recebimento de dados utilizando uma grande variedade de protocolos de rede. Criao de aplicaes Web, com servios de fila de mensagens, correio eletrnico, etc. Manipulao de dados e esquemas XML. Criar aplicaes Win32 tradicionais atravs do uso de Win Forms. Criar aplicaes ASP.NET utilizando Web Forms. Acessar as informaes contidas nos assemblies, na forma de metadados. As funcionalidades oferecidas pela biblioteca de classes do Framework .NET facilitam a criao de programas, uma vez que muitas funes j esto prontas para serem utilizadas, evitando que as mesmas tenham que ser implementadas em cada programa. A utilizao de classes comuns a todas as linguagens do Framework .NET tambm facilita a interoperabilidade entre diferentes linguagens. Podemos utilizar as classes diretamente em nossos programas ou podemos criar classes que herdam os mtodos e propriedades de uma determinada classe e adicionar as modificaes necessrias. Vejam que aqui estamos utilizando o conceito de herana. Como so milhares de classes, cada uma com seus mtodos e propriedades, o Framework .NET precisa organizar estas classes de uma maneira a evitar conflito de nomes. A maneira encontrada pelo Framework .NET atravs da utilizao de um espao de nomes (namespace). Um espao de nomes simplesmente um agrupamento lgico das classes, estruturas e interfaces relacionadas. A maioria das classes est contida no espao de nomes System. Diretamente ligado a system temos a definio de tipos bsicos como por exemplo: Int32, String, etc. Um exemplo de classe de segundo nvel, dentro do espao de nomes System, a classe System.Data, a qual fornece uma srie de mtodos para acesso s mais variadas fontes de dados. Temos tambm uma classe de segundo nvel chamada System.Security, a qual fornece servios para configuraes da segurana de acesso s aplicaes .NET. E assim vamos formando uma imensa hierarquia de classes. As classes de segundo nvel, como System.Data e System.Security, herdam todos os mtodos e propriedades da classe me System. Este um dos princpios da orientao a objetos: Herana. No prximo item falaremos mais sobre a herana e os demais fundamentos da orientao a objetos. Na Figura 2.4, temos uma representao parcial do espao de nomes System, no qual representamos apenas alguns tipos bsicos, ligados diretamente a System e s classes derivadas System.Data e System.Security. Podemos continuar nos aprofundando na hierarquia de classes. Por exemplo, existem classes derivadas de System.Data. A classe System.Data.SqlClient contm toda a funcionalidade necessria para acessar dados de um servidor SQL Server 2000. J a classe System.Data.OleDb fornece funcionalidades para conexo com qualquer fonte de dados, para a qual esteja disponvel um OLE-DB Provider. Se acrescentssemos mais estas duas classes, o espao de nomes System ficaria conforme indicado na Figura 2.5. Vejam que a hierarquia de classes vai crescendo. No decorrer deste livro estaremos utilizando diversas classes do .NET Framework Class Library.

www.juliobattisti.com.br

56

CAPTULO 2: ENTENDENDO O CLR

Figura 2.4: Uma representao parcial do espao de nomes System.

Figura 2.5: System.SqlClient e System.OleDb.


Vamos fazer uma breve descrio das principais classes do .NET Framework Class Library. Microsoft.Csharp: Suporte a linguagem C# do Framework .NET. Microsoft.Jscrip: Suporte a linguagem JScript no Framework .NET.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 2.6: Documentao do Framework .NET.


Microsoft.VisualBasic: Contm o Run Time para o VB.NET e fornece o suporte a linguagem no Framework .NET. Microsoft.Win32: Fornece dois tipos de classes: um que trata dos eventos gerados pelo sistema operacional e outro que fornece funes para acessar e gravar informaes na registry do Sistema Operacional. System: a classe principal para todo o espao de nomes System. Contm todas as caractersticas comuns a todas as classes, uma vez que as classes derivadas de System herdam suas caractersticas. Tambm contm os tipos bsicos, como por exemplo inteiros de 16, 32 ou 64 bits, String, byte, etc. System.Collections: Contm as interfaces e classes que definem vrias colees de objetos, como por exemplo listas, filas, arrays e dicionrios. System.Data: Contm a maioria das classes que compem a arquitetura do ADO.NET. Com ADO.NET, podemos construir componentes capazes de gerenciar, de uma maneira eficiente, dados de mltiplas fontes. Em um ambiente desconectado (connection less) como a Internet, ADO.NET disponibiliza uma srie de ferramentas para requisitar, alterar e sincronizar dados em uma arquitetura de mltiplas camadas. O principal elemento do ADO.NET uma classe chamada DataSet, a qual estudaremos em detalhes nos captulos sobre ASP.NET. System.Data.Common: Contm as classes que so compartilhadas por todos os .NET data providers (provedores de dados para o .NET). Um .NET data provider uma coleo de classes que fornece acesso a uma determinada fonte de dados, como por exemplo dados em um Mainframe ou em um servidor SQL Server 2000. System.Data.OleDb: Contm as classes que fornecem acesso a qualquer fonte de dados para a qual exista um OLE-DB Provider disponvel. System.Data.SqlClient: Contm um conjunto de classes que fornece um acesso otimizado ao SQL Server 2000. Utiliza o driver nativo para o SQL Server 2000, ao invs de um OLE-DB Provider ou uma fonte ODBC. Por isso o acesso mais rpido.

www.juliobattisti.com.br

58

CAPTULO 2: ENTENDENDO O CLR


System.Diagnostics: Um conjunto de classes com que permite que seja feita a depurao e acompanhamento da execuo do cdigo das aplicaes .NET. Tambm fornece classes para leitura e escrita no log de eventos, para inicializar servios do Sistema Operacional, para monitorar a performance do sistema atravs da utilizao de contadores de desempenho. System.DirectoryServices: Um conjunto de classes que fornece, para as aplicaes .NET, acesso ao Active Directory do Windows 2000. As classes de System.DirectoryServices podem ser utilizadas com qualquer Active Directory Service Provider disponvel. Atualmente esto disponveis os seguintes: 1. 2. 3. 4. IIS Internet Information Server LDAP Lightweight Directory Access Protocol NDS Novel Directory Services WinNT Para acesso ao diretrio do Windows NT 4.0.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


System.XML: o namespace que contm as classes que do suporte ao padro XML. Apresentamos apenas uma descrio bsica dos principais namespaces do Framework .NET. Livros inteiros podem ser escritos sobre um nico namespace como por exemplo System.Net ou System.Security. A melhor fonte de consulta para as classes, mtodos e propriedades de um namespace a prpria documentao do Framework .NET. No decorrer deste livro estaremos utilizando algumas classes em nossas pginas ASP.NET. Uma das classes que mais utilizaremos System.Data e suas classes derivadas como System.SqlCliente e System.OleDb. Agora vamos fazer uma reviso dos principais conceitos de Orientao a Objetos. importante a reviso destes conceitos uma vez que a linguagem C# (assunto para os captulos 3, 4 e 5) e todo o Framework .NET so baseados nos conceitos de Orientao a Objetos.

Conceitos Bsicos de Orientao a Objetos


Vamos fazer uma reviso dos principais conceitos de orientao a objetos. A orientao a objetos, quer seja como metodologia de anlise, projeto ou programao, foi criada com o objetivo de resolver problemas que a programao estruturada no foi capaz. A orientao a objetos possui os seguintes objetivos bsicos: Produtividade. Incentivo a boas prticas de programao. Uma modelagem mais prxima do entendimento do usurio final. Reutilizao de cdigo. Facilidade de manuteno do cdigo. Embora a proposta de orientao a objetos seja bastante consistente, a mesma no teve o nvel de implementao esperado. No cabe aqui discutir os motivos que fizeram com que a velocidade de adoo ficasse abaixo da esperada. Este fato ainda mais interessante uma vez que a grande maioria das empresas admite que a orientao a objetos oferece uma srie de vantagens em relao ao modelo de programao estruturada. Porm a mudana para um novo modelo envolve uma nova maneira de pensar, uma necessidade de treinamento e, principalmente, uma mudana cultural. Esta ltima sem sombra de dvidas a mudana mais difcil. Vamos revisar os seguintes conceitos bsicos: O que um objeto? Mensagens. Classes. Herana. Instncias. Reutilizao de cdigo.

www.juliobattisti.com.br

60

CAPTULO 2: ENTENDENDO O CLR

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Na Figura 2.7 temos uma representao do objeto Funcionrio.

Figura 2.7: Objeto Funcionrio mtodos e propriedades.

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

CAPTULO 2: ENTENDENDO O CLR


Classes constituem modelos que so utilizados para a criao de objetos. Nas classes so descritas a estrutura de dados (atravs das propriedades) e o comportamento (atravs de seus mtodos) de um ou mais objetos similares que possuem seus dados estruturados da mesma forma e so manipulados pelos mesmos mtodos. Um objeto uma instncia de uma classe que criada em tempo de execuo. Classes so puramente uma descrio esttica de um conjunto de possveis objetos. Na prtica, o que significa, por exemplo, termos uma classe chamada Funcionrios? Esta classe serve como modelo para a criao de objetos do tipo Funcionrio. Na classe Funcionrios esto as definies das propriedades e dos mtodos para um objeto Funcionrio. Ou seja, sempre que criarmos um objeto do tipo funcionrio, o mesmo ser criado com todas as propriedades e mtodos da classe Funcionrios. Como eu sou apaixonado por definies simples e sem meias-palavras, adorei esta definio que encontrei na Internet: Classe uma forma para fazer objetos. Acho que essa frase resume tudo. Grande parte da funcionalidade do Framework .NET fornecida por um grande nmero de classes, as quais fazem parte de .NET Framework Class Library, j descrita anteriormente. O Framework .NET agrupa as classes de acordo com suas funcionalidades. Um agrupamento de classes criadas para um determinado fim tambm conhecido como um namespace (espao de nomes). Por exemplo, temos o namespace System.Data. Dentro deste namespace existem vrias classes que fornecem os mtodos necessrios para a conexo e manipulao de fontes variadas de dados. Existem classes para a conexo com o SQL Server 2000, outras para a conexo com fontes ODBC e assim por diante. A biblioteca de classes do Framework .NET organizada de uma forma hierrquica, onde as classes de nveis inferiores herdam todas as caractersticas da classe me. Falaremos mais sobre herana no prximo item. Nos Captulos 3, 4 e 5 vamos estudar os fundamentos da linguagem C#. Veremos que tudo (ou quase tudo, como preferem alguns) no C# so classes. At para criar um simples programa como o Hello World apresentado no Captulo 1 e exibido novamente na Listagem 2.1, estamos criando uma classe. Observe a palavra class na segunda linha do exemplo.

Listagem 2.1 Hello World !


using System; class primeiroprograma { // Meu primeiro programa em C# // O tradicional Hello World !!

public static void Main() { string umamensagem = Hello World !!!; Console.WriteLine(umamensagem); } }

63

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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

CAPTULO 2: ENTENDENDO O CLR


Na Figura 2.8 temos uma viso geral da classe Clientes.

Figura 2.8: A classe Clientes.


Continuando o nosso exemplo, o banco tem clientes com caractersticas diferenciadas. Por exemplo: Correntistas Contas de poupana Emprstimos pessoais Financiamentos habitacionais Cada um destes tipos de clientes possui propriedades e relaes diferenciadas com o banco. Por isso precisamos de objetos que representem estas diferenas. A primeira sugesto seria criar uma classe para cada tipo de cliente. A ttulo de exemplo poderamos criar as seguintes classes: ClienteCorrentista ClientePoupana ClienteEmprstimo ClienteHabitacional

65

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Ao criar a classe ClienteCorrentista podemos cri-la como uma subclasse da classe Clientes. Com isso, a classe ClienteCorrentista herda todas as propriedades e mtodos da classe pai Clientes. Somente precisaremos implementar as propriedades e mtodos que so especficas da subclasse ClienteCorrentista. A ttulo de exemplo poderamos definir algumas propriedades e mtodos da classe ClienteCorrentista. Para a classe ClienteCorrentista poderamos definir as seguintes propriedades: NumConta NumAgncia Limite Categoria Para a classe ClienteCorrentista poderamos definir os seguintes mtodos: DefinirLimite AumentarLimite BloquearConta LiberarConta Juntando as propriedades e classes que foram herdadas da classe pai Clientes, a classe ClienteCorrentista teria as seguintes propriedades: Nome (herdada da classe pai) CPF (herdada da classe pai) RG (herdada da classe pai) Identidade (herdada da classe pai) Endereo (herdada da classe pai) Cidade (herdada da classe pai) CEP (herdada da classe pai) Fone (herdada da classe pai) e-mail (herdada da classe pai) NumConta NumAgncia Limite Categoria Juntando as propriedades e classes que foram herdadas da classe pai Clientes, a classe ClienteCorrentista teria as seguintes propriedades: Cadastrar (herdada da classe pai)

www.juliobattisti.com.br

66

CAPTULO 2: ENTENDENDO O CLR


Excluir (herdada da classe pai) Atualizar (herdada da classe pai) DefinirLimite AumentarLimite BloquearConta LiberarConta Na Figura 2.9 temos uma viso geral da classe ClienteCorrentista, j incluindo as propriedades e mtodos herdados da classe pai Clientes. O mesmo raciocnio tambm vlido para a criao das classes ClientePoupana, ClienteEmprstimo e ClienteHabitacional, como subclasses da classe pai Clientes.

Figura 2.9: A classe Clientes.

67

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Caso haja necessidade, uma subclasse pode sobrescrever um mtodo herdado da classe pai. Por exemplo, a subclasse ClienteCorrentista poderia sobrescrever o mtodo Cadastrar da classe pai Clientes. Isso pode ser feito para que sejam atendidas necessidades especficas do cadastramento de um cliente correntista. As linguagens do Framework .NET suportam esta tcnica, a qual tambm conhecida como Overwrite. Aps termos criado as demais classes do nosso exemplo, estaremos com a hierarquia de classes ilustrada na Figura 2.10.

Clientes

ClienteCorrentista

ClienteCorrentista

ClienteCorrentista

ClienteEmprstimos

Figura 2.10: Uma hierarquia de classes.


Conforme descrevemos anteriormente, uma hierarquia de classes tambm pode ser chamada de namespace ou espao de nomes. Tambm j descrevemos antes que .NET Framework Class Library , na verdade, um grande nmero de namespaces, cada um com funcionalidades especficas, funcionalidades estas disponibilizadas por um grande nmero de classes dentro de cada um dos namespaces. Tambm gostaria de reforar que este um dos grandes atrativos do .NET, ou seja, oferecer uma infinidade de classes, as quais facilitam muito o desenvolvimento das aplicaes e, ainda por cima, classes estas que podem ser acessadas a partir de qualquer linguagem do Framework .NET.

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

CAPTULO 2: ENTENDENDO O CLR


Em uma empresa, a equipe de desenvolvimento pode criar classes bsicas, as quais podem ser utilizadas em diversos programas da empresa. Sempre que forem feitas alteraes nas classes bsicas, as alteraes sero herdadas por todos os programas que utilizam as classes bsicas. Vejam que este cenrio muito diferente do que acontece, na prtica, hoje. Muitas vezes cada projeto de desenvolvimento parte do zero, sem que nada seja reaproveitado de projetos anteriores. Com isso, uma srie de funcionalidades bsicas precisam ser reescritas a cada novo programa. Desta forma temos projetos mais longos, com maior custo e que muito raramente so concludos no prazo.

Mais Alguns Detalhes Antes de Iniciarmos a Parte Prtica


Conforme j foi descrito anteriormente, nos prximos trs captulos estaremos tratando da linguagem C#. Nos captulos restantes do livro, estaremos utilizando o C# para a criao de pginas ASP.NET. Para que voc possa acompanhar os exemplos apresentados nos captulos 3, 4 e 5 necessrio que o Framework .NET tenha sido instalado com sucesso e que o compilador do C# esteja disponvel. A seguir coloco os passos necessrios para que voc verifique se est tudo OK com o computador que voc utilizar para acompanhar os exemplos dos captulos 3, 4 e 5. Para verificar se o Framework .NET foi instalado com sucesso: 1. 2. Verifique se a opo Microsoft .NET Framework SDK foi adicionada ao menu Programas (Iniciar -> Programas -> Microsoft .NET Framework SDK). Verifique se a pasta \Arquivos de programas\Microsoft.NET\FrameworkSDK foi criada no drive onde est instalado o Windows 2000. Para verificar se o compilador C3 est instalado e funcionando: 1. 2. Abra o Bloco de Notas (Iniciar -> Programas -> Acessrios -> Bloco de Notas). Digite o cdigo indicado na Listagem 2.2:

NOTA: Para orientaes sobre o download e a instalao do Framework .NET consulte a Introduo deste livro.

Listagem 2.2 Hello World !


using System; class teste { // Aprendendo C#. // Um exemplo simples.

NOTA: Se voc est utilizando o Windows 2000 em Ingls, ao invs de Arquivo de Programas, procure na pasta Program Files.

public static void Main() { Console.WriteLine(Testando o compilador !!!); } }

69

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


3. 4 5. 6. 7. 8. 9. Selecione o comando Arquivo -> Salvar como... Na lista Salvar em, navegue at a pasta C:\Meus documentos. Na lista Salvar como tipo:, selecione a opo Todos os arquivos. No campo Nome do arquivo:, digite teste.cs Sua janela deve estar conforme indicado na Figura 2.11. D um clique no boto Salvar. Feche o Bloco de Notas.

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

Figura 2.11: Salvando o arquivo teste.cs


13. Observe que o nome da pasta Meus documentos vem entre aspas porque a mesma possui espao em branco no nome. Se no colocarmos aspas o comando cd (change directory) ir gerar um erro. 14. O prompt deve indicar que voc est na pasta Meus documentos, conforme indicado na Figura 2.12.

www.juliobattisti.com.br

70

CAPTULO 2: ENTENDENDO O CLR

Figura 2.12: Navegando at a pasta Meus documentos.


15. Execute o seguinte comando:
csc teste.cs

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.

Figura 2.13: Executando o programa teste.exe.

71

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Observe a sada do programa que simplesmente a mensagem: Testando o compilador !!! Isto comprova que o compilador C# est instalado e funcionando.

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

CAPTULO 2: ENTENDENDO O CLR

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#

NOTA: Para maiores detalhes sobre o CTS consulte os Captulos 1 e 2.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


for programador iniciante, no tem problema. Os exemplos apresentados iro ajud-lo a entender a estrutura e os comandos da linguagem. O cdigo-fonte com os exemplos dos captulos 3, 4 e 5 esto disponveis para download no site da editora Axcel Books: www.axcel.com.br. Antes de comearmos faa o seguinte: Crie uma pasta chamada ExCSharp no drive C, ou em outro drive qualquer do computador que voc est utilizando para acompanhar os exemplos deste livro. Na pasta ExCSharp crie uma subpasta chamada Cap3, outra chamada Cap4 e mais uma chamada Cap5. Colocarei, em cada uma das subpastas, os exemplos dos captulos respectivos. Dentro destas pastas ficaro gravados dois arquivos para cada exemplo. Um arquivo com a extenso .cs, o qual o arquivo com o cdigo-fonte, e um arquivo .exe que o resultado da compilao do arquivo .cs.

Mais uma Linguagem de Programao?


Sim, mais uma. Para resumir em poucas palavras quais os objetivos da Microsoft com a criao do C#, eu diria o seguinte: Uma nova linguagem, criada para ter a simplicidade e facilidade de desenvolvimento do Visual Basic, aliadas com o poder do C++. Vamos resumir um pouco mais: Simples Poderosa Fcil Alm de poder e simplicidade, sendo uma linguagem do Framework .NET, o C# pode se beneficiar de toda a funcionalidade disponibilizada pelo mesmo. Alm disso podemos utilizar o C# para qualquer tipo de desenvolvimento, desde aplicaes de linha de comando, tambm conhecidas como aplicaes de Console, passando por aplicaes grficas Win32 tradicionais, at aplicaes Web com ASP.NET. Alis justamente de criao de aplicaes Web com a dobradinha ASP.NET/C# que estaremos tratando do Captulo 5 at o final deste livro. Nas verses anteriores, para a criao de pginas ASP ns tnhamos basicamente duas opes: VBScript ou JScript. Para a criao de aplicaes WIn32 tnhamos vrias opes: VB, C++, etc. Para aplicaes do tipo console, basicamente o C++. Agora, com o Framework .NET podemos criar qualquer tipo de aplicao com qualquer linguagem. Se um dia tivermos um Cobol habilitado ao .NET, poderemos criar aplicaes Web com a dobradinha ASP.NET/Cobol. Parece estranho? Que tal um FORTRAN habilitado ao .NET?

www.juliobattisti.com.br

74

CAPTULO 2: ENTENDENDO O CLR


O C# foi a linguagem utilizada para criar a maioria dos componentes do Framework .NET, o que nos leva a crer que o C# ser a indicao da Microsoft, como linguagem para o desenvolvimento de aplicativos empresariais, baseados no .NET. Tambm poderamos questionar se C# realmente uma nova linguagem ou um C++ remodelado com cara de Java. As interpretaes podem variar de acordo com a opinio pessoal de cada um, mas o fato que o C# muito semelhante ao C++, com exceo de alguns recursos e comandos que foram retirados. Uma das diferenas tem a ver com a utilizao de ponteiros. No C# no temos ponteiros. Para os programadores C/ C++ a no existncia de ponteiros soa como uma heresia. Porm com o Framework .NET, muitas das funcionalidades que tinham que ser codificadas no prprio programa foram passadas para o controle do Framework .NET. Muitas das operaes avanadas que eram implementadas com a utilizao de ponteiros passaram a ser automaticamente gerenciadas pelo Framework .NET. O exemplo mais tpico a alocao e liberao de memria pelo programa. Estas funes so automaticamente tratadas pelo Framework .NET, liberando o programa para tratar apenas da sua prpria funcionalidade e no de toda a infraestrutura necessria ao seu correto funcionamento. Lembrando do Captulo 1, que o cdigo das aplicaes .NET chamado de managed code, onde operaes inseguras como o acesso direto memria no so permitidas. Estas operaes esto a cargo do Framework .NET. Que aprender C++ no uma tarefa simples ns j sabemos. E aprender C#? uma tarefa simples. Voc poder constatar isso na prtica, medida que formos avanando neste livro. A seguir listo alguns recursos do C++ que foram modificados no C#: No existem ponteiros no C#. Gerenciamento de memria coisa do Framework .NET. Uma srie de operadores do C++ como por exemplo: ::, . e -> foram substitudos por um nico operador no C#: . (ponto) Outra melhoria significativa do C# em relao ao C++ foi o gerenciamento de excees. Veremos mais detalhes nos prximos captulos.

Como a cara de um Programa Escrito em C#?


Vamos apresentar o todo e depois explicar as partes. Em outras palavras: Vamos apresentar um programa completo, porm bastante simples, em C#. Alm do cdigo-fonte iremos compilar e executar o programa. O nosso programa de exemplo solicita que sejam digitados dois nmeros inteiros e exibe o resultado da adio e da multiplicao entre os nmeros digitados. Aps criarmos e testarmos o programa, iremos s devidas explicaes. Vamos salvar o cdigofonte como ex1cap3.cs. Ao compilarmos o cdigo-fonte ser gerado um arquivo chamado ex1cap3.exe.

75

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Criando o programa ex1cap3.cs: 1. 2. Abra o Bloco de Notas (Iniciar -> Programas -> Acessrios -> Bloco de Notas). Digite o cdigo indicado na Listagem 3.1:

Listagem 3.1 Um exemplo simples ex1cap3.cs


using System;

class ex1cap3 { // Exemplo1 Captulo 3. // Entrada e sado com C# // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() { // Declarao das variveis.

Int32 Adicao; Int32 Produto;

// Entrada dos valores de x e y

Console.Write(Digite o primeiro valor inteiro ->); String Aux1=Console.ReadLine();

Console.Write(Digite o segundo valor inteiro ->); String Aux2=Console.ReadLine();

// Clculo da adio e do produto.

Adicao = Convert.ToInt32(Aux1) + Convert.ToInt32(Aux2); Produto = Convert.ToInt32(Aux1) * Convert.ToInt32(Aux2);

// Exibio dos resultados. Console.WriteLine(O valor da soma -> {0},Adicao);

Console.WriteLine(O valor da Produto -> {0},Produto); } }

www.juliobattisti.com.br

76

CAPTULO 2: ENTENDENDO O CLR


3. 4 5. 6. 7. 8. 9. Selecione o comando Arquivo -> Salvar como... Na lista Salvar em, navegue at a pasta C:\ExCsharp\Cap3. Na lista Salvar como tipo:, selecione a opo Todos os arquivos. No campo Nome do arquivo:, digite ex1cap3.cs. D um clique no boto Salvar. Feche o Bloco de Notas. Abra um Prompt de comando (Iniciar -> Programas -> Acessrios -> Prompt de comando).

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.

Figura 3.1: Execuo do programa ex1cap3.exe.

77

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Agora vamos s devidas explicaes sobre o nosso primeiro exemplo. Vamos analisar o seguinte trecho de cdigo:
using System;

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

public static void Main() {

// Declarao das variveis.

System.Int32 Adicao; System.Int32 Produto;

// Entrada dos valores de x e y System.Console.Write(Digite o primeiro valor inteiro ->);

www.juliobattisti.com.br

78

CAPTULO 2: ENTENDENDO O CLR


System.String Aux1=System.Console.ReadLine();

System.Console.Write(Digite o segundo valor inteiro ->); System.String Aux2=System.Console.ReadLine();

// Clculo da adio e do produto.

Adicao = System.Convert.ToInt32(Aux1) + System.Convert.ToInt32(Aux2); Produto = System.Convert.ToInt32(Aux1) * System.Convert.ToInt32(Aux2);

// Exibio dos resultados.

System.Console.WriteLine(O valor da soma

-> {0},Adicao);

System.Console.WriteLine(O valor da Produto -> {0},Produto); } }

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;

Vamos analisar o seguinte trecho de cdigo:


class ex1cap3 { // Exemplo1 Captulo 3. // Entrada e sado com C# // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


outro tipo qualquer definido no Framework .NET. Para o nosso estudo de introduo ao C#, ficaremos com a primeira frase, ou seja, toda a lgica dos nossos exemplos estar contida dentro de uma classe. No nosso caso estamos definindo uma classe chamada ex1cap3. Um detalhe importante que o nome da classe no precisa ser igual ao nome do arquivo .cs. Por exemplo, poderamos ter uma classe ex1cap3.cs e gravarmos o cdigofonte em um arquivo chamado admult.cs. Todo o contedo de uma classe (mtodos, propriedades, etc.) deve estar entre chaves. Na linha aps a definio do nome da classe, temos a abertura das chaves. Na ltima linha do programa temos o fechamento das chaves. As linhas iniciadas com duas barras (//) so linhas de comentrio. Qualquer semelhana com C/C++ no mera coincidncia. Como temos mltiplas linhas de comentrios tambm poderamos ter utilizado a sintaxe a seguir:
/* Exemplo1 Captulo 3. Entrada e sado com C# Por: Jlio Battisti MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA */

Vamos analisar o seguinte trecho de cdigo:


public static void Main()

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:
{

// Declarao das variveis.

Int32 Adicao; Int32 Produto;

// Entrada dos valores de x e y

Console.Write(Digite o primeiro valor inteiro ->); String Aux1=Console.ReadLine();

Console.Write(Digite o segundo valor inteiro ->);

www.juliobattisti.com.br

80

CAPTULO 2: ENTENDENDO O CLR


String Aux2=Console.ReadLine();

// Clculo da adio e do produto.

Adicao = Convert.ToInt32(Aux1) + Convert.ToInt32(Aux2); Produto = Convert.ToInt32(Aux1) * Convert.ToInt32(Aux2);

// Exibio dos resultados.

Console.WriteLine(O valor da soma

-> {0},Adicao);

Console.WriteLine(O valor da Produto -> {0},Produto); }

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Neste caso o {0} substituido pelo valor da varivel adio. As mesmas consideraes so vlidas para a varivel Produto, conforme indicado na linha a seguir:
Console.WriteLine(O valor da Produto -> {0},Produto);

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 {

public static void Main() {

Comandos do mtodo Main()

Definio de outros mtodos e propriedades.

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

CAPTULO 2: ENTENDENDO O CLR


Vamos iniciar o nosso estudo pelos Value Types.

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.

Listagem 3.2 Um exemplo de Value Types ex2cap3.cs


using System;

class ex2cap3 { // Exemplo2 Captulo 3. // Value Types // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

83

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


// Declarao das variveis. Int32 a; Int32 b;

// Atribuo valores s variveis a e b.

a=10; b=15;

// Atribuo o valor da varivel b varivel a.

a=b;

// Exibo os valores das variveis a e b.

Console.WriteLine(Valor da varivel a: {0},a); Console.WriteLine(Valor da varivel b: {0},b);

// Agora modifico o valor da varivel b. // E observamos que o valor de a no se alterou.

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

CAPTULO 2: ENTENDENDO O CLR

Figura 3.2: Executando o programa ex2cap3.exe.


Observe que, aps modificarmos o valor da varivel b, o valor da varivel a manteve-se inalterado. Este o comportamento esperado, conforme descrito anteriormente. Em C# tambm temos os tipos simples presentes na maioria das linguagens. Conforme descrevemos anteriormente, um tipo simples uma instncia de uma estrutura ou classe do namespace System. Para facilitar a programao, o C# oferece aliases (apelidos) para os tipos do Framework .NET. Por exemplo, ao invs de declararmos o tipo de uma varivel inteira como System.Int32, podemos utilizar o alias do C#: int. Na Tabela 3.1 temos uma descrio dos principais tipos bsicos do C#. Tambm apresentamos o alias correspondente, bem como uma descrio da faixa de valores de cada tipo.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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.

System.UInt64 System.Char System.Single System.Double System.Boolean System.Decimal

ulong char float double bool decimal

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

CAPTULO 2: ENTENDENDO O CLR


x = 2 + 3i y = -1 + 4,5i z = 3 5,2i

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.

Listagem 3.3 Um exemplo utilizando estruturas ex3cap3.cs


using System;

// Exemplo3 Captulo 3.

87

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

// Utilizao de estruturas. // Nmeros complexos. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

struct numcomplexo { public float preal,pimag; }

class ex3cap3 {

public static void Main() {

// Declarao das variveis.

numcomplexo num1,num2; numcomplexo soma;

// Entrada dos valores para a parte real // e a parte imaginria dos nmeros num1 e num2.

Console.Write(Digite a parte real do primeiro nmero ->); String Auxreal1=Console.ReadLine();

num1.preal = Convert.ToSingle(Auxreal1);

Console.Write(Digite a parte imaginria do primeiro nmero ->); String Auximag1=Console.ReadLine();

num1.pimag = Convert.ToSingle(Auximag1); Console.Write(Digite a parte real do segundo nmero ->);

www.juliobattisti.com.br

88

CAPTULO 2: ENTENDENDO O CLR

String Auxreal2=Console.ReadLine();

num2.preal = Convert.ToSingle(Auxreal2);

Console.Write(Digite a parte imaginria do segundo nmero ->); String Auximag2=Console.ReadLine();

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.

soma.preal = num1.preal + num2.preal; soma.pimag = num1.pimag + num2.pimag;

// Exibio dos resultados.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 3.3: Executando o programa ex3cap3.exe.


Depois este valor convertido para o tipo Single, antes de ser atribudo parte real da varivel num1, conforme exemplo a seguir:
num1.preal = Convert.ToSingle(Auxreal1);

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

CAPTULO 2: ENTENDENDO O CLR


Neste caso os valores inteiros associados aos elementos do conjunto seriam os seguintes:
Domingo Segunda Tera Quarta Quinta Sexta Sbado = 1 = 2 = 3 = 4 = 5 = 6 = 7

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Quarta Quinta Sexta Sbado } = 4, = 5, = 6, = 7

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.

Listagem 3.4 Um exemplo utilizando variveis do tipo string ex4cap3.cs


using System;

class ex4cap3 {

www.juliobattisti.com.br

92

CAPTULO 2: ENTENDENDO O CLR

// Exemplo4 Captulo 3. // Entrada e sado com C# // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() { // Declarao de duas variveis do tipo string.

string Texto1; string Texto2;

//Defino valores para as variveis Texto1 e Texto2;

Texto1 = Jos da Silva; Texto2 = Maria do Socorro;

// 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.

Console.WriteLine(Varivel Texto 1-> {0},Texto1.ToUpper()); Console.WriteLine(Varivel Texto 2-> {0},Texto2.ToUpper()); Console.WriteLine(*********************************************);

} }

93

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Observe que o fato de uma string ser uma instncia de uma classe (System.String) faz com que tenhamos acesso a uma srie de mtodos disponibilizados pela biblioteca de classes do .NET (.NET Framework Class Library). No nosso exemplo utilizamos os mtodos ToLower( ) e ToUpper. Digite o exemplo da Listagem 3.4 e salve o mesmo em um arquivo chamado ex4cap3.cs, na pasta C:\ExCsharp\cap3. Compile e execute o exemplo da Listagem 3.4. Voc obter os resultados indicados na Figura 3.4.

Figura 3.4: Executando o programa ex4cap3.exe.


Na Tabela 3.2 temos uma descrio dos principais mtodos da classe System.String.

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.

CompareOrdinal( ) CompareTo( ) EndsWith( ) Concat( )

www.juliobattisti.com.br

94

CAPTULO 2: ENTENDENDO O CLR

Mtodo Replace( ) ToLower( ) ToUpper( ) Trim( )

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.

Listagem 3.5 Um exemplo utilizando a propriedade Length ex5cap3.cs


using System;

class ex5cap3 { // Exemplo5 Captulo 3. // Utilizao da propriedade Lenght. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Entrada da string pelo usurio.

Console.Write(Digite algum texto e pressione <ENTER> ->); String Texto=Console.ReadLine();

// Exibio dos resultados.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Digite o exemplo da Listagem 3.5 e salve o mesmo em um arquivo chamado ex5cap3.cs, na pasta C:\ExCsharp\cap3. Compile e execute o exemplo da Listagem 3.5. Quando o programa solicitar digite o texto: APRENDENDO C# e pressione ENTER. Voc obter os resultados indicados na Figura 3.5.

Figura 3.5: Executando o programa ex5cap3.exe.


Tambm podemos acessar caracteres individuais de uma string, com base na posio dos mesmos. O primeiro caractere a posio zero; o segundo, a posio 1 e assim por diante. Por exemplo, considere a string Teste definida a seguir:
string Teste = APRENDENDO C#

Agora considere a declarao e inicializao das seguintes variveis do tipo char:


char primcar = teste[0]; char segcar = teste[1];

char deccar = teste[9];

A varivel primcar conter A. A varivel segcar conter P. A varivel deccar conter O.

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

CAPTULO 2: ENTENDENDO O CLR


Por exemplo, para criarmos um array de uma nica dimenso (vetor), com 5 elementos do tipo Int32, utilizamos o seguinte comando:
int[] meuarray = new int[5];

Podemos definir os valores deste array, da seguinte maneira:


meuarray[0] = 25; meuarray[1] = 15; meuarray[2] = 20; meuarray[3] = 12; meuarray[4] = 44;

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];

Podemos definir os valores deste array, da seguinte maneira:


meuarray[0,0] = 25; meuarray[0,1] = 15; meuarray[1,0] = 28; meuarray[1,1] = 12;

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.

Listagem 3.6 Um exemplo utilizando um array de duas dimenses ex6cap3.cs


using System;

class ex6cap3 { // Exemplo6 Captulo 3. // Um array de duas dimenses. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main()

97

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

// Declarao do array de duas dimenses.

int[,] minhamatriz = new int[3,3];

// Definio dos valores do array.

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;

// Exibio dos resultados.

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

CAPTULO 2: ENTENDENDO O CLR


Digite o exemplo da Listagem 3.6 e salve o mesmo em um arquivo chamado ex6cap3.cs, na pasta C:\ExCsharp\cap3. Compile e execute o exemplo da Listagem 3.6. Voc obter os resultados indicados na Figura 3.6.

Figura 3.6: Executando o programa ex6cap3.exe.


Os valores para a(s) dimenso(es) de um array podem ser fornecidos pelo usurio, para que o mesmo seja criado com tamanhos variveis, cada vez que o programa executado. Por exemplo, vamos supor que o usurio tenha fornecido o valor 5 para a dimenso de um array e que este valor esteja em uma varivel chamada dimenarray. Podemos criar, por exemplo, um array de inteiros com a dimenso definida pela varivel dimenarray, utilizando o seguinte comando:
int[] arraydinamico = new int[dimenarray];

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.

Instrues de Fluxo de Controle no C#


Toda linguagem disponibiliza uma srie de instrues para controlar o fluxo de execuo do programa. So instrues para executar um ou outro conjunto de comando dependendo de uma condio ser verdadeira ou falsa; so instrues para executar um conjunto de comandos um nmero determinado de vezes e instrues para executar um conjunto de comandos at que uma condio se torne verdadeira ou falsa.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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

CAPTULO 2: ENTENDENDO O CLR


} else { comando1_falso; comando2_falso; ... comandon_falso; }

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.

Listagem 3.7 Um exemplo utilizando a instruo if ex7cap3.cs


using System;

class ex7cap3 { // Exemplo7 Captulo 3. // Utilizando a instruo If. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Declarao das variveis.

int valor1; int valor2;

// Entrada dos valores de x e y

Console.Write(Digite o primeiro valor inteiro ->); String Aux1=Console.ReadLine(); Console.Write(Digite o segundo valor inteiro ->);

101

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

String Aux2=Console.ReadLine();

// Converto os valores para inteiro.

valor1 = Convert.ToInt32(Aux1); valor2 = Convert.ToInt32(Aux2);

// Teste e exibio dos resultados.

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

CAPTULO 2: ENTENDENDO O CLR


Repita a execuo do programa. Agora digite 10 para o primeiro valor e 15 para o segundo. Voc obter os resultados indicados na Figura 3.8.

Figura 3.7: Executando o programa ex7cap3.exe.

Figura 3.8: Executando o programa ex7cap3.exe com novos valores.


Tambm podemos utilizar mais do que um else na mesma instruo if. Neste caso, aps a clusula else, iniciamos um novo if. A melhor maneira de entendermos esta estrutura atravs de um exemplo. Vamos supor que voc tenha que executar diferentes comandos dependendo do valor de uma varivel x ser igual a 0, 1, 2, ou 3. Para isso, poderamos utilizar o seguinte bloco de cdigo:

103

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


if (x == 0) { comandos para x = 0 } else if (x == 1) { comandos para x = 1 } else if (x==2) { comandos para x = 2 } else { comandos para x = 3 }

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

CAPTULO 2: ENTENDENDO O CLR


Porm, para situaes em que temos que testar vrias possibilidades, a utilizao de sucessivas instrues if-else pode no ser a soluo mais adequada. Para isso temos a instruo switch.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Para a expresso de controle podemos utilizar os seguintes tipos: sbyte, byte, short, ushort, long, ulong, char, string ou um tipo de enumerao. A expresso_de_controle avalidada. Se um dos valores (valor_1, valor_2, etc.) for coincidente com o valor da expresso_de_controle, os comandos respectivos sero executados. Se no tivermos nenhuma coincidncia, os comandos do rtulo default: sero executados. Se no houver um rtulo default, e no houver coincidncia com nenhum valor, a execuo segue para o primeiro comando aps o final do bloco switch. comando para sair um comando que faz com que a execuo saia do bloco switch, de tal maneira que os demais valores no precisem ser avaliados, uma vez que uma coincidncia j foi encontrada ou os comandos relacionados ao rtulo default: foram executados. O comando mais comumente utilizado o break. Vamos a um exemplo simples, no qual o usurio deve digitar um valor entre 1 e 7. O programa informa o dia da semana correspondente, de acordo com o seguinte critrio: Domingo = 1 Segunda-feira = 2 Tera-feira = 3 Quarta-feira = 4 Quinta-feira = 5 Sexta-feira = 6 Sbado = 7 Considere o exemplo da Listagem 3.8.

Listagem 3.8 Um exemplo utilizando a instruo switch ex8cap3.cs


using System;

class ex8cap3 { // Exemplo 8 Captulo 3. // Utilizando a instruo switch. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

www.juliobattisti.com.br

106

CAPTULO 2: ENTENDENDO O CLR

// Declarao da varivel do tipo inteiro.

int dia;

// Entrada do valor pelo usurio.

Console.Write(Digite um nmero inteiro entre 1 e 7 ->); String Aux1=Console.ReadLine();

// Converto o valor para inteiro.

dia = Convert.ToInt32(Aux1);

// Utilizo switch para testar o valor da varivel dia.

switch (dia) { case 1: Console.WriteLine(*****************************************); Console.WriteLine(VOC ESCOLHEU O DOMINGO !!); Console.WriteLine(*****************************************); break;

case 2: Console.WriteLine(*****************************************); Console.WriteLine(VOC ESCOLHEU A SEGUNDA-FEIRA !!); Console.WriteLine(*****************************************); break;

case 3: Console.WriteLine(*****************************************); Console.WriteLine(VOC ESCOLHEU A TERA-FEIRA !!); Console.WriteLine(*****************************************); break;

case 4:

107

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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;

case 6: Console.WriteLine(*****************************************); Console.WriteLine(VOC ESCOLHEU SEXTA-FEIRA !!); Console.WriteLine(*****************************************); break;

case 7: Console.WriteLine(*****************************************); Console.WriteLine(VOC ESCOLHEU O SBADO !!); 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

CAPTULO 2: ENTENDENDO O CLR

Figura 3.9: Executando o programa ex8cap3.exe.


Repita a execuo do programa. Agora digite 10. Voc obter os resultados indicados na Figura 3.10.

Figura 3.10: Executando o programa ex8cap3.exe com um valor igual a 10.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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

Listagem 3.9 Um exemplo utilizando a instruo For ex9cap3.cs


using System;

class ex9cap3 { // Exemplo9 Captulo 3. // A instruo for. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Declarao da varivel.

www.juliobattisti.com.br

110

CAPTULO 2: ENTENDENDO O CLR

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.

Figura 3.11: Executando o programa ex9cap3.exe.


Observe que para o lao for utilizamos uma varivel inteira i. Inicializamos a mesma com o valor 1. O teste 1<=10 faz com que o lao seja executado dez vezes. A ltima parte: i++ e novidade. O operador ++ incrementa a varivel i de um em um. O resultado o mesmo que se tivssemos utilizado: i=i+1. No prximo captulo faremos um estudo detalhado dos operadores do C#. Para calcular o quadrado multiplicamos o nmero por ele mesmo: i*i. Para calcular o cubo multiplicamos o nmero por ele mesmo, trs vezes: i*i*i.

111

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Na Tabela 3.4 temos uma descrio dos principais operadores aritmticos.

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

public static void Main() {

// Declarao das variveis.

int i; int j;

// Lao que executado com i de 1 at 6 // e com j variando de 1 at 5.

Console.WriteLine(i

j+\t+i

j+\t+i

j+\t+i

j+\t+i

j);

for (i=1;i<=6;i++) { for (j=1;j<=5;j++) { Console.Write(i); Console.Write( {0},j);

Console.Write(\t); } Console.WriteLine(); }

} }

113

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Digite o exemplo da Listagem 3.10 e salve o mesmo em um arquivo chamado ex10cap3.cs, na pasta C:\ExCsharp\cap3. Compile e execute o exemplo da Listagem 3.10. Voc obter os resultados indicados na Figura 3.12.

Figura 3.12: Executando o programa ex10cap3.exe.


Aps encerrada a execuo do lao for, a execuo segue normalmente para o comando seguinte ao encerramento do lao for. Tambm podemos utilizar a instruo break, dentro da lao for, para encerr-lo e desviar a execuo para o primeiro comando aps o encerramento do lao. Normalmente a instruo break colocada dentro de uma instruo if, de tal maneira que a mesma somente ser executada se uma determinada condio for alcanada.

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

CAPTULO 2: ENTENDENDO O CLR


Uma caracterstica importante da instruo while que, se no incio do lao, a condio j for falsa, os comandos do interior do lao no sero executados nem uma nica vez. Vamos a um exemplo de utilizao da instruo While. No exemplo da Listagem 3.11 utilizamos a funo While para determinar a soma dos n primeiros nmeros inteiros. O valor de n informado pelo usurio. Considere o exemplo da Listagem 3.11.

Listagem 3.11 Um exemplo utilizando a instruo While ex11cap3.cs


using System;

class ex11cap3 { // Exemplo 11 Captulo 3. // Instruo while. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Declarao das variveis.

int n; int i; int soma;

// Entrada do valor de n pelo usurio.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

soma = 0; i=1;

while (i<=n) { soma=soma+i; i=i+1; } //IMPORTANTSSIMO

//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.

Figura 3.13: Executando o programa ex11cap3.exe com um valor 50.

www.juliobattisti.com.br

116

CAPTULO 2: ENTENDENDO O CLR


Repita a execuo do programa. Agora digite 85. Voc obter os resultados indicados na Figura 3.14.

Figura 3.14: Executando o programa ex11cap3.exe com um valor igual a 80.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Uma caracterstica importante da instruo while que os comandos do lao so executados, pelo menos uma vez. Vamos a um exemplo de utilizao da instruo While. No exemplo da Listagem 3.12 utilizamos a funo do/while para fazer com que o valor digitado pelo usurio esteja dentro de uma determinada faixa. No nosso caso, queremos que o usurio digite um valor menor do que 10. Se for digitado um valor maior ou igual a 10, o programa apresenta novamente uma mensagem para que seja digitado um valor menor do que 10. Considere o exemplo da Listagem 3.12.

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.

Listagem 3.12 Exemplo utilizando a instruo Do/While ex12cap3.cs


using System;

class ex12cap3 { // Exemplo 12 Captulo 3. // Instruo do/while. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Declarao da varivel.

int i;

// Enquanto o usurio no digitar um valor menor // do que 10 o programa no vai adiante.

do

www.juliobattisti.com.br

118

CAPTULO 2: ENTENDENDO O CLR

{ 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.

Figura 3.15: Executando o programa ex12cap3.exe.

119

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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.

Listagem 3.13 Exemplo utilizando a instruo ForEach ex13cap3.cs


using System;

class ex13cap3 { // Exemplo 13 Captulo 3. // Instruo foreach. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Declarao e preenchimento do array. string[] nomes = {jos,maria,pedro,antnio,carlo}; // Utilizo foreach para percorrer todos os elementos do array.

foreach (string nome in nomes) Console.WriteLine(Nome: {0},nome);

} }

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

CAPTULO 2: ENTENDENDO O CLR

Figura 3.16: Executando o programa ex13cap3.exe.


Observe os seguintes comandos:
foreach (string nome in nomes) Console.WriteLine(Nome: {0},nome);

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.

Considere o exemplo da Listagem 3.14.

Listagem 3.14 Outro exemplo utilizando a instruo ForEach ex13cap3.cs


using System;

class ex14cap3 { // Exemplo 14 Captulo 3. // Instruo foreach. // Mtodo Environment.GetLogicalDrives() // Por: Jlio Battisti

121

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Declarao e preenchimento do array.

string[] drives = Environment.GetLogicalDrives();

// Utilizo foreach para percorrer todos os elementos do array.

foreach (string drive in drives) Console.WriteLine(Nome: {0},drive);

} }

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.

Figura 3.17: Executando o programa ex14cap3.exe.

www.juliobattisti.com.br

122

CAPTULO 2: ENTENDENDO O CLR


De diferente neste exemplo, em relao ao anterior, apenas o fato de termos utilizado uma classe do .NET Framework Class Library Environment.GetLogicalDrives( ), a qual retorna o nome (letra da unidade) de todos os drives lgicos do computador.

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.

Instrues de Salto (Jump)


As instrues de salto transferem, incondicionalmente, a execuo do programa para fora de um lao ou para um ponto especfico do programa. Por exemplo, podemos utilizar uma instruo break para sair de um lao while, mesmo que a condio do lao ainda no tenha se tornado falsa.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


programa. O C# desencoraja o uso do goto, aplicando algumas restries para a utilizao do mesmo. Por exemplo, no podemos utilizar goto para deslocar a execuo para dentro de um bloco de comandos, como por exemplo um for ou while.

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

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Operadores e Mais Operadores


Uma expresso formada por operadores e operandos. Os operadores de uma expresso indicam qual tipo de operao deve ser aplicada entre os operandos. Os exemplos mais conhecidos de operadores so os operadores aritmticos: adio (+), subtrao (-), multiplicao (*) e diviso (/). Neste tpico vamos estudar os seguintes tipos de operadores: Built-in Aritmticos Relacionais e Lgicos Atribuio (Assignment) Quanto ao nmero de operandos, os operadores tambm podem ser classificados em:

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;

y=22; x = (y<25) ? 12 : 18;

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

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#


int num1 = 23; int num2 = 32; int soma = num1 + num2;

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:

Figura 4.1: Erro de compilao.


Para que o nosso exemplo possa funcionar precisamos fazer uma converso explcita, conforme indicado a seguir:
short nums1 = 10; short nums2 = 17; short soma = (short) (nums1+nums2);

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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;

J o operador unrio menos (-) inverte o sinal de um nmero. Considere o exemplo:


int x = -10; int y = -x; Console.WriteLine(y);

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.

Listagem 4.1 Concatenando strings ex1cap4.cs.


using System; using System.Windows.Forms;

class ex1cap4 { // Exemplo1 Captulo 4. // Concatenando Strings. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

www.juliobattisti.com.br

128

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#

public static void Main() { // Declarao das variveis.

string nome; string sobrenome; string nomecompleto;

// O usurio informa o nome e o sobrenome.

Console.Write(Digite o seu nome ->); nome = Console.ReadLine();

Console.Write(Digite o seu sobrenome ->); sobrenome = Console.ReadLine();

// Utilizando o operador + para concatenar // o nome e o sobrenome.

nomecompleto = nome + + sobrenome;

// Exibio dos resultados.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 4.2: Executando o programa ex1cap4.exe.


Utilizamos o operador + para fazer a concatenao do nome, um espao em branco ( ) e do sobrenome.

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++;

Quais os valores de x e y aps a execuo destes comandos?


x vale 11 y vale 10

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;

Quais os valores de x e y aps a execuo destes comandos?


x vale 11 y vale 11

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

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#

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;

Quais os valores de x e y aps a execuo destes comandos?


x vale 9 y vale 10

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;

Quais os valores de x e y aps a execuo destes comandos?


x vale 9 y vale 9

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.

Operadores Relacionais e Lgicos


Os operadores relacionais so utilizados, principalmente, em testes nas estruturas de controle do C#. Neste tipo de teste so comparados dois valores e retornado True ou False. J os operadores lgicos so utilizados para operaes do tipo AND, OR, etc. Na Tabela 4.2 temos os principais operadores relacionais.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Operador <= >=

Exemplo x <= y x >= y

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

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#


Neste exemplo, como um dos testes verdadeiro (3==3), 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 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.

Operadores de Atribuio (Assignment)


Temos operadores de atribuio simples e compostos. Temos um nico operador de atribuio simples que a igualdade (=), utilizado para atribuir um valor a uma varivel ou o valor de uma varivel outra varivel, conforme exemplo a seguir:
int x; int y; x = 123; y = x;

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Neste caso, o valor de x ser 15, pois o ltimo comando x += y equivalente : x = x + y. Na Tabela 4.4 temos os principais operadores de atribuio compostos.

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

Listagem 4.2 Precedncia de operadores. ex2cap4.cs


using System;

class ex2cap4

{ // Exemplo 2 Captulo 4.

www.juliobattisti.com.br

134

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#

// Precedncia de operadores. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Declarao das variveis.

int i=5; int j=21; int k=10; int l=20; int m=4; int expr1; int expr2; int expr3;

// Alguns clculos

expr1 = i++*j+k-l*m++; expr2 = (i++*j)+(k-l)*m++; expr3 = (i++*j+k)-l*m++;

// Exibio dos resultados.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Digite o exemplo da Listagem 4.2 e salve o mesmo em um arquivo chamado ex2cap4.cs, na pasta C:\ExCsharp\cap4. Compile e execute o exemplo da Listagem 4.2. Voc obter os resultados indicados na Figura 4.3.

Figura 4.3: Executando o programa ex2cap4.exe.


Observe que temos a mesma expresso, e apenas utilizamos parnteses para mudar a ordem de execuo dos elementos da expresso. Vamos analisar a primeira expresso, na qual resultou em expr1 = 35.
expr1 = i++*j+k-l*m++;

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

Com isso nossa expresso fica:


expr1 = 5*21+10-20*4

Primeiro resolvo as multiplicaes:


expr1 = 105+10-80

no que obtemos:
expr1 = 35

www.juliobattisti.com.br

136

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#


e, aps o clculo da expresso, os valores de i e m so incrementados, passando a valer:
i=6 j=21 k=10 l=20 m=5

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.

Para Comear um Exemplo Simples


Vamos aprender sobre a estrutura de uma classe criando uma. Criaremos uma classe extremamente simples. Daremos o nome de ClasseEx1. O nico componente que a nossa classe ir conter ser a definio de duas variveis: um inteiro e uma string. No programa principal iremos criar uma instncia da classe e utilizar as variveis da mesma. Considere o exemplo da Listagem 4.3.

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.

public int contador = 0; public string teste = ; }

class Ex3cap4

{ // Exemplo 3 Captulo 4. // Criao de uma classe com dois membros. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Agora crio uma varivel do tipo ClasseEx1. // Esta varivel uma instncia da classe ClasseEx1. ClasseEx1 minhaclasse = new ClasseEx1();

//Definio de novos valores para os membros da classe.

minhaclasse.contador = 125; minhaclasse.teste = PRIMEIRA CLASSE COM O C#;

//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

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#


Digite o exemplo da Listagem 4.3 e salve o mesmo em um arquivo chamado ex3cap4.cs, na pasta C:\ExCsharp\cap4. Compile e execute o exemplo da Listagem 4.3. Voc obter os resultados indicados na Figura 4.4.

Figura 4.4: Executando o programa ex3cap4.exe.


Temos vrios detalhes importantes a considerar neste exemplo. Em primeiro lugar a definio da classe ClasseEx1, a qual feita no seguinte trecho de cdigo. Para definir uma nova classe utilizamos a palavra class. A definio dos elementos da classe acontece dentro do abre e fecha chaves { }.
class ClasseEx1 { //Definio dos membros da classe.

public int contador = 0; public string teste = ; }

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Esta a classe principal do nosso exemplo, a qual conter uma funo Main( ). Dentro da funo Main( ) criamos um objeto chamado minhaclasse. Observe que este objeto definido como sendo do tipo da classe criada anteriormente, ou seja, o objeto minhaclasse baseado na classe ClasseEx1. A declarao e instanciao da varivel objeto minhaclasse feita na seguinte linha de cdigo:
ClasseEx1 minhaclasse = new ClasseEx1();

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#;

O restante do exemplo apenas para exibio dos resultados.

Membros de uma Classe


A seguir apresentamos uma descrio dos elementos que podem ser criados em uma classe, isto , dos possveis membros de uma classe.

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

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#

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).

Construtores e Destrutores de uma Classe


Ao criarmos uma classe podemos definir um mtodo que ser executado toda vez que uma instncia da classe for criada. Este mtodo especial chamado de Construtor (Constructor) da classe. Colocamos neste mtodo todo o cdigo que deve ser executado na criao da classe. Por exemplo, se estamos criando uma classe que possui mtodos para fazer pesquisas em um banco de dados do SQL Server 2000. No mtodo Construtor podemos incluir o cdigo que estabelece a conexo com o banco de dados. Para que a classe seja de uso genrico, podemos definir parmetros a serem passados para o mtodo Construtor, de tal forma que a conexo seja estabelecida de acordo com o valor dos parmetros passados para o mtodo construtor. Se no definirmos um mtodo construtor explicitamente, o Framework .NET define um mtodo construtor sem parmetros. No nosso exemplo anterior utilizamos o seguinte comando para criar uma instncia da classe ClasseEx1 para o objeto minhaclasse:
ClasseEx1 minhaclasse = new ClasseEx1();

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Observe que estamos passando um parmetro (10) para o mtodo construtor. A principal vantagem de utilizarmos um mtodo construtor personalizado que podemos garantir que o objeto seja instanciado corretamente, atravs da execuo do cdigo necessrio instanciao do objeto, no mtodo construtor do mesmo. Quando o usurio instancia um determinado objeto, o mtodo construtor do mesmo chamado e deve finalizar a sua execuo sem erros; caso contrrio o usurio no poder utilizar o objeto. Este comportamento garante que o cdigo de inicializao, contido no mtodo construtor do objeto, seja executado, antes que os demais membros do objeto possam ser utilizados. O mtodo construtor deve ter o mesmo nome da classe. Para provar que o mtodo construtor sempre executado, vamos considerar o exemplo da Listagem 4.4. Considere o exemplo da Listagem 4.4.

Listagem 4.4 Utilizando o mtodo construtor. Ex4cap4.cs


using System; class ClasseEx2 { // Definio do construtor da classe. // Observe que o nome do mtodo construtor // deve ter o mesmo nome da classe.

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(**************************************); }

public int contador = 0; public string teste = ; }

class Ex4cap4

www.juliobattisti.com.br

142

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#

// Exemplo 3 Captulo 4. // Criao de uma classe com dois membros. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// 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.

ClasseEx2 minhaclasse = new ClasseEx2();

} }

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.

Figura 4.5: Executando o programa ex4cap4.exe.

143

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


No nosso exemplo, no programa principal simplesmente criamos um objeto do tipo ClasseEx2. Ao instanciarmos o objeto, foi disparado o seu mtodo construtor, o qual exibe algumas informaes na tela. Alm de um mtodo construtor podemos criar um mtodo destrutor. O mtodo destrutor pode ser chamado para executar alguns comandos quando a referncia ao objeto deixar de existir, ou seja, os comandos do mtodo destrutor so chamados quando do encerramento do objeto. Para criar um mtodo destrutor basta criar um mtodo com o mesmo nome da classe, porm precedido de um til (~). Por exemplo, para criar um mtodo destrutor para a classe ClasseEx2( ), criada no exemplo anterior, utilizamos a seguinte sintaxe:
~ClasseEx2() { comando1; comando2; ... comandon; }

Modificadores Para os Membros de uma Classe


Conforme descrito anteriormente existem modificadores que definem a visibilidade dos membros de uma classe. Por exemplo, o modificador public torna o membro acessvel de fora da classe; j o modificador private torna o membro disponvel somente dentro da prpria classe. A seguir uma descrio dos principais modificadores. public: Torna o membro acessvel de fora da definio da classe. protected: O membro no pode ser acessado fora da classe, porm o membro est disponvel para outras classes derivadas da classe base. private: O membro no pode ser acessado fora da classe, nem mesmo por outras classes derivadas da classe base. internal: O membro somente visvel na unidade de cdigo onde o mesmo est definido. um meio-termo entre public e protected, uma vez que o membro pode ser acessado por todas as classes definidas na mesma unidade (pblico para as classes da mesma unidade), porm no pode ser acessado por classes definidas em outras unidades (protected para unidades definidas em outras unidades).

Adicionando Funcionalidade a uma Classe Mtodos


A funcionalidade de uma classe definida atravs da criao de mtodos. Um mtodo pode receber parmetros e retornar um determinado resultado. Vamos fazer um pequeno estudo dos tipos de parmetros que podem ser definidos para um determinado mtodo.

www.juliobattisti.com.br

144

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#


Podemos definir os seguintes tipos de parmetros: Parmetros In: Este tipo de parmetro o mais conhecido. utilizado para passarmos o valor de uma varivel para o mtodo. Um inconveniente deste tipo de parmetro que o mtodo no pode alterar o valor da varivel, uma vez que somente foi passado o valor da varivel e no uma referncia para a mesma. O parmetro definido no mtodo inicializado com uma cpia do valor da varivel passada como parmetro na chamada do mtodo. Mais uma vez vamos fazer uso de um exemplo para entendermos a criao de mtodos e a utilizao de parmetros in. Considere o exemplo da Listagem 4.5.

Listagem 4.5 Utilizando parmetro do tipo in. Ex5cap4.cs


using System; public class ClasseEx3 { // Definimos um mtodo para calcular o cubo de // uma varivel passada como parmetro para o mtodo.

public int calcula_cubo(int valor) { // Crio uma varivel local do tipo int. // Atribuo o valor do parmetro valor para a // varivel local.

int auxint; auxint = valor;

// Altero o valor do parmetro recebido.

valor = 6;

return auxint*auxint*auxint; }

class Ex5cap4

145

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

// 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

public static void Main() {

// Agora crio uma varivel do tipo ClasseEx3. // Esta varivel uma instncia da classe ClasseEx3.

ClasseEx3 minhaclasse = new ClasseEx3();

// Defino uma varivel do tipo int e chamo o mtodo // calcula_cubo, da classe minhaclasse, passando o // valor inteiro como parmetro.

int valor;

// Solicito que o usurio digite um valor inteiro.

Console.Write(Digite um nmero inteiro ->); string aux1 = Console.ReadLine(); valor = Convert.ToInt32(aux1);

// Exibio do resultado.

Console.WriteLine(*****************************************); Console.WriteLine(O NMERO DIGITADO FOI -> {0},valor);

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

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#


Digite o exemplo da Listagem 4.5 e salve o mesmo em um arquivo chamado ex5cap4.cs, na pasta C:\ExCsharp\cap4. Compile e execute o exemplo da Listagem 4.5. Voc obter os resultados indicados na Figura 4.6.

Figura 4.6: Executando o programa ex5cap4.exe.


Temos muitos detalhes interessantes a serem comentados no cdigo deste exemplo. Vamos iniciar pela definio de um mtodo para calcular o cubo de um nmero passado como parmetro. Isso feito pelo trecho de cdigo a seguir:
// Definimos um mtodo para calcular o cubo de // uma varivel passada como parmetro para o mtodo.

public int calcula_cubo(int valor) { // Crio uma varivel local do tipo int. // Atribuo o valor do parmetro valor para a // varivel local.

int auxint; auxint = valor;

// Altero o valor do parmetro recebido.

valor = 6;

return auxint*auxint*auxint; }

147

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


O mtodo recebe um parmetro do tipo inteiro chamado valor. Como o parmetro passado por valor, o mtodo recebe uma cpia do valor da varivel e no uma referncia para a mesma. Neste caso temos um parmetro in. Dentro do mtodo declaramos uma varivel do tipo int chamada auxint. Atribumos o valor recebido como parmetro para a varivel auxint, atravs do comando:
auxint = valor;

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.

Listagem 4.6 Utilizando parmetro do tipo ref. Ex6cap4.cs


using System; public class ClasseEx4 { // Definimos um mtodo para calcular o cubo de // uma varivel passada como parmetro para o mtodo.

public int calcula_cubo(ref int valor) {

www.juliobattisti.com.br

148

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#

// Crio uma varivel local do tipo int. // Atribuo o valor do parmetro valor para a // varivel local.

int auxint; auxint = valor;

// Altero o valor do parmetro recebido.

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

public static void Main() {

// Agora crio uma varivel do tipo ClasseEx4. // Esta varivel uma instncia da classe ClasseEx4.

ClasseEx4 minhaclasse = new ClasseEx4();

// Defino uma varivel do tipo int e chamo o mtodo // calcula_cubo, da classe minhaclasse, passando o

149

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

// valor inteiro como parmetro.

int valor;

// Solicito que o usurio digite um valor inteiro.

Console.Write(Digite um nmero inteiro ->); string aux1 = Console.ReadLine(); valor = Convert.ToInt32(aux1);

// Exibio do resultado.

Console.WriteLine(*****************************************); Console.WriteLine(O NMERO DIGITADO FOI -> {0},valor);

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.

Figura 4.7: Executando o programa ex6cap4.exe.

www.juliobattisti.com.br

150

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#


Vamos comentar as diferenas em relao ao exemplo anterior. Em primeiro lugar, na definio do mtodo calcula_cubo, utilizamos a palavra ref para definir que o parmetro ser passado por referncia, conforme indicado no trecho a seguir:
public int calcula_cubo(ref int valor) { // Crio uma varivel local do tipo int. // Atribuo o valor do parmetro valor para a // varivel local.

int auxint; auxint = valor;

// Altero o valor do parmetro recebido.

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.

public void calcula_cubo(int valor, out int valoraocubo) { valoraocubo = valor*valor*valor; }

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

public static void Main() {

// Agora crio uma varivel do tipo ClasseEx4. // Esta varivel uma instncia da classe ClasseEx4.

ClasseEx4 minhaclasse = new 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

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#

int valor; int valoraocubo;

// Solicito que o usurio digite um valor inteiro.

Console.Write(Digite um nmero inteiro ->); string aux1 = Console.ReadLine(); valor = Convert.ToInt32(aux1);

// 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(O NMERO DIGITADO FOI -> {0},valor);

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 4.8 Executando o programa ex7cap4.exe.


Novamente mudamos o mtodo calcula_cubo. Agora o mtodo recebe um parmetro inteiro por valor e retorna o cubo deste parmetro atravs do parmetro valoraocubo. O parmetro valoraocubo definido como um parmetro de retorno ou sada (out), pelo uso da palavra out. O valor que deve ser retornado atribudo ao parmetro valoraocubo pelo cdigo do mtodo, conforme indicado no fragmento de cdigo a seguir:
public void calcula_cubo(int valor, out int valoraocubo) {

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);

O restante do programa simplesmente a exibio dos resultados obtidos.

www.juliobattisti.com.br

154

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#

O Polimorfismo Posto em Prtica Override


Pelo princpio do Polimorfismo em uma classe derivada podemos sobrescrever (override), isto , redefinir um ou mais mtodos da classe base, desde que ao criar a classe bsica o mtodo tenha sido definido com permisso para ser redefinido. Para criar um mtodo e permitir que o mesmo seja redefinido em uma classe derivada, utilizamos a palavra virtual. Considere o exemplo de definio a seguir:
virtual void metodo_que_pode_ser_redefinido(parmetros)

Na classe derivada, para redefinirmos o mtodo utilizamos a palavra override:


override void metodo_que_pode_ser_redefinido(parmetros)

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.

Listagem 4.8 Fazendo o override de mtodos no C#. Ex8cap4.cs


using System; public class ClasseFuncionarios { // Definimos um mtodo para calcular o salrio // com base no cargo que foi passado como parmetro.

public virtual int calcula_salario(string cargo) {

switch (cargo) { case gerente: return 2500; case diretor: return 4500; case funcionario: return 1500; default: return 1500; } }

155

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


}

// Agora crio uma classe derivada de ClasseFuncionarios // chamada HerdaDeFuncionarios. // Nesta nova classe redefino o mtodo calcula_salario

public class HerdaDeFuncionarios:ClasseFuncionarios { // Vamos redefinir o mtodo para calcular o salrio

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

{ // Exemplo 8 Captulo 4. // Exemplo de override de mtodo. // Por: Jlio Battisti

www.juliobattisti.com.br

156

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#


// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Crio um objeto FuncionarioOriginal baseado na classe // ClasseFuncionarios.

ClasseFuncionarios FuncionarioOriginal = new ClasseFuncionarios();

// Chamo o mtodo originalmente definido na classe // Passando como parmetro gerente

String aux1 = gerente;

Console.WriteLine(********************************************); Console.WriteLine(RESULTADOS DO MTODO ORIGINAL); Console.WriteLine(VALOR DO SALRIO PARA {0}, -> {1},aux1,FuncionarioOriginal.calcula_salario(aux1));

// Crio um objeto FuncionarioModificado baseado na classe // HerdaFuncionarios.

HerdaDeFuncionarios FuncionarioModificado = new HerdaDeFuncionarios();

// 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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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.

Figura 4.9: Executando o programa ex8cap4.exe.


Vamos analisar o cdigo da Listagem 4.8. Inicialmente criamos uma classe ClasseFuncionarios, na qual criamos um mtodo chamado calcula_salario. Este mtodo recebe um parmetro do tipo string e retorna o valor do salrio correspondente ao cargo passado como parmetro para o mtodo. Utilizamos a palavra virtual para informar que este mtodo pode ser redefinido (override) em classes derivadas. Em seguida criamos uma classe chamada HerdaDeFuncionarios. Esta classe baseada na classe Classefuncionarios. Observe que para definir uma classe como sendo baseada em outra, utilizamos a sintaxe indicada a seguir:
public class HerdaDeFuncionarios:ClasseFuncionarios

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

CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#


public class HerdaDeFuncionarios:ClasseFuncionarios { // Vamos redefinir o mtodo para calcular o salrio

public override int calcula_salario(string cargo) {

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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

CAPTULO 5: TPICOS DIVERSOS EM C#

A Classe System.Math Operaes Matemticas


A classe System.Math fornece mtodos para operaes trigonomtricas, logartmicas e outras funes comumente utilizadas na matemtica. Alm dos mtodos, temos duas propriedades, as quais sero descritas na seqncia.

Campos da Classe System.Math


Temos dois campos, conforme descrito a seguir. E: Este campo retorna o valor do nmero e, o qual a base para os logartmos neperianos. O valor do nmero e 2,7182818284590452354. O valor retornado do tipo double. PI: Este campo retorna o valor da constante PI, cujo valor 3.14159265358979323846. O valor retornado do tipo double. Vamos apresentar um exemplo que ilustra a utilizao da classe System.Math e dos campos E e PI. Observe o exemplo da Listagem 5.1.

Listagem 5.1 Campos da classe System.Math ex1cap5.cs


using System;

class ex1cap5 { // Exemplo1 - Captulo 5. // Campos da classe System.Math. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// 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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Digite o exemplo da Listagem 5.1 e salve o mesmo em um arquivo chamado ex1cap5.cs, na pasta C:\ExCsharp\ cap5. Compile e execute o exemplo da Listagem 5.1. Voc obter os resultados indicados na Figura 5.1.

Figura 5.1: Executando o programa ex1cap5.exe.


Como a classe Math faz parte do namespace System, simplesmente utilizamos Math. E para fazer referncia ao campo E da classe Math. O mesmo vlido para o campo PI. Se utilizarmos a nomenclatura completa, conforme indicado no trecho de cdigo a seguir, o resultado ser o mesmo:
Console.WriteLine(VALOR DO CAMPO E -> {0},System.Math.E); Console.WriteLine(VALOR DO CAMPO PI -> {0},System.Math.PI);

Mtodos da Classe System.Math


Neste tpico trataremos dos diversos mtodos da classe System.Math. Mtodo Abs System.Math.Abs(nmero): Este mtodo retorna o valor absoluto do nmero, ou seja, o mdulo 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.Abs(-32.15) retorna 32,15.

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

CAPTULO 5: TPICOS DIVERSOS EM C#


Ex:
System.Math.Acos(-1) System.Math.Acos(-0.5) System.Math.Acos(0) System.Math.Acos(0.5) System.Math.Acos(1)

Vamos a um exemplo completo no qual utilizamos os mtodos Abs e Acos. Considere o exemplo da Listagem 5.2

Listagem 5.2 Mtodos Abs e Acos da classe Math ex2cap5.cs


using System;

class ex2cap5 { // Exemplo2 - Captulo 5. // Mtodos da classe System.Math. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Exibio dos valores dos campos E e PI.

Console.WriteLine(*************************************************); Console.WriteLine(VALOR ABSOLUTO DE -32.10 -> {0},Math.Abs(-32.10));

Console.WriteLine(*************************************************); Console.WriteLine(UTILIZAO DO MTODO ACOS);

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Console.WriteLine(*************************************************);

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

CAPTULO 5: TPICOS DIVERSOS EM C#

Figura 5.2: Executando o programa ex2cap5.exe.


Se no exemplo da Listagem 5.2, simplesmente trocssemos Acos por Asin, obteramos os resultados indicados na Figura 5.3.

Figura 5.3: Executando o programa ex2cap5.exe, aps trocar Acos por Asin.

165

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Mtodo Atan System.Math.Atan(nmero): Este mtodo retorna o valor do ngulo em que a tangente o nmero passado como parmetro. O valor do ngulo retornado est em radianos. Ex:
System.Math.Atan(0) System.Math.Atan(2)

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

CAPTULO 5: TPICOS DIVERSOS EM C#


Mtodo Log System.Math. Log(nmero) ou System.Math.Log(nmero,base): Se o mtodo Log receber um nico parmetro, ir retornar o logaritmo natural (na base e) do nmero passado como parmetro. Tambm podemos passar dois parmetros, neste caso o primeiro parmetro o nmero e o segundo, a base. Ex:
System.Math. Log(10) System.Math. Log(100,10) System.Math. Log(16,2) retorna 2,30258509299405 retorna 2 retorna 4

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Nos exemplos a seguir utilizamos o campo PI para passar os valores em radianos para o mtodo Sin. Ex:
System.Math.Sin(Math.PI/2) retorna 1 System.Math.Sin(0) retorna 0

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.

mtodo Tan. Ex:


System.Math.Tan(Math.PI/3) System.Math.Tan(0) retorna 1,73205080756888 retorna 0

Vamos a um exemplo completo no qual utilizamos todos os mtodos matemticos apresentados neste item. Considere o exemplo da Listagem 5.3

Listagem 5.3 Mtodos da classe Math ex3cap5.cs


using System;

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

CAPTULO 5: TPICOS DIVERSOS EM C#

public static void Main() {

// Exibio dos valores dos campos E e PI.

Console.WriteLine(*************************************************); Console.WriteLine(VALOR ABSOLUTO DE -32.10 -> {0},Math.Abs(-32.10));

Console.WriteLine(*************************************************); Console.WriteLine(UTILIZAO DO MTODO Asin);

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(*************************************************); Console.WriteLine(CONVERSO DOS NGULOS PARA GRAUS);

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Console.WriteLine(ARREDONDA UTILIZ. Ceiling -> {0},Math.Ceiling(-1.9999));

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(*************************************************); Console.WriteLine(MXIMO ENTRE -5 E -6 Console.WriteLine(MXIMO ENTRE 5 E 6 -> {0},Math.Max(-5,-6)); -> {0},Math.Max(5,6));

Console.WriteLine(*************************************************);

www.juliobattisti.com.br

170

CAPTULO 5: TPICOS DIVERSOS EM C#


Console.WriteLine(MNIMO ENTRE -5 E -6 Console.WriteLine(MNIMO ENTRE 5 E 6 -> {0},Math.Min(-5,-6)); -> {0},Math.Min(5,6));

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


SADA DO PROGRAMA ex3cap5.exe:

************************************************* 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

************************************************* ************************************************* e elevado ao quadrado e elevado na zero -> -> 7,38905609893065 1

*************************************************

www.juliobattisti.com.br

172

CAPTULO 5: TPICOS DIVERSOS EM C#

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

************************************************* LOGARITMO DE 10 LOGARITMO DE 100 LOGARITMO DE 1000 -> 1 -> 2 -> 3

************************************************* MXIMO ENTRE -5 E -6 MXIMO ENTRE 5 E 6 -> -5 -> 6

************************************************* MNIMO ENTRE -5 E -6 MNIMO ENTRE 5 E 6 -> -6 -> 5

************************************************* 2 ELEVADO NA 2 2 ELEVADO NA 3 2 ELEVADO NA 4 5 ELEVADO NA 2 -> 4 -> 8 -> 16 -> 25

************************************************* ROUND EM 2,49 ROUND EM 2,4599 10,4987564 COM 3 CASAS -> 2 -> 2 -> 10,499

************************************************* SENO SENO PARA 90 graus PI/2-> 1 PARA 0 graus -> 0

************************************************* SINAL PARA -32,15 -> -1

173

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

SINAL PARA

32,15

-> 1

************************************************* RAIZ QUADRADA DE 25 RAIZ QUADRADA DE 144 -> 5 -> 12

************************************************* TANENTE PARA TANENTE PARA 60 0 graus PI/3 graus -> 1,73205080756888 -> 0 -> 1,63317787283838E+16

TANENTE PARA 180 graus PI

A Estrutura System.DateTime Datas e Horas


No namespace System temos uma estrutura chamada System.DateTime. Para realizar operaes com valores de data e hora utilizamos os campos, propriedades e mtodos desta estrutura. A estrutura System.DateTime bastante flexvel. S para se ter uma idia, existem sete construtores diferentes para esta estrutura. Vamos apresentar um exemplo onde utilizamos os principais construtores da estrutura System.DateTime. Considere o exemplo da Listagem 5.4

Listagem 5.4 Construtores de System.DateTime ex4cap5.cs


using System;

class ex4cap5 { // Exemplo 4 - Captulo 5. // Construtores de System.DateTime. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Utilizao de diversos construtores de System.DateTime.

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

CAPTULO 5: TPICOS DIVERSOS EM C#


//Exibio dos resultados Console.WriteLine(****************************************); Console.WriteLine(DATA E HORA ATUAIS Console.WriteLine(CONSTRUTOR -dia,ms,ano Console.WriteLine(CONSTRUTOR -milisegundos Console.WriteLine(CONSTRUTOR -d,m,a,h,min,seg -> {0},DateTime.Now); -> {0},constrex1); -> {0},constrex2); -> {0},constrex3);

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.

Figura 5.4: Executando o programa ex4cap5.exe.


Neste exemplo utilizamos os trs construtores mais utilizados. Observe o cdigo a seguir:
DateTime constrex1 = new DateTime(2001,7,21);

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


DateTime constrex3 = new DateTime(2001,7,21,16,30,45);

Neste exemplo utilizamos um construtor no qual so passados seis valores: ano, ms, dia, hora, minuto e segundo.

Campos da Estrutura System.DateTime


A estrutura DateTime tem dois campos: DateTime.MaxValue: Este campo retorna o valor da maior data/hora suportada pela estrutura DateTime. O valor retornado : 31/12/9999 23:59:59, para o sistema de Data/Hora do Brasil. DateTime.MinValue: Este campo retorna o valor da menor data/hora suportada pela estrutura DateTime. O valor retornado : 1/1/0001 00:00:00, para o sistema de Data/Hora do Brasil.

Propriedades da Estrutura System.DateTime


Na Tabela 5.1 temos a descrio das propriedades da estrutura System.DateTime.

Tabela 5.1 Propriedades da estrutura System.DateTime

Propriedade Date Day DayOfWeek

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.

DayOfYear Hour Minute Month Now Second Year

www.juliobattisti.com.br

176

CAPTULO 5: TPICOS DIVERSOS EM C#


Vamos apresentar um exemplo no qual utilizamos as propriedades da estrutura System.DateTime. Considere o exemplo da Listagem 5.5

Listagem 5.5 Propriedades de System.DateTime ex5cap5.cs


using System;

class ex5cap5 { // Exemplo 5 - Captulo 5. // Propriedades de System.Date. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Utilizao de diversos construtores de System.DateTime.

DateTime constrex1 = DateTime.Now;

//Exibio dos resultados

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Digite o exemplo da Listagem 5.5 e salve o mesmo em um arquivo chamado ex5cap5.cs, na pasta C:\ExCsharp\cap5. Compile e execute o exemplo da Listagem 5.5. Voc obter os resultados indicados na Figura 5.5.

Figura 5.5: Executando o programa ex5cap5.exe.

O Namespace System.IO Operaes com Arquivos e Pastas


Na verso do ASP Active Server Pages, que acompanha o Windows 2000 ASP 3.0, temos um objeto chamado FileSystemObject. Com o uso deste objeto temos acesso ao sistema de arquivos do servidor. Existem diversos mtodos que possibilitam obter informaes sobre drives, pastas e arquivos. O Framework .NET fornece o namespace System.IO, no qual encontramos diversas classes para operaes com drives, pastas e arquivos. Nesta seo apresentaremos alguns mtodos e propriedades das classes System.IO.File e System.IO.FileInfo. Nos demais captulos deste livro vamos utilizar novamente estas classes, alm da classe System.IO.Directory.

A Classe System.IO.File Operaes com Arquivos


A classe System.IO.File fornece mtodos para criar, copiar, mover e abrir arquivos. Quando criamos um novo arquivo, utilizando o mtodo para criao de arquivos da classe File, so definidas permisses de acesso total para todos os usurios, por padro. o famoso Everyone -> Full Control. Alguns mtodos recebem caminhos como parmetros. Existem vrias maneiras de especificar um caminho. Pode ser o caminho completo: C:\\Documentos\relatorio.doc. Pode ser o caminho para uma pasta: C:\\Documentos. Pode ser um caminho relativo, em relao ao diretrio atual: Documentos\\Fiscais\2001. Pode ser um caminho de rede no formato UNC (Universal Naming Convention). Por exemplo, para usar o formato UNC para acessar um arquivo chamado vendas.doc, que est em uma pasta compartilhada chamada Vendas em um servidor chamado vendassrv,

www.juliobattisti.com.br

178

CAPTULO 5: TPICOS DIVERSOS EM C#


devemos utilizar o seguinte caminho: \\\\vendassrv\vendas\vendas.doc. Todo caminho UNC inicia com duas barras, porm a barra invertida considerada um caractere especial e todo caractere especial deve ser precedido de uma barra invertida. O mesmo comentrio vlido para os casos anteriores, onde ao invs de uma estamos utilizando duas barras. Por isso cada barra invertida representada duas vezes.

Mtodos da Classe System.IO.File


Na Tabela 5.2 temos a descrio dos principais mtodos da classe System.IO.File.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Considere o exemplo da Listagem 5.6

Listagem 5.6 Mtodos da classe System.IO.File ex6cap5.cs


using System; using System.IO;

class ex6cap5 { // Exemplo 6 - Captulo 5. // Mtodos de System.IO.File // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Vamos copiar o arquivo C:\autoexec.bat // para C:\teste.bat

File.Copy(C:\\autoexec.bat,C:\\teste.bat);

// Agora passaremos a utilizar alguns mtodos.

// Vamos testar se o arquivo teste.bat foi criado. Console.WriteLine(Existe teste.bat ? {0},File.Exists(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));

// Exibe a data e hora da ltima gravao no arquivo teste.bat

www.juliobattisti.com.br

180

CAPTULO 5: TPICOS DIVERSOS EM C#

Console.WriteLine(teste.bat foi gravado em -> {0},File.GetLastWriteTime(C:\\teste.bat)); // Deleto o arquivo teste.bat File.Delete(C:\\teste.bat);

} }

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.

Figura 5.6: Executando o programa ex6cap5.exe.

IMPORTANTE: Se o arquivo C:\teste.bat j existir, ser gerado o erro de execuo indicado nas Figuras 5.7 e 5.8.

Figura 5.7: Erro gerado se o arquivo C:\teste.bat j existir.

181

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 5.8: Erro gerado se o arquivo C:\teste.bat j existir.


Tambm importante salientar que, para termos acesso classe File, fizemos referncia ao namespace System.IO no incio do programa:
using System.IO;

Se no tivssemos feito esta referncia, ao invs de utilizar simplesmente File, teramos que utilizar o caminho completo:
System.IO.File

A Classe System.IO.FileInfo Informaes Sobre Arquivos


A classe System.IO.FileInfo fornece algumas propriedades que retornam informaes sobre um arquivo, tais como: nome do arquivo, nome do diretrio, caminho completo e tamanho. As consideraes sobre o caminho a ser fornecido como parmetro so as mesmas que foram feitas para a classe System.IO.File.

Propriedades da Classe System.IO.FileInfo


Na Tabela 5.3 temos a descrio das principais propriedades da classe System.IO.FileInfo.

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

CAPTULO 5: TPICOS DIVERSOS EM C#

Propriedade Directory DirectoryName

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.

Listagem 5.7 Propriedades da classe System.IO.FileInfo ex7cap5.cs


using System; using System.IO;

class ex7cap5 { // Exemplo 7 - Captulo 5. // Propriedades de System.IO.FileInfo // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Vamos criar uma varivel meuarquivo, do tipo FileInfo, // a qual aponta para o arquivo C:\autoexec.bat

FileInfo meuarquivo = new FileInfo(C:\\autoexec.bat);

// Agora passaremos a utilizar algumas propriedades.

// Vamos verificar o nome do arquivo c:\autoexec.bat. Console.WriteLine(Nome -> {0},meuarquivo.Name);

// Vamos verificar o nome do arquivo c:\autoexec.bat.

183

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Console.WriteLine(Tamanho -> {0} bytes,meuarquivo.Length);

// Vamos verificar o nome do arquivo c:\autoexec.bat. Console.WriteLine(Caminho completo -> {0},meuarquivo.DirectoryName); } }

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.

Figura 5.9: Executando o programa ex7cap5.exe.

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

CAPTULO 5: TPICOS DIVERSOS EM C#


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 em nossos programas C#.

Utilizando try e catch


Para definir o tratamento de excees em nossos programas precisamos organizar os cdigos em um bloco try e um bloco catch. Dentro do bloco try colocamos o cdigo que pode gerar uma exceo por exemplo os comandos que faro a leitura de um arquivo no disquete e que, se o disquete no estiver no drive, ser gerada uma seo. O cdigo para o tratamento da exceo colocado dentro do bloco catch. Vamos apresentar um exemplo no qual utilizamos try e catch para fazer o tratamento de excees. O nosso programa solicita que o usurio digite dois nmeros. Depois, o programa faz a diviso dos nmeros e exibe o resultado. Para forar uma exceo vamos fornecer um valor zero para o segundo nmero, de tal forma que o programa, ao tentar fazer uma diviso por zero, ir gerar uma exceo. Considere o exemplo da Listagem 5.8.

Listagem 5.8 Tratamento de excees com try e catch ex8cap5.cs


using System;

class ex8cap5 { // Exemplo 8 - Captulo 5. // Tratamento de excees com try e catch. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Incio do bloco try. // Contm o cdigo que pode gerar a exceo.

try

185

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

// Declarao das variveis.

int divisao;

// Entrada dos valores de x e y

Console.Write(Digite o NUMERADOR ->); String Aux1=Console.ReadLine();

Console.Write(Digite o DENOMINADOR ->); String Aux2=Console.ReadLine();

// Clculo da diviso. divisao = Convert.ToInt32(Aux1) / Convert.ToInt32(Aux2);

// 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); }

// Final do bloco catch. } }

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

CAPTULO 5: TPICOS DIVERSOS EM C#

Figura 5.10: Executando, sem excees, o programa ex8cap5.exe.


Observe que o programa executa normalmente. Agora vamos forar uma exceo, e para isso digitaremos 0 para o segundo valor, forando uma diviso por zero. Vamos executar novamente o programa. Digite 10 para o primeiro valor e 0 para o segundo. Voc obter os resultados indicados na Figura 5.11. Neste segundo caso, ao tentar fazer uma diviso por zero, uma exceo ser gerada. Ao ser gerada a execuo, o cdigo do bloco catch ser executado. O bloco catch recebe um parmetro do tipo Exception. Exception uma classe do namespace System System.Exception. Uma das propriedades desta classe Message, a qual contm a mensagem associada com a exceo. No nosso exemplo a mensagem : Attempted to divide by zero, o que confirma a nossa tentativa de fazer uma diviso por zero.

Figura 5.11: Executando, forando uma exceo, o programa ex8cap5.exe.

187

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Existem classes que tratam excees mais especficas, como por exemplo: System.OutOfMemoryException System.OverFlowException System.NullReferenceException System.NotSupportedException System.NotImplementedException System.NotFiniteNumberException System.MissingMethodException System.MissingMemberException System.MissingFieldException System.MethodAccessException System.MemberAccessException System.InvalidProgramException System.InvalidOperationException System.InvalidCastException System.IndexOutOfRangeException System.FormatException System.FieldAccessException System.ExecutionEngineException System.EntryPointNotFoundException System.DuplicateWaitObjectException System.DllNotFoundException System.DivideByZeroException Vamos utilizar algumas destas classes nos demais captulos deste livro.

Utilizando try e finally


Em determinadas situaes queremos que um determinado bloco de cdigo seja executado, mesmo que no tenha sido gerada nenhuma exceo. Para que isso seja possvel podemos utilizar finally ao invs de catch. O cdigo dentro do bloco finally sempre executado, mesmo que no tenha sido gerada nenhuma exceo. Vamos modificar um pouco o exemplo anterior. Considere o exemplo da Listagem 5.9.

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

// Declarao das variveis.

int divisao;

// Entrada dos valores de x e y

Console.Write(Digite o NUMERADOR ->); String Aux1=Console.ReadLine();

Console.Write(Digite o DENOMINADOR ->); String Aux2=Console.ReadLine();

// Clculo da diviso.

divisao = Convert.ToInt32(Aux1) / Convert.ToInt32(Aux2);

// Exibio dos resultados.

189

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Console.WriteLine(O valor da DIVISO } // Final do bloco try.

-> {0},divisao);

// Incio do bloco finally. // Cdigo que ser executado mesmo que nenhuma exceo // seja gerada no bloco try.

finally

{ Console.WriteLine(CDIGO EXECUTADO TENHA OU NO SIDO GERADA UMA EXCEO); }

// Final do bloco 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.

Figura 5.12: Executando, sem excees, o programa ex9cap5.exe.

www.juliobattisti.com.br

190

CAPTULO 5: TPICOS DIVERSOS EM C#


Agora vamos forar uma exceo, e para isso digitaremos 0 para o segundo valor, forando uma diviso por zero. Vamos executar novamente o programa. Digite 10 para o primeiro valor e 0 para o segundo. Na Figura 5.13 aberta uma janela indicando que ocorreu uma exceo no programa. Neste caso, como no havia um bloco catch, a exceo no foi tratada. Por isso surgiu a janela indicada na Figura 5.13. D um clique em OK para fechar a janela de aviso e observe que o cdigo do bloco finally foi executado, mesmo tendo sido gerada uma exceo, conforme indicado pela Figura 5.14:

Figura 5.13: Aviso de que uma exceo foi gerada.

Figura 5.14: O cdigo do bloco finally sempre executado.

191

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Mas, se quisermos ter as duas coisas, ou seja: Cdigo para tratamento de excees. Cdigo que sempre executa. Neste caso temos que juntar os blocos catch e finally, em um arranjo conhecido como try catch finally. Vamos alterar o exemplo anterior para termos uma estrutura try catch finally, de tal forma que as excees sejam tratadas e tenhamos um cdigo que sempre executa no encerramento do programa. Considere o exemplo da Listagem 5.10.

Listagem 5.10 Tratamento de excees com try catch finally ex10cap5.cs


using System;

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

// Declarao das variveis.

int divisao;

// Entrada dos valores de x e y

Console.Write(Digite o NUMERADOR ->); String Aux1=Console.ReadLine();

www.juliobattisti.com.br

192

CAPTULO 5: TPICOS DIVERSOS EM C#

Console.Write(Digite o DENOMINADOR ->); String Aux2=Console.ReadLine();

// Clculo da diviso.

divisao = Convert.ToInt32(Aux1) / Convert.ToInt32(Aux2);

// 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); }

// Final do bloco catch.

// Incio do bloco finally. // Cdigo que ser executado mesmo que nenhuma exceo // seja gerada no bloco try.

finally

{ Console.WriteLine(CDIGO EXECUTADO TENHA OU NO SIDO GERADA UMA EXCEO); }

// Final do bloco finally.

} }

193

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Digite o exemplo da Listagem 5.10 e salve o mesmo em um arquivo chamado ex10cap5.cs, na pasta C:\ExCsharp\cap5. Compile e execute o exemplo da Listagem 5.10. Digite 10 para o numerador e 2 para o denominador. Voc obter os resultados indicados na Figura 5.15. Observe que o cdigo do bloco finally foi executado, mesmo sem ter sido gerada nenhuma exceo. Como no foi gerada exceo, o cdigo do bloco catch no foi executado.

Figura 5.15: Executando, sem excees, o programa ex10cap5.exe.


Agora vamos forar uma exceo, e para isso digitaremos 0 para o segundo valor, forando uma diviso por zero. Vamos executar novamente o programa. Digite 10 para o primeiro valor e 0 para o segundo. Na Figura 5.16 observamos que a exceo foi identificada e a mensagem respectiva foi emitida. Isto indica que o cdigo do bloco catch foi executado e, portanto, a exceo foi tratada. Tambm podemos observar que o cdigo do bloco finally foi executado, mesmo tendo sido gerada uma exceo.

Figura 5.16: Execuo, com excees, do programa ex10cap5.exe.

www.juliobattisti.com.br

194

CAPTULO 5: TPICOS DIVERSOS EM C#

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

PARTE

2
Fundamentos do ASP.NET

www.juliobattisti.com.br

196

CAPTULO 6: UMA INTRODUO AO ASP.NET

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

Mais uma Verso?


ASP, ASP 2.0, ASP 3.0 e agora ASP.NET.

197

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Menos de dois anos aps o lanamento do ASP 3.0, o qual faz parte do IIS 5.0 com o Windows 2000, a Microsoft lana mais uma verso da tecnologia ASP Active Server Pages. Na verdade no apenas o lanamento de mais uma verso. O ASP.NET est inserido em um contexto maior, que a iniciativa .NET da Microsoft. Alm de estar inserido no contexto do .NET, a tecnologia ASP.NET apresenta enormes diferenas em relao ao ASP 3.0, o que no permite que a caracterizemos simplesmente como um upgrade do ASP 3.0. A tecnologia ASP.NET segue os mesmos princpios do Framework .NET, cujo principal objetivo facilitar o desenvolvimento de aplicaes. No caso especfico do ASP.NET, aplicaes Web. Conforme veremos mais adiante, com ASP.NET as aplicaes Web passam a usufruir de todos os recursos do Framework .NET. A tecnologia ASP teve uma enorme aceitao por parte da comunidade de desenvolvedores. Para comprovar tal afirmao basta conferir o nmero de sites que utilizam ASP. Esta aceitao no se deve somente fora de mercado da Microsoft, mas tambm facilidade de desenvolvimento propiciada pela utilizao de ASP. Antes de falarmos sobre a nova verso ASP.NET, vamos ver exatamente o que a tecnologia de Active Server Pages da Microsoft.

Uma Introduo Tecnologia ASP


A Internet deixou de ser uma rede somente para pesquisas acadmicas e passou a ser conhecida no mundo inteiro quando recebeu uma interface grfica. Isso foi possvel graas ao desenvolvimento dos servidores Web, a utilizao do protocolo HTTP (Hypertext Transfer Protocol), da linguagem HTML (Hypertext Markup Language) e de um programa conhecido como Browser (Navegador). Com essa receita, estava formada a WWW World Wide Web ou simplesmente Web. O contedo dos sites ficava armazenado em arquivos de cdigo HTML (.htm ou .html) nos servidores Web ou servidores HTTP como tambm so conhecidos. O usurio utiliza um programa, o Browser, para acessar as pginas HTML. Com essa combinao, uma pgina HTML era capaz de exibir, alm de texto, elementos grficos. Com isso a internet passou a ser mais atraente e comeou a conquistar um nmero cada vez maior de usurios. Na Figura 6.1 temos uma viso geral dos elementos descritos.

Figura 6.1: Internet com contedo esttico.

www.juliobattisti.com.br

198

CAPTULO 6: UMA INTRODUO AO ASP.NET


O problema da linguagem HTML que a mesma fornece contedo esttico, isto , no dinmico. Vamos exemplificar. Se utilizamos o HTML para publicar uma lista de preos de um catlogo de produtos. Todo o contedo do catlogo com a lista de preos faz parte do prprio cdigo HTML. Cada vez que tivermos que alterar um preo temos que editar o arquivo HTML e salvar as alteraes. Somente aps fazermos isto que o usurio passar a ter acesso s modificaes. Com o crescimento da Internet e o uso cada vez maior da rede para operaes de comrcio, ficou claro que a tecnologia de pginas estticas do HTML no seria suficiente para a criao de sites e aplicaes Web que suportassem o Comrcio Eletrnico. Ento comearam a surgir tecnologias para a criao dinmica de contedo, a partir de informaes contidas em bancos de dados e outras fontes de informaes. A tecnologia pioneira foi a dobradinha CGI com a linguagem Perl. A Microsoft, como no poderia deixar de ser, resolveu entrar nesta briga. Em primeiro lugar lanou o seu prprio servidor Web, que o IIS Internet Information Services. Por ser gratuito e devido grande base Windows instalada, o IIS rapidamente foi adotado por uma grande parcela de sites. Com a verso 3 do IIS, a Microsoft lana a sua tecnologia para a criao de pginas dinmicas, o ASP 1.0 Active Server Pages 1.0. Com a tecnologia ASP, ao invs de pginas .htm ou .html, criamos pginas com a extenso .asp. Estas pginas contm, alm de cdigo HTML, o chamado cdigo ASP, o qual pode realizar uma srie de operaes que tornam as pginas dinmicas. Vamos utilizar o exemplo anterior, onde queramos construir um catlogo de preos. Com a tecnologia ASP, podemos fazer com que a pgina, ao ser carregada, busque a lista de preos em um banco de dados, monte uma pgina com estas informaes e retorne a pgina para o usurio, exibindo sempre os resultados mais atualizados. Na Figura 6.2 temos uma viso desta nova fase, com contedo dinmico.

Figura 6.2: Internet com contedo dinmico.


Alm de criar uma pgina que exibe as informaes mais atualizadas, podemos criar formulrios interativos, onde o usurio pode inserir o cdigo ou nome de um produto e enviar tais informaes para o servidor IIS. Uma pgina ASP

199

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


recebe estas informaes, conecta com um banco de dados e faz uma pesquisa utilizando os critrios passados pelo usurio. Uma vez encerrada a pesquisa, a pgina ASP retorna apenas os resultados que atendem os critrios da pesquisa. Observe que agora, alm de receber informaes da Internet, o usurio tambm pode enviar informaes. Vamos detalhar um pouco mais este processo.

Contedo Dinmico na Internet


Com o crescimento da Internet e a necessidade de constantes alteraes no contedo das pginas, surge uma segunda gerao de sites na Internet, capazes de entregar contedo sempre atualizado, alm de permitir que o usurio interaja com as pginas Web, enviando informaes e no apenas recebendo. Nesta fase surge a possibilidade de ligao das pginas HTML com o contedo de Bancos de dados. Conforme descrevemos no tpico anterior, a tecnologia pioneira para a criao de contedo dinmico foi a dobradinha CGI/Perl. No diagrama da Figura 6.2 temos uma viso geral deste processo. Pelo diagrama, podemos ver a possibilidade de o usurio enviar informaes para a Internet, e no apenas receber informaes. Isto possibilitou o desenvolvimento de uma srie de servios, simplesmente impossveis de criar, apenas com a utilizao de pginas criadas somente com HTML. Para enviar informaes, o usurio preenche os campos de um formulrio (o qual criado com a utilizao de HTML) e, ao clicar em um boto Enviar, os dados so enviados para o site da Web. Ao chegar no servidor Web, estes dados precisam ser recebidos por um programa capaz de entender o formato dos dados e armazen-los em um Banco de dados. Os primeiros programas, capazes de realizar esta tarefa, seguiam a especificao conhecida como CGI Common Gateway Interface. Muitas aplicaes Web foram desenvolvidas, utilizando-se a especificao CGI, sendo que vrias ainda continuam sendo utilizadas. A utilizao de Scripts desenvolvidos na linguagem Perl um exemplo de utilizao de CGI. O Script recebe os dados enviados pelo formulrio, decodifica estes dados e armazena o resultado em um Banco de dados. Embora bastante funcional, a utilizao de CGI comeou a apresentar alguns problemas, e com isso novas alternativas foram surgindo. Est fora do escopo deste livro, discutir os problemas da utilizao de CGI. Dentre as vrias alternativas que surgiram para a gerao de contedo dinmico, podemos citar a tecnologia de Active Server Pages, a qual faz parte do servidor Web IIS (Internet Information Services), da Microsoft. Podemos criar uma pgina ASP, capaz de receber os dados enviados por um formulrio e armazenar estes dados em um Banco de dados, como por exemplo o Microsoft Access ou o Microsoft SQL Server. Com a conexo de pginas com Bancos de dados, uma srie de possibilidades novas surgiu, como por exemplo: Criao de pginas para pesquisa em Banco de dados. Cadastro de usurios que acessam o site, bem como a entrega de contedo personalizado, de acordo com as preferncias do usurio. Por exemplo, ao entrar no site, o usurio informa um nome de usurio e senha, com o qual o mesmo foi previamente cadastrado. Com isso aberta uma pgina com opes e contedo personalizados, de acordo com preferncias especificadas pelo usurio.

www.juliobattisti.com.br

200

CAPTULO 6: UMA INTRODUO AO ASP.NET


Desenvolvimento de aplicaes residentes em servidores Web e acessveis atravs do Navegador. Devemos observar que estas aplicaes ainda eram limitadas e no possuam todas as funcionalidades das aplicaes convencionais, desenvolvidas para o ambiente Windows. Apesar das suas limitaes, um novo panorama desenhava-se na Internet, com a possibilidade da criao de sites mais dinmicos, atravs da conexo com Bancos de dados. Apenas para exemplificar o funcionamento de uma pesquisa em Banco de dados, atravs da Internet, observe a Figura 6.3.

Figura 6.3: Pesquisa em um Banco de dados, atravs da Internet.


Vamos analisar os passos executados, desde o momento em que o usurio preenche o critrio de pesquisa, at o momento em que o resultado da consulta retornado: O usurio acessa a pgina onde temos um formulrio para a digitao de um ou mais critrios de pesquisa. Por exemplo, pode ser uma consulta a uma base dos CEPs de todo o Brasil. O usurio poderia digitar o nome da Cidade, selecionar um Estado e digitar o nome ou parte do nome da Rua. Aps preencher o(s) critrio(s) de pesquisa, o usurio clica em um boto Enviar ou Pesquisar. Os dados digitados no formulrio so enviados para o servidor. Um Script CGI, ou uma pgina ASP, no servidor, recebe os dados enviados pelo usurio. Com estes dados, montado um comando (normalmente uma String SQL Structured Query Language), o qual vai efetuar a consulta no Banco de dados. Aps montado o comando, o mesmo enviado para o Servidor de Banco de dados (o qual pode ser uma mquina separada, ou pode estar instalado no prprio servidor Web). O Servidor de Banco de dados recebe o comando de pesquisa, localiza um ou mais registros que atendam o(s) critrio(s) de pesquisa e retorna o resultado para o Script CGI, ou para a Pgina ASP.

201

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Com o resultado retornado pelo Servidor de Banco de dados, o Script CGI, ou a Pgina ASP, monta uma pgina HTML, normalmente no formato de uma tabela, e envia esta pgina HTML de volta para o Navegador do cliente. Caso no seja encontrado nenhum registro que atenda o(s) critrio(s) especificado(s), retornada uma pgina com uma mensagem de que no foi encontrado nenhum registro. Veja que, ao mesmo tempo em que aumentaram as possibilidades de desenvolvimento, tambm aumentaram as complexidades a serem gerenciadas, tanto na criao de pginas, quanto no gerenciamento dos sites. Observe que ainda nem falamos de questes tais como segurana, proteo do Banco de dados contra acessos no autorizados, ou at mesmo ataques de Hackers tentando roubar informao ou corromper a informao do Banco de dados. A tecnologia ASP 3.0 possibilita a criao do formulrio de pesquisa descrito no nosso exemplo. Utilizando ASP 3.0 em conjunto com o padro COM/COM+ da Microsoft, podemos criar aplicaes Web de 3 ou mais camadas. Mas, se podemos criar aplicaes to sofisticadas e funcionais com ASP 3.0, porque precisamos de uma nova verso? Vamos responder a esta pergunta no prximo item, onde estaremos falando sobre as principais melhorias do ASP.NET em relao ao ASP 3.0. Nos demais captulos do livro vamos aprender a utilizar os novos recursos do ASP.NET.

Novidades e Melhorias do ASP.NET


Neste item vamos apresentar as novidades e vantagens do ASP.NET. Mais do que uma simples justificativa para uma nova verso, procuro demonstrar os benefcios de utilizarmos ASP.NET para a criao de aplicaes WEB.

Faz Parte do Framework .NET


Pode parecer bvio, mas nunca demais salientar este aspecto. ASP.NET parte integrante do Framework .NET, e desta maneira tem acesso a todos os benefcios da plataforma .NET. Em uma pgina ASP.NET temos acesso a todas as classes da biblioteca de classes do Framework .NET .NET Framework Class Library. Tambm temos acesso a um tipo comum de dados e a todos os benefcios do Framework .NET. S estes benefcios j justificam uma migrao do ASP 3.0 para o ASP.NET.

Suporte a Mltiplas Linguagens


Com as verses anteriores do ASP estvamos limitados praticamente a duas linguagens de Script: VBScript e JScript. Alm disso, por serem linguagens de Script as mesmas eram interpretadas, ou seja, ao carregar uma pgina ASP, o IIS precisa ler linha por linha de cdigo, interpretar e executar. Com ASP.NET podemos utilizar qualquer linguagem que esteja habilitada para o Framework .NET. Inicialmente so disponibilizadas as linguagens VB.NET, C# e JScript. Apesar do nome JScript, esta e as demais linguagens so compiladas, o que significa que toda pgina ASP.NET compilada antes de ser executada. Na primeira vez que uma pgina ASP.NET acessada, a mesma compilada em uma Classe do Framework .NET. A verso compilada mantida em Cache para melhorar o desempenho para os prximos acessos. Qualquer alterao na pgina automaticamente

www.juliobattisti.com.br

202

CAPTULO 6: UMA INTRODUO AO ASP.NET


detectada pelo Framework .NET; a pgina recompilada e a verso em Cache atualizada, fazendo com que o cliente tenha sempre acesso verso mais atualizada da pgina. Se no houver mudanas continua sendo utilizada a verso que est no Cache, o que torna a carga da pgina muito mais rpida. Alm disso, diversas empresas de Software j anunciaram que esto portando suas linguagens para que sejam compatveis com o Framework .NET. Desta maneira voc poder utilizar, para a criao de pginas ASP.NET, a linguagem com a qual est mais familiarizado, desde que a mesma esteja habilitada ao .NET. Voc prefere Delphi? Sem problemas. f do COBOL? Por que no?

Menos Cdigo Para Mais Trabalho


Com o ASP.NET temos acesso a uma srie de facilidades que diminuem a quantia de cdigo que o programador precisa escrever, principalmente no trato com funes bsicas. Estas funes bsicas, como a manuteno de estado entre chamadas de uma pgina, so responsabilidade do Framework .NET. Isso faz com que o programador tenha que desenvolver apenas a lgica da aplicao, sem ter que se preocupar com aspectos bsicos da Infra-estrutura. Uma srie de controles mais inteligentes e com melhor funcionalidade foi criada, os chamados Server controls. Estes controles fornecem grande funcionalidade com um mnimo de programao. Alguns artigos fazem referncia inteligncia dos server controls. Um dos aspectos considerados inteligentes que, no momento da carga da pgina, o controle detecta, por exemplo, se o navegador do cliente o Internet Explorer ou o Netscape Navigator e adapta o seu comportamento e exibio de acordo com o navegador do cliente. Com ASP tarefas simples, como por exemplo validar os dados digitados em formulrios, exigem a criao de cdigo especfico. Com os controles inteligentes do ASP.NET, fazer a validao simplesmente questo de configurar algumas propriedades do controle e pronto, a verificao ser feita no momento em que a pgina for acessada. Nos Captulos 7, 8 e 9 estaremos falando sobre os diversos controles disponveis. Daremos destaque especial s seguintes categorias de controles: HTML Server Controls. Validation Server Controls. Web Server Controls.

Separao Entre o Cdigo HTML e o Cdigo ASP


Esta uma das melhorias que eu mais aprecio. Com ASP 3.0 ou verses anteriores, ns tnhamos uma mistura (literalmente) entre o cdigo ASP e o cdigo HTML, o que torna o cdigo de difcil leitura e documentao. Apenas para exemplificar, vamos apresentar uma pgina ASP que faz conexo com um banco de dados do Microsoft Access e exibe todos os registros de uma determinada tabela do banco de dados. Os registros so exibidos na forma de uma tabela. O Cdigo HTML para a criao da tabela, que ser exibida para o usurio, gerado a partir de uma mescla entre cdigo ASP e cdigo HTML. Na Listagem 6.1 temos um exemplo de pgina ASP que faz conexo com um banco de dados do Microsoft Access.

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>

<BODY> <H1> <FONT color=navy>Clientes da Empresa ABC LTDA.</FONT> </H1>

<%

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 utilizando OLE-DB

O cdigo a seguir aparece em duas linhas por questo de espao, porm o mesmo deve ser digitado em uma nica linha.

conn.Open PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE=c:\meus documentos\nwind.mdb

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.

inst_sql=SELECT Clientes.CodigoCliente, Clientes.Cargo, Clientes.Endereco,Clientes.Fone FROM Clientes

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.

Set Clientes = Server.CreateObject(ADODB.Recordset)

www.juliobattisti.com.br

204

CAPTULO 6: UMA INTRODUO AO ASP.NET


Agora executamos a Instruo SQL retornando os registros da tabela Clientes.

Clientes.Open inst_sql, conn, 3, 3

Os dois ltimos parmetros sero discutidos no prximo Captulo.

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>

<TABLE bgColor=gray border=1 borderColor=navy cellPadding=1 cellSpacing=1 width=100%>

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


<%

Clientes.MoveNext loop %> </TABLE> </P> <HR> </BODY> </HTML>

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.

Figura 6.4: Pgina ASP de exemplo.

www.juliobattisti.com.br

206

CAPTULO 6: UMA INTRODUO AO ASP.NET


J com ASP.NET isto no acontece. A parte de apresentao da pgina separada da parte de processamento, isto , da parte onde est o cdigo responsvel pela lgica de processamento da pgina. Com isto estamos separando a lgica da apresentao, o que facilita a manuteno das pginas.

Maiores Facilidades Para Criao e Utilizao de Componentes


Esta mais uma das vantagens propiciadas pelo Framework .NET. Conforme descrevemos nos Captulos 1 e 2, a criao de componentes com o Framework .NET ficou muito mais fcil. Mais do que a criao, a distribuio e utilizao destes componentes ficou extremamente simplificada. No existe mais a necessidade de registrar um determinado componente como acontece com os componentes COM/COM+. Outra novidade importante a possibilidade de diferentes verses de um componente executarem em um mesmo servidor. possvel, inclusive, a execuo simultnea de diferentes verses de um mesmo componente, o que conhecido por execuo syde by syde. Ao facilitar a criao e utilizao de componentes, o Framework .NET incentiva a reutilizao de cdigo.

Compatibilidade com Qualquer Navegador


O resultado da execuo de uma pgina ASP.NET cdigo HTML retornado para o cliente. Qualquer navegador capaz de interpretar corretamente HTML, em tese. Na prtica o que acontece que existem pequenas diferenas e at mesmo inconsistncias entre a maneira como o cdigo HTML interpretado. Para minimizar este problema, o ASP.NET conta com os controles que rodam no servidor e so capazes de fornecer diferentes sadas, dependendo do navegador que fez a solicitao da pgina. Na prtica isto significa que um controle da interface de uma pgina ASP.NET, que roda no servidor, capaz de gerar diferentes sadas, dependendo do navegador do cliente. Esta caracterstica conhecida por AUI Adaptative User Interface.

Check List Para Acompanhar os Exemplos Deste Livro


Na Introduo deste livro descrevi as caractersticas do computador que estou utilizando. A seguir, repito estas informaes. Para criar os exemplos deste livro, utilizei um servidor com as seguintes configuraes: 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

207

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Mscara de sub-rede: 255.255.255.0 Domnio DNS: groza.com Pasta padro: D:\Inetpub\wwwroot O Framework .NET est disponvel para vrias verses do Windows. ASP.NET suportado no Windows 2000 e no Windows NT 4 com Service Pack 6a. A utilizao de Web Services suportada em todas as plataformas suportadas pelo Microsoft .NET Framework SDK, com exceo do Windows 95. 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. Ao instalarmos o IIS criada uma pasta conhecida por Home Directory. O Home Directory a pasta padro que acessada quando digitamos o endereo do servidor IIS, como por exemplo: http://localhost. Dentro da pasta padro podemos definir um documento padro, como por exemplo index.asp. Com isso ao acessar o servidor http://localhost, a pgina padro (index.asp) do diretrio padro ser automaticamente carregada. O diretrio padro criado na pasta \Inetpub\wwwroot do drive onde o Windows 2000 est instalado. Ao instalar o IIS o usurio pode alterar a localizao da pasta padro. No computador que estou utilizando, o Windows 2000 Server est instalado em D:\Win2k. Por isso o Home Directory do servidor est em D:\Inetpub\wwwroot. Dentro da pasta wwwroot irei criar uma pasta para cada captulo, conforme indicado na Tabela 6.1.

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

CAPTULO 6: UMA INTRODUO AO ASP.NET


Um detalhe importante sobre o endereo para acessarmos e testarmos os exemplos de cada captulo. Vamos considerar a pgina chap6ex1.aspx. Ao criarmos uma pasta, dentro do Home Directory, a pasta passa a fazer parte do endereo. Ento, para acessarmos uma pgina que est dentro da pasta chap6, precisamos adicionar chap6 ao endereo. Por ltimo s adicionar o nome da pgina a ser acessada. Para acessar a pgina chap6ex1.aspx, utilizaramos o seguinte endereo: http://localhost/chap6/chap6ex1.aspx. Para acessarmos uma pgina chamada ex10chap13.aspx, gravada na pasta chap13, utilizamos o seguinte endereo: http://localhost/chap13/ex10chap13.aspx. Lembrando sempre que localhost uma referncia ao servidor local, ou seja, na prpria mquina onde estamos trabalhando. Ao invs de localhost podemos utilizar o nome DNS completo da mquina, no meu caso: http://www.groza.com. Tambm cabe lembrar que, para que as pginas ASP.NET possam ser processadas, necessrio que voc tenha instalado o Framework .NET conforme descrito na introduo, no seguinte item: Como obter e instalar o Microsoft .NET Framework SDK.

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.

ASP e ASP.NET Podem Rodar no Mesmo Servidor?


Sim. importante salientar este ponto. Ao instalarmos o Framework .NET, estamos habilitando o suporte a pginas ASP.NET, porm as pginas ASP tradicionais continuam sendo processadas normalmente. Ou seja, continuamos tendo suporte ao cdigo ASP. Desta maneira podemos migrar as aplicaes j desenvolvidas, aos poucos para ASP.NET. Podemos inclusive fazer com que um formulrio de uma pgina ASP seja processado por uma pgina ASP.NET e vice-versa, isto tudo no mesmo servidor.

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.

Enfim Vamos Iniciar com ASP.NET


Vamos conhecer as principais caractersticas de uma pgina ASP.NET.

A Extenso do Arquivo Mudou .aspx


A primeira diferena que notamos na extenso dos arquivos. As pginas ASP, desde a verso inicial at a verso 3.0, tm a extenso .asp. Esta extenso obrigatria, para que o IIS reconhea a pgina como uma pgina ASP e passe o processamento para o interpretador ASP (ASP.DLL). J as pginas ASP.NET tm a extenso .aspx, a qual reconhecida pelo IIS (aps a instalao do Framework .NET). O processamento da pgina ASP.NET passado para o controle do Framework .NET. O servio responsvel pelo processamento das pginas ASP.NET est contido na DLL XSPISAPI.DLL.

209

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Inserindo Cdigo ASP.NET


Para inserirmos cdigo em uma pgina ASP.NET utilizamos a tag <SCRIPT>, com o atributo RUNAT igual a server. A linguagem padro para a criao de pginas ASP.NET o VB.NET. Observe bem que no o VBScript e sim o Visual Basic NET VB.NET. No exemplo a seguir estamos definindo uma seo de cdigo, na qual utilizaremos o VB.NET:
<script language=VB runat=server> comando1 comando2 ... comandon </script>

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.

Listagem 6.2 A estrutura bsica de uma pgina ASP.NET.


<html> <script language=VB runat=server> comando1 comando2 ... comandon </script>

<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

CAPTULO 6: UMA INTRODUO AO ASP.NET


boto, enfim, toda a lgica de programao necessria ao funcionamento da pgina. A seo de cdigo representada pelo seguinte trecho.
<script language=VB 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. 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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


<%@Page Inherits=codex1 Src=codex1.cs %>

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.

Um Pequeno Exemplo, s Para Comear


Vamos apresentar alguns exemplos, para que voc possa ver o ASP.NET em funcionamento. Neste momento no entrarei em maiores detalhes sobre o cdigo. Irei detalhar mais a estrutura, a disponibilizao e o acesso s pginas no servidor IIS.

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.

Listagem 6.3 O primeiro exemplo de pgina ASP.NET chap6ex1.aspx.


<html>

<script language=C# runat=server>

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

CAPTULO 6: UMA INTRODUO AO ASP.NET


} else { Message.InnerHtml = LOGON FALHOU, TENTE NOVAMENTE !!!; } } </script>

<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>

<h1> <span id=Message runat=server> </span> </h1> </form>

</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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Criao da interface Para criarmos a interface da pgina utilizamos alguns controles HTML chamados de Controles HTML do Servidor HTML Server Controls. Observe o atributo runat=server destes controles, indicando que os mesmos so HTML Server Controls.

Figura 6.5: O primeiro exemplo chap6ex1.aspx.


Por padro, as tags HTML normais so tratadas como texto e no temos acesso s propriedades das mesmas, atravs de cdigo. Com o uso de HTML Server Controls os controles HTML so tratados como elementos do servidor e podemos ter acesso a estes controles atravs de programao. No exemplo da Listagem 6.2 estamos acessando a propriedade Value dos controles Nome e Senha, para verificar os valores digitados pelo usurio. No teramos como acessar estas propriedades, utilizando os controles HTML tradicionais. Por exemplo, para acessar o valor digitado no controle Nome, acessamos a propriedade Value deste controle, utilizando a seguinte sintaxe:
Nome.Value

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>

NOTA: Teremos um captulo completo sobre HTML Server Controls Captulo 7.

www.juliobattisti.com.br

214

CAPTULO 6: UMA INTRODUO AO ASP.NET

Figura 6.6: Utilizando o primeiro exemplo chap6ex1.aspx.


O OnServerClick indica o evento Ao Clicar, o qual disparado quando o usurio clica no boto. O valor atribudo propriedade OnServerClick, que no nosso exemplo foi Botao_Click, define o nome do procedimento que ser executado em resposta ao evento. Este evento pode estar na Seo de Cdigo da pgina, que o caso do nosso exemplo, ou pode estar em uma classe herdada, caso estejamos utilizando Code Behind, conforme descrito anteriormente. A seo de cdigo Na seo de cdigo da pgina chap6ex1.asp, logo aps a tag <html, temos o procedimento Botao_Click. Este procedimento est escrito em linguagem C#, conforme definido pela tag <script> no incio da pgina:
<script language=C# runat=server>

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


5. Dependendo dos valores digitados pelo usurio, uma ou outra mensagem ser retornada.

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.

Banco de Dados do SQL Server 2000 Para os Exemplos Deste Livro


Ao instalarmos o Framework .NET instalada uma miniverso do SQL Server 2000, na qual esto disponveis diversos bancos de dados de exemplo. Se voc j tiver o SQL Server 2000 instalado, as suas configuraes sero mantidas. Para os exemplos deste livro estaremos utilizando os seguintes bancos de dados: pubs Northwind Esta miniverso do SQL Server se instala como uma instncia chamada NETSDK. Para fazer referncia a esta instncia do SQL Server, onde esto os bancos que utilizaremos nos exemplos deste livro, precisamos utilizar o nome do servidor e o nome da instncia. Por exemplo, estou trabalhando em um computador cujo nome SERVIDOR. Para fazer referncia instncia NETSDK utilizo a seguinte nomenclatura:
SERVIDOR\NETSDK

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).

O Segundo Exemplo Conectando com um Banco de Dados


O nosso segundo exemplo um pouco mais complexo do que o exemplo anterior. Vamos apresentar uma pgina ASP.NET que faz conexo com um banco de dados do SQL Server e exibe todos os registros de uma determinada tabela. A primeira diferena que voc ir notar em relao ao ASP 3.0 que no temos mais o objeto Recordset, o qual bastante utilizado com o ASP 3.0, para conexes de pginas com bancos de dados. Na Listagem 6.4 temos o cdigo para a criao da pgina proposta.

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

CAPTULO 6: UMA INTRODUO AO ASP.NET


<script language=C# runat=server> 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.

SqlConnection myConnection = new SqlConnection(server=SERVIDOR\\NETSDK; + uid=sa;pwd=;database=pubs);

// 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 + * FROM Authors, myConnection);

// Criamos e preenchemos um objeto DataSet. // Observe que no temos mais o objeto Recordset, // como era de praxe com o ASP 3.0.

DataSet ds = new DataSet(); myCommand.Fill(ds);

// 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.

DataView source = new DataView(ds.Tables[0]); MyDataGrid.DataSource = source ; MyDataGrid.DataBind(); }

</script>

<body> <% Exibe as informaes do DataGrid no corpo da pgina. %>

<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.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

<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>

Figura 6.7: Os registros da tabela Authors chap6ex2.aspx.

www.juliobattisti.com.br

218

CAPTULO 6: UMA INTRODUO AO ASP.NET


Digite o cdigo da Listagem 6.4 e salve o mesmo em um arquivo chamado chap6ex2.aspx, na pasta chap6, dentro da pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/ chap6/chap6ex2.aspx Ao carregarmos esta pgina no Internet Explorer obtemos o resultado indicado na Figura 6.7 Alguns comentrios sobre o exemplo chap6ex2.aspx, sem entrar em maiores detalhes sobre o cdigo do exemplo.

Cad o meu Objeto Recordset?


Nada de objetos do tipo Recordset. Com ASP.NET utilizamos ADO.NET para fazer a conexo com banco de dados. O ADO.NET utiliza o objeto Dataset ao invs do objeto Recordset. Para a conexo com bancos de dados utilizamos uma srie de classes do namespace System.Data, o qual faz parte do .NET Framework Class Library. Para ter acesso s classes de um determinado namespace, precisamos adicionar uma referncia ao mesmo, no incio da pgina ASP.NET, utilizando a diretiva Import, conforme indicado no trecho de cdigo a seguir:
<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.SqlClient %>

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.

Conectando com o Banco de Dados


Na seo de cdigo da pgina temos os comandos para conexo com o banco de dados pubs da instncia SERVIDOR\NETSDK. Um detalhe importante a maneira como informamos o nome da instncia, conforme indicado pelo trecho de cdigo a seguir:
SqlConnection myConnection = new SqlConnection(server=SERVIDOR\\NETSDK; + uid=sa;pwd=;database=pubs);

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


DataSet DataView

Um Controle Poderoso Para Exibir os Dados


Na seo de apresentao utilizamos o controle DataGrid para fazer a exibio dos registros da tabela Authors. Observe o quo poderoso este controle. Simplesmente atravs da configurao da sua propriedade DataSource, na seo de cdigo, definimos os registros a serem exibidos pelo controle. Esta definio feita nas seguintes linhas de cdigo:
MyDataGrid.DataSource = source ; MyDataGrid.DataBind();

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.

Posso Ter um Comando que Ultrapassa uma Linha?


A resposta um sonoro Sim. Diferente do ASP 3.0, em nossas pginas ASP.NET, os comandos da seo de cdigo podem estar em mais do que uma linha, sem problemas. Inclusive na Listagem 6.3 temos comandos que ultrapassam uma linha e a pgina carrega sem maiores problemas, conforme exemplificado no trecho a seguir:
SqlDataAdapter myCommand = new SqlDataAdapter(SELECT + * FROM Authors, myConnection);

Isso possvel pois cada comando do C# finalizado com um ponto-e-vrgula (;).

O Bom e Velho SQL Continua o Mesmo?


A resposta outro sonoro Sim. Voc deve ter observado que utilizamos um comando SQL para retornar os dados da tabela authors. Utilizamos um comando SELECT, conforme indicado a seguir:
SqlConnection myConnection = new SqlConnection(server=SERVIDOR\\NETSDK; + uid=sa;pwd=;database=pubs);

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

CAPTULO 6: UMA INTRODUO AO ASP.NET


SqlDataAdapter myCommand = new SqlDataAdapter(SELECT + * FROM Authors where city=Oakland, myConnection);

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.

Figura 6.8: Definindo um critrio com a clusula where chap6ex3.aspx.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Em seguida fizemos um Check List para verificar se o computador que voc est utilizando est apto a rodar pginas ASP.NET. Tambm falamos sobre o Home Directory do servidor IIS e como acessar pginas gravadas em subpastas do Home Directory. Na seqncia apresentamos a estrutura bsica de uma pgina ASP.NET. Tambm aprendemos a definir uma seo de cdigo atravs da tag <script>. Para finalizar o captulo apresentamos dois exemplos, sem detalhar o cdigo dos exemplos. No primeiro exemplo apresentamos alguns HTML Server Controls. No segundo exemplo utilizamos algumas classes do Framework .NET, mais especificamente dos namespaces System.Data e System.Data.SqlCliente, para fazer acessar os dados do banco de dados pubs do SQL Server 2000. No prximo captulo estudaremos os HTML Server Controls disponveis. Veremos um a um, todos os controles disponveis, bem como as propriedades de cada um. Tambm apresentaremos alguns exemplos prticos para ilustrar o uso dos HTML Server Controls.

www.juliobattisti.com.br

222

CAPTULO 7: HTML SERVER CONTROLS

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


HTML Server Controls. Validation Server Controls. Web Server Controls. Neste captulo vamos estudar os HTML Server Controls. Vamos apresentar os controles existentes, bem como as diversas propriedades de cada controle. Tambm vamos apresentar uma srie de pginas que ilustram a utilizao destes controles. Antes de iniciarmos com a apresentao dos controles, veremos o que mudou na maneira como uma pgina carregada no servidor e disponibilizada para o usurio. Veremos que o modelo das pginas mudou significativamente no ASP.NET, em relao s verses anteriores. Tambm falaremos sobre o cache automtico de pginas no servidor.

Uma Classe Chamada Page


A classe Page faz parte do namespace System.Web.UI. Este namespace possui uma srie de classes e interfaces, as quais permitem a criao de controles e pginas, os quais formam a interface com o usurio em nossas aplicaes Web. Temos, por exemplo, uma classe chamada Control, a qual disponibiliza todos os controles que podem ser utilizados em pginas ASP.NET. Tambm existe um controle chamado Page, o qual automaticamente criado toda vez que feita a requisio de uma pgina ASP.NET. Fazer a requisio significa acessar a pgina. Tambm esto disponveis classes que nos possibilitam a ligao de dados com controles de um formulrio e a manuteno de estado entre diferentes requisies mesma pgina.

Eventos ao Carregar uma Pgina ASP.NET


Quando acessamos uma pgina .aspx, como por exemplo: http://www.microsoft.com/net/default.aspx, uma srie de eventos disparada. semelhante ao carregamento de uma aplicao Windows tradicional. Ao carregarmos uma aplicao Windows desenvolvida, por exemplo, em Visual Basic, so disparados diversos eventos. Por exemplo, ao carregar o formulrio principal da aplicao, disparado o evento OnLoad; ao exibir o formulrio na tela disparado o evento OnActivate e assim por diante. Ao carregarmos uma pgina .aspx so disparados, em seqncia, os seguintes eventos: Page_Init: Disparado quando a pgina inicializada. Page_Load: Disparado quando a pgina carregada. Contorl Event: disparado se um evento associado com um controle da pgina faz com que a mesma tenha que ser recarregada. Page_Unload: Disparado quando a pgina retirada da memria. A diferena bsica entre os eventos Page_Init e Page_Load em relao aos controles da pgina. Quando o evento Page_Init dispara, os controles da pgina ainda esto com seus valores padro, pois o estado dos mesmos, caso tenham sido alterados, ainda no foi carregado. J quando dispara o evento Page_Load, os controles esto com seus estados atualizados, sendo que j temos acesso aos reais valores de cada controle.

www.juliobattisti.com.br

224

CAPTULO 7: HTML SERVER CONTROLS


Esta seqncia de eventos refora a idia de que o modelo de programao baseado em eventos foi transportado para o mundo das aplicaes Web, pelo ASP.NET.

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.

Os Eventos da Classe Page


Na Tabela 7.1 temos a descrio dos eventos da classe Page.

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>

<script language=C# runat=server>

void Page_Load(Object Src, EventArgs E) { Mensagem.Value = ltimo acesso em: + DateTime.Now; } </script>

<body> <input id=Mensagem type=text size=60 runat=server> </body>

</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.

Figura 7.1: O evento Load da pgina chap7ex1.aspx.


Em primeiro lugar quero reforar o fato de termos disposio um modelo de programao baseado em eventos, o que para o ambiente Web um avano significativo em relao s verses anteriores.

www.juliobattisti.com.br

226

CAPTULO 7: HTML SERVER CONTROLS


O segundo detalhe para o qual gostaria de chamar a ateno a utilizao de um controle de servidor. Mais especificamente, utilizamos um HTML Server Control, para exibir a mensagem definida no evento Load da pgina. Utilizamos o controle Input, conforme indicado no trecho de cdigo a seguir:
<input id=Mensagem type=text size=60 runat=server>

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.

As Propriedades da Classe Page


Na Tabela 7.2 temos a descrio das propriedades da classe Page.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Propriedade ErrorPage IsPostBack

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

Server Session TraceEnabled Trace User Validators

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.

Listagem 7.2 Propriedades da classe Page chap7ex2.aspx.


<%@ Import Namespace=System %> <html> <script language=C# runat=server>

www.juliobattisti.com.br

228

CAPTULO 7: HTML SERVER CONTROLS


void Page_Load(Object Src, EventArgs E) { PrApplication.Value PrCache.Value = = Convert.ToString(Page.Application);

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>Propriedades da classe Page

!!! </H1>

<TABLE>

<TR> <TD> <B>Propriedade</B> </TD> <TD> <B>Valor retornado.</B> </TD> </TR>

<TR> <TD> <B>Application: </B>

229

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


</TD> <TD> <input id=PrApplication type=text size=60 runat=server> </TD> </TR>

<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>

<TR> <TD> <B>ErrorPage: </B> </TD>

www.juliobattisti.com.br

230

CAPTULO 7: HTML SERVER CONTROLS


<TD> <input id=PrErrorPage type=text size=60 runat=server> </TD> </TR>

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


</TD> </TR>

<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

CAPTULO 7: HTML SERVER CONTROLS


</TD> </TR>

</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.

Figura 7.2: Propriedades da classe Page chap7ex2.aspx.


Alguns comentrios sobre o exemplo.

233

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


No incio da pgina utilizamos uma diretiva Import:
<%@ Import Namespace=System %>

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.

Mtodos da Classe Page


Na Tabela 7.3 temos a descrio dos mtodos da classe Page.

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

CAPTULO 7: HTML SERVER CONTROLS

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.

O Processamento de uma Pgina ASP.NET


Vamos analisar mais alguns detalhes sobre a maneira como uma pgina ASP.NET processada no servidor e retornada para o usurio. Para acessar uma pgina, o usurio digita o endereo da pgina no seu navegador, como por exemplo: http:// www.juliobattisti.com.br/certificacao.aspx. O navegador envia a requisio da pgina para o servidor IIS, atravs de uma requisio HTTP (HTTP Request). O servidor localiza os dados solicitados, envia de volta para o usurio e fecha a conexo. Este aspecto bsico no mudou, at porque faz parte da definio do protocolo HTTP, independente do contedo que est sendo carregado. Porm, com ASP.NET, tivemos muitas melhorias em relao maneira como a pgina carregada e como as informaes so mantidas entre uma requisio e outra. Com o modelo atual, parte do processamento acontece no navegador do cliente e parte no servidor. Normalmente no cliente so colocados os elementos visuais da pgina. No servidor so feitos os processamentos do cdigo de script da pgina. Porm o processamento do tipo tudo de uma s vez, ou seja, o cliente envia a requisio, o servidor processa todos os elementos da pgina, formata uma sada e retorna a sada formatada para o cliente. Para que possa haver um novo processamento, uma nova requisio da pgina precisa ser feita. Com ASP.NET temos uma mudana neste modelo, devido criao dos chamados Server Controls. Um controle do tipo Server Control fornece elementos visuais para uma pgina ASP.NET, ao mesmo tempo que processado no servidor. Estes controles tm, inclusive, um modelo de eventos que pode ser acessado via cdigo. Com isso temos disponvel um modelo de desenvolvimento baseado em eventos, semelhante ao desenvolvimento de aplicaes Windows tradicionais. Outra mudana que possvel, graas aos Server Controls, em relao iterao entre a pgina e o servidor. Como os Server Controls possuem eventos, podemos escrever cdigo para ser executado em resposta a estes eventos. Este cdigo de eventos processado no servidor. Dentro de uma mesma requisio de pgina, podem ser disparados diversos eventos, medida que o usurio vai trabalhando na pgina. Para cada evento, o cdigo respectivo, caso exista, processado no servidor. Observem que o cliente fica indo e voltando do servidor, para processar o cdigo associado a eventos. Cada ida e vinda equivale a uma requisio. Este processo de ida e vinda conhecido como server round-trip.

235

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Para que um round-trip seja disparado, basta que o usurio realize alguma ao na pgina, ao esta que dispara um evento. Por exemplo, clicar em um campo para entrada de texto, para provocar um evento Click do respectivo controle.

Manuteno de Estado Fundamental


Conforme descrevemos no item anterior, o processo de round-trip faz com que diversas requisies sejam enviadas para uma mesma pgina .aspx. Se para cada requisio, toda a pgina tivesse que ser novamente processada, o desempenho deixaria muito a desejar. Alm disso o protocolo HTTP stateless, ou seja, no mantida nenhuma informao entre uma requisio e outra. Para resolver este problema e manter o estado entre requisies, o ASP.NET utiliza um processo conhecido como ViewState, para manter todas as informaes da pgina entre uma requisio e outra. O ViewState contm o estado (valores, propriedades, aparncia, etc.) para todos os controles de usurio de uma pgina ASP.NET. A informao de estado armazenada na forma de pares de valores. O objeto responsvel pela manuteno de estado derivado da classe System.Web.UI.StateBag. Todas as informaes de estado so armazenadas como uma string, a qual enviada de volta para o cliente. O navegador do cliente recebe a string com a informao sobre os controles e configura cada um com os mesmos valores que tinham no momento da requisio. A string com as informaes de estado so retornadas na forma de um campo oculto, o qual, evidentemente, no exibido na pgina. Podemos ver o contedo desta string, verificando o cdigo-fonte da pgina que retornada. Por exemplo, no IE, podemos utilizar o comando Exibir -> Cdigo-fonte. Conforme descrevemos anteriormente, o processo de ViewState habilitado por padro. Se por algum motivo quisermos desabilitar este processo, podemos utilizar a propriedade EnableViewState. Para desabilitar o mecanismo de ViewState utilize o seguinte comando no incio da pgina:
<%@Page EnableViewState=false %>

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.

HTML Server Controls


Agora que j conhecemos um pouco mais sobre o processamento de pginas ASP.NET e sobre a classe page, estamos prontos para comear a estudar os HTML Server Controls. Vamos iniciar o nosso estudo entendendo o que so HTML Server Controls.

www.juliobattisti.com.br

236

CAPTULO 7: HTML SERVER CONTROLS

Uma Definio Para HTML Server Controls


Em primeiro lugar so controles de servidor, isto , so processados no servidor. Para definir um controle como sendo de servidor, devemos definir a sua propriedade runat como sendo igual a server, conforme o exemplo a seguir:
<input id=Senha type=password size=40 runat=server>

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


HTML Server controls devem ser colocados dentro de um formulrio, na pgina ASP.NET. Criamos um formulrio, conforme veremos mais adiante, com as tags <FORM> </FORM>. Alm disso, a propriedade runat, do formulrio, deve ser definida como: runat=server. Como a utilizao de Server Controls exige mais recursos do servidor do que o uso de controles tradicionais, somente devemos utilizar Server Controls, quando as suas caractersticas forem necessrias. Porm com o avano e sofisticao das aplicaes Web, vai ser difcil acharmos uma situao em que possamos dispensar o modelo baseado em eventos, disponibilizado pelos Server Controls. Em algumas situaes simples pode ser dispensvel a utilizao de Server Controls. Como por exemplo, quando o elemento um link para outra pgina e no precisamos processar a informao do link, no servidor. Agora vamos estudar os diversos HTML Server Controls disponveis.

HTML Server Controls Disponveis


Existem algumas propriedades que so comuns a todos os HTML Server Controls disponveis. Isto acontece porque os mesmos herdam estas propriedades a partir de uma classe comum a todos.

A Classe Base System.Web.UI.HtmlControls.HtmlControl


A classe base para todos os HTML Server Controls System.Web.UI.HtmlControls.HtmlControl. Esta classe expe uma srie de propriedades e mtodos comuns a todos os HTML Server Controls. Na Tabela 7.4 temos a descrio das principais propriedades da classe System.Web.UI.HtmlControls.HtmlControl

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

CAPTULO 7: HTML SERVER CONTROLS

Propriedade Site Visible

Descrio Retorna informao a respeito do Web site. Utilizado para retornar ou definir um valor que indica se o controle ou no visvel.

Vamos, finalmente, comear a estudar os HTML Server Controls disponveis.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 7.3: Dados de um formulrio sendo processados.


Vamos apresentar um exemplo. Exemplo: Neste exemplo criaremos uma pgina com um controle HtmlForm. No formulrio colocaremos dois controles HtmlInputText (detalharemos este controle mais adiante) e um controle HtmlButton (tambm detalharemos este controle mais adiante). Ao carregar a pgina, o usurio digita um valor no primeiro campo e clica no boto Enviar. O valor digitado pelo usurio, no primeiro campo, repetido no segundo campo. Na Listagem 7.3 temos a pgina do exemplo proposto.

Listagem 7.3 Um formulrio simples chap7ex3.aspx.


<html> <script language=C# runat=server> public void { Voltou.Value = Digitou.Value; Enviar_Click(Object sender,EventArgs e)

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>

<form method=post runat=server> <table> <tr>

www.juliobattisti.com.br

240

CAPTULO 7: HTML SERVER CONTROLS


<td><h3>Digite um texto:</h3> </td> <td><input id=Digitou type=text size=40 runat=server></td> </tr>

<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.

Figura 7.4: Um exemplo de formulrio chap7ex3.aspx.

241

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Agora uma pequena demonstrao de como o ASP.NET mantm o estado dos controles. No nosso exemplo vamos provar que o valor contido nos campos do formulrio mantido no servidor. Pressione F5 para atualizar a pgina do nosso exemplo (se voc estiver utilizando o Netscape pressione Ctrl+R). Com o ASP 3.0 e verses anteriores, ao pressionarmos F5, a pgina seria recarregada e os campos apareceriam em branco ou com os seus valores padro. No caso do ASP.NET so exibidos os valores atualmente definidos, ou seja, o estado atual da pgina foi mantido. Pressione F5 e observe. O texto Exemplo de formulrio ser exibido nos dois campos, o que comprova a manuteno automtica de estado com o ASP.NET.

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

CAPTULO 7: HTML SERVER CONTROLS

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.

Sintaxe para o controle input:


<input type=text | password runat=server id=identificao_no_cdigo maxlength=nmero mximo de caracteres size=tamanho de exibio da caixa para digitao value=valor padro para o campo >

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Vamos modificar algumas propriedades destes controles. Vamos definir um valor padro para o controle Digitou. Vamos definir o valor padro Exemplo de ASP.NET. Tambm vamos definir um tamanho mximo de 20 para a caixa de exibio do campo Digitou. Aps as alteraes propostas, o nosso cdigo deve ficar assim:
... <td><h3>Digite um texto:</h3> </td> <td><input id=Digitou type=text size=20 runat=server value=Exemplo de ASP.NET></td> ... <td><h3>Voc digitou: </h3> </td> <td><input id=Voltou type=text size=40 runat=server> </td> ...

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.

Figura 7.5: Um exemplo HtmlTextControl chap7ex4.aspx.

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

CAPTULO 7: HTML SERVER CONTROLS


criar um formulrio de cadastro, onde o cliente pode informar as reas de interesse em uma livraria. Podemos utilizar controles do tipo CheckBox, onde o cliente pode selecionar uma ou mais reas de interesse. Apresentaremos este exemplo logo em seguida. Sintaxe para o controle CheckBox:
<input type=checkbox runat=server id=identificao_no_cdigo checked >

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.

Listagem 7.4 O controle CheckBox chap7ex5.aspx.


<html> <script language=C# runat=server> public void { Dados.Visible = true; Enviar_Click(Object sender,EventArgs e)

//Declarao das variveis auxiliares

String Aux;

// Comeo a montar uma string que ser atribuda // propriedade Value do controle Dados.

245

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Aux = Nome.Value; Aux = Aux + \n + Email.Value;

if (Negocios.Checked==true) { Aux= Aux +\n +Negcios; }

if (Administrao.Checked==true) { Aux= Aux +\n +Administrao; } if (Informtica.Checked==true) { Aux= Aux +\n +Informtica; }

if (Fico.Checked==true) { Aux= Aux +\n +Fico; }

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>

<tr> <td><h3>E-mail: </h3> </td>

www.juliobattisti.com.br

246

CAPTULO 7: HTML SERVER CONTROLS


<td><input id=Email type=text size=40 runat=server> </td> </tr> <tr> <td colspan=2">Selecione as res de interesse:</td> </tr> <tr> <td><h3>Negcios:</h3> </td> <td><input id=Negocios type=checkbox runat=server> </td> </tr>

<tr> <td><h3>Administrao:</h3> </td> <td><input id=Administrao type=checkbox runat=server> </td> </tr>

<tr> <td><h3>Informtica:</h3> </td> <td><input id=Informtica type=checkbox runat=server> </td> </tr>

<tr> <td><h3>Fico:</h3> </td> <td><input id=Fico type=checkbox runat=server> </td> </tr>

<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>

</form> </body> </html>

247

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Digite o cdigo da Listagem 7.4 e salve o mesmo em um arquivo chamado chap7ex5.aspx, na pasta chap7, dentro da pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/ chap7/chap7ex5.aspx Ao carregarmos esta pgina no Internet Explorer obtemos um formulrio com dois campos para digitao de texto. Um para o nome do usurio e outro para o e-mail. Tambm so exibidos quatro controles do tipo checkbox onde o usurio pode escolher uma ou mais das seguintes opes: Negcios Administrao Informtica Fico Ao carregar a pgina pela primeira vez, o controle do tipo textarea est oculto, pois definimos sua propriedade visible como false. Para o nome digite Jos da Silva e para o e-mail digite josedasilva@abc.com.br. Selecione as opes Negcios e Informtica, conforme indicado na Figura 7.6

Figura 7.6: Um exemplo com controles checkbox chap7ex5.aspx.

www.juliobattisti.com.br

248

CAPTULO 7: HTML SERVER CONTROLS


D um clique no boto Enviar. Um controle do tipo textarea ser exibido na parte final da pgina, com os dados que voc digitou para o Nome e o e-mail do usurio, alm das informaes selecionadas, conforme indicado na Figura 7.7.

Figura 7.7: Exibio dos dados digitados e das opes selecionadas.


Desmarque a opo Negcios e marque as opes Administrao e Fico. D um clique no boto Enviar e observe que as novas opes j so exibidas no controle do tipo textarea. Alguns comentrios sobre o cdigo do nosso exemplo. Na seo de apresentao (entre as tags <body> e </body>) criamos um formulrio. Neste formulrio colocamos dois controles do tipo text para que o usurio possa digitar o nome e o e-mail. Depois inclumos quatro controles do tipo checkbox para que o usurio possa selecionar uma ou mais preferncias. Novamente utilizamos uma tabela para fazer o alinhamento dos controles. Na seo de cdigo utilizamos o evento Click do boto Enviar. Dentro deste evento tornamos o controle Dados visvel e depois declaramos uma varivel do tipo String Aux. A vamos concatenando os valores digitados para o nome e o e-mail varivel Aux, conforme indicado no trecho de cdigo a seguir:

NOTA: Para maiores informaes sobre os comandos bsicos da linguagem HTML consulte o Anexo I.

249

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Dados.Visible = true;

//Declarao das variveis auxiliares

String Aux;

// Comeo a montar uma string que ser atribuda // propriedade Value do controle Dados.

Aux = Nome.Value; Aux = Aux + \n + Email.Value;

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

CAPTULO 7: HTML SERVER CONTROLS


> Texto para ser exibido no controle. </textarea>

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>

Ao invs desta sintaxe tradicional podemos utilizar a seguinte sintaxe:


<textarea id=TextArea1" cols=40 rows=4 runat=server />

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Vamos apresentar um exemplo. Exemplo: Vamos criar um formulrio com trs controles do tipo RadioButton. O usurio seleciona uma opo e clica no boto Enviar. Para processar as informaes enviadas pela pgina vamos utilizar a propriedade OnServerChange do controle RadioButton. Esta propriedade permite que seja definido um procedimento que ser executado quando a pgina for processada, em resposta a uma alterao no controle. Este procedimento detecta o tipo de carto selecionado e exibe o tipo de carto em um controle do tipo text. Na Listagem 7.5 temos a pgina do exemplo proposto.

Listagem 7.5 Controles do tipo RadioButton chap7ex6.aspx.


<html> <script language=C# runat=server> void Server_Change(object Source, EventArgs e) { if (Visa.Checked == true) Exibe.Value=O SEU CARTO VISA!; else if (Master.Checked == true) Exibe.Value=O SEU CARTO MASTER CARD!; else if (Outros.Checked == true) <l } </script> Exibe.Value=OUTROS TIPOS DE CARTO!;

<body> <form runat=server> <h3><font face=Verdana>Selecione o tipo de carto:</font></h3>

<input type=radio id=Visa name=Cartao OnServerChange=Server_Change runat=server/> Visa<br>

<input type=radio id=Master name=Cartao

www.juliobattisti.com.br

252

CAPTULO 7: HTML SERVER CONTROLS


OnServerChange=Server_Change runat=server/> Master Card<br>

<input type=radio id=Outros name=Cartao OnServerChange=Server_Change runat=server/> Outros

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 7.8: Um exemplo com controles RadioButton chap7ex6.aspx.

Controles Para a Criao de Tabelas: HtmlTable, HtmlTableRow e HtmlTableCell Controls


Os controles HtmlTable, HtmlTableRow e HtmlTableCell so os controles de servidor, equivalentes s tags HTML para a criao de tabelas: <table> </table>, <tr> </tr> e <td> </td>, respectivamente. A vantagem de utilizarmos os controles de servidor que temos acesso a uma srie de propriedades e mtodos dos controles de servidor. Por exemplo, podemos adicionar ou remover linhas e colunas dinamicamente, com base em eventos ocorridos na pgina. Atravs de programao podemos utilizar os mtodos das colees HtmlTableRowCollection e HtmlTableCellCollection para adicionar ou remover elementos da tabela. Vamos estudar cada um dos controles individualmente, e depois vamos apresentar alguns exemplos de utilizao.

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

CAPTULO 7: HTML SERVER CONTROLS


bordercolor=cor da borda cellpadding=espao entre a borda e o contedo da clula, em pixels. cellspacing= espao entre as clulas, em pixels height=altura da tabela rows=um objeto do tipo coleo de linhas - HtmlTableRowCollection width=largura da tabela > <tr><td></td></tr> <tr><td></td></tr> </table>

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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>

void Page_Load(Object sender, EventArgs e) {

int row = 0;

// Vamos gerar, dinamicamente, uma tabela // com o nmero de linhas e clulas, especificado // pelo usurio.

int numrows = Convert.ToInt32(Linhas.Value); int numcells = Convert.ToInt32(Colunas.Value);

// 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++;

for (int i=0; i<numcells; i++) {

// Declaro e crio um novo objeto do tipo HtmlTableCell()

257

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


HtmlTableCell c = new HtmlTableCell();

// 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); } } </script>

</head> <body> <h3><font face=Verdana>HtmlTable Example</font></h3>

<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>

Nmero de colunas : <input id=Colunas type=text size=10 value=1" runat=server> <BR>

www.juliobattisti.com.br

258

CAPTULO 7: HTML SERVER CONTROLS


<input type=submit value=Gerar a tabela dinamicamente. runat=server> </font>

</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.

Figura 7.9: Formulrio para gerao automtica de tabela chap7ex7.aspx.

259

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 7.10: Um exemplo de tabela gerada dinamicamente.


Alguns comentrios sobre o cdigo da pgina chap7ex7.aspx. Na seo de apresentao da pgina, criamos um formulrio com dois campos para digitao do nmero de linhas e colunas da tabela a ser gerada dinamicamente. Tambm colocamos um boto do tipo Submit. Na seo de cdigo interessante observar que no utilizamos o evento Click do boto Enviar do formulrio. Poderamos ter utilizado este evento, como j fizemos em exemplos anteriores. No exemplo da pgina chap7ex7.aspx optamos por utilizar o evento Load do objeto Page. Lembrando do que foi apresentado no incio do captulo, toda pgina APS.NET, ao ser carregada, compilada e um objeto do tipo Page gerado. Este objeto baseado na classe Page do namespace System.Web.UI. Sendo um objeto, temos aceso a seus mtodos, propriedades e demais membros. A seguir temos o cdigo para a declarao do evento Load da pgina:
void Page_Load(Object sender, EventArgs e)

Iniciamos o procedimento declarando trs variveis do tipo inteiro:


int row = 0; int numrows = Convert.ToInt32(Linhas.Value); int numcells = Convert.ToInt32(Colunas.Value);

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

CAPTULO 7: HTML SERVER CONTROLS


A varivel numrows contm o nmero de linhas digitado pelo usurio. Observe que temos que converter o valor digitado pelo usurio para um tipo Int32. Esta operao necessria porque os valores digitados em um campo de um formulrio so considerados valores de texto. A varivel numcells contm o nmero de colunas digitado pelo usurio. Tambm convertemos este nmero para Int32. Em seguida iniciamos dois laos for. O lao for externo varia de 0 at o nmero de linhas especificado pelo usurio. O lao for interno varia, para cada valor do lao externo, de 0 at o nmero de colunas especificado pelo usurio, conforme indicado pelo trecho de cdigo a seguir:
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++;

for (int i=0; i<numcells; i++) {

// Declaro e crio um novo objeto do tipo HtmlTableCell()

HtmlTableCell c = new HtmlTableCell();

// 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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


No incio do lao, declaramos e inicializamos uma varivel r, do tipo HtmlTableRow. Estamos criando um objeto do tipo HtmlTableRow. Isto feito com o seguinte cdigo:
HtmlTableRow r = new HtmlTableRow();

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();

A definio do contedo da clula feita com o seguinte comando:


c.Controls.Add(new LiteralControl(Linha + j.ToString() + , Coluna + i.ToString()));

A adio da clula c coleo de clulas da linha r feita com o seguinte comando:


r.Cells.Add(c);

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

CAPTULO 7: HTML SERVER CONTROLS

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Exemplo: Vamos criar um formulrio onde temos trs controles: Uma lista com alguns nomes de cores. Ao lado desta lista temos um boto Aplicar. Ao clicar neste boto, a cor selecionada na lista ser aplicada como cor de segundo plano de um controle do tipo texto existente no formulrio. Um campo onde o usurio pode adicionar uma cor lista de cores. Ao lado deste campo temos um boto. Ao clicar neste boto, a cor digitada no campo ser adicionada lista de cores. Para isso utilizaremos o evento Click deste boto. Um campo onde exibimos um determinado texto e onde aplicada a cor de segundo plano selecionada na lista de cores. Na Listagem 7.7 temos a pgina do exemplo proposto.

Listagem 7.7 Adicionando elementos dinamicamente a uma lista chap7ex8.aspx.


<html> <head>

<script language=C# runat=server>

void Aplicar_Click(object Source, EventArgs e) { Span1.Style[background-color] = ColorSelect.Value; }

void AdicionaALista_Click(object Source, EventArgs e) { ColorSelect.Items.Add(Text1.Value); }

</script> </head>

<body>

<h3><font face=Verdana>Exemplo de lista dinmica!</font></h3>

<form runat=server> Selecione uma cor:<br>

www.juliobattisti.com.br

264

CAPTULO 7: HTML SERVER CONTROLS


<select id=ColorSelect runat=server> <option>SkyBlue</option> <option>LightGreen</option> <option>Gainsboro</option> <option>LemonChiffon</option> </select>

<input type=button runat=server Value=Aplicar OnServerClick=Aplicar_Click>

<p> A cor desejada no est na lista? Digite a cor desejada:<br>

<input type=text id=Text1" runat=server> <input type=button runat=server Value=AdicionaALista OnServerClick=AdicionaALista_Click>

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 7.11: Alterando a cor de fundo usando uma lista chap7ex8.aspx.

Figura 7.12: Elemento adicionado dinamicamente lista.


Alguns comentrios sobre o cdigo da pgina chap7ex8.aspx.

www.juliobattisti.com.br

266

CAPTULO 7: HTML SERVER CONTROLS


Quando o usurio seleciona uma cor na lista de cores e clica no boto Aplicar, disparado o evento Click do boto. Em resposta a este evento executado o procedimento Aplicar_Click. Este procedimento utiliza a propriedade Style do controle Span1 para definir a cor de segundo plano como sendo a cor selecionada na lista de cores. O procedimento Aplicar_Click est indicado no trecho de cdigo a seguir:
void Aplicar_Click(object Source, EventArgs e) { Span1.Style[background-color] = ColorSelect.Value; }

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Vamos apresentar um exemplo simples. Exemplo: Vamos criar um formulrio com dois links. Um link aponta para a pgina chap7ex8.aspx e outro para a pgina chap7ex7.aspx. Na Listagem 7.8 temos a pgina do exemplo proposto.

Listagem 7.8 O controle HtmlAnchor chap7ex9.aspx.


<%@ Import Namespace=System %> <html> <script language=C# runat=server>

</script> <body> <l <H1>Selecione um dos links abaixo !!! </H1>

<TABLE>

<TR> <TD> <a href=chap7ex7.aspx runat=server id=link1"> Exemplo 7 do Captulo 7. </a>

</TD>

</TR>

<TR> <TD> <a href=chap7ex8.aspx runat=server id=link2"> Exemplo 8 do Captulo 7. </a>

</TD> </TR>

</TABLE>

</body> </html>

www.juliobattisti.com.br

268

CAPTULO 7: HTML SERVER CONTROLS


Digite o cdigo da Listagem 7.8 e salve o mesmo em um arquivo chamado chap7ex9aspx, na pasta chap7, dentro da pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/ chap7/chap7ex9.aspx Voc obter o resultado indicado na Figura 7.13.

Figura 7.13: O controle HtmlAnchor chap7ex9.aspx.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


runat=server id=identificao_no_cdigo OnServerClick=nome do procedimento a ser executado em resposta ao evento Click >

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.

Listagem 7.9 O controle HtmlButton chap7ex10.aspx.


<html> <head> <script language=C# runat=server>

void Button1_OnClick(object Source, EventArgs e) { Span1.InnerHtml=Voc clicou no boto 1"; }

www.juliobattisti.com.br

270

CAPTULO 7: HTML SERVER CONTROLS


void Button2_OnClick(object Source, EventArgs e) { Span1.InnerHtml=Voc clicou no boto 2"; } </script> </head>

<body> <h3><font face=Verdana>Exemplo do controle HtmlButton!</font></h3>

<form runat=server> <font face=Verdana size=-1"> <p>

<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>

Alm do texto temos uma figura no boto. <p> <p>

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Clique em mim! </button>

Com efeito onmouseover.

<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.

Figura 7.14: O controle HtmlButton chap7ex10.aspx.

www.juliobattisti.com.br

272

CAPTULO 7: HTML SERVER CONTROLS


Alguns comentrios sobre o exemplo. Mais uma vez utilizamos o evento Click de cada boto para enviar uma mensagem informando qual boto foi clicado. A aparncia dos botes foi definida atravs da sua propriedade style. Por exemplo, para o primeiro boto fizemos as seguintes definies:
style=font: 8pt verdana; background-color:lightgreen; border-color:black; height=30; width:110"

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


height=altura da imagem src=localizao da imagem width=largura da imagem >

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.

Listagem 7.10 O controle HtmlImage chap7ex11.aspx.


<html> <head>

<script language=C# runat=server>

void SubmitBtn_Click(Object Sender, EventArgs e) { Image1.Src=Select1.Value; }

</script> </head>

<body> <h3><font face=Verdana>Exemplo do controle HtmlImage!!!</font></h3>

<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

CAPTULO 7: HTML SERVER CONTROLS


<option Value=Cereal5.gif>Strike</option> <option Value=Cereal7.gif>Fruity Pops</option> </select>

<p> <p>

<input type=submit runat=server Value=Aplicar OnServerClick=SubmitBtn_Click> </form>

</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.

Figura 7.15: O controle HtmlImage chap7ex11.aspx.


Selecione uma outra opo na lista; por exemplo, selecione U.F.O.S e d um clique no boto Aplicar. A figura correspondente ser exibida.

275

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Alguns comentrios sobre o exemplo. Na seo de apresentao temos um formulrio com trs controles. Um controle para exibio da imagem, um para a criao da lista com as opes disponveis e um boto de comando. Utilizamos o evento Click do boto de comando para redefinir a propriedade Src do controle que exibe a imagem. A propriedade Src define o caminho para a imagem a ser exibida. Aqui temos mais um exemplo do poder dos controles de servidor, ou seja, conseguimos alterar suas propriedades atravs de cdigo de programao. O evento Click para o boto de comando est indicado no trecho de cdigo a seguir:
void SubmitBtn_Click(Object Sender, EventArgs e) { Image1.Src=Select1.Value; }

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">

<input type=hidden name=__VIEWSTATE value=dDwtMTkzMzU5NzEzMDt0PDtsPGk8Mj47 PjtsPHQ8O2w8aTwxPjs+O2w8dDxwPGw8c3JjOz47bDxDZXJlYWwzLmdpZjs+Pjs7Pjs+Pjs+Pjs+ />

<img src=/chap7/Cereal3.gif id=Image1" /> <p> <p> Selecione a Imagem a ser exibida e clique em Aplicar:

www.juliobattisti.com.br

276

CAPTULO 7: HTML SERVER CONTROLS


<select name=Select1" id=Select1"> <option value=Cereal1.gif>Healthy Grains</option> <option value=Cereal2.gif>Corn Flake Cereal</option> <option selected=selected value=Cereal3.gif>U.F.O.S</option> <option value=Cereal4.gif>Oatey Os</option> <option value=Cereal5.gif>Strike</option> <option value=Cereal7.gif>Fruity Pops</option> </select> <p> <p> <input name=ctrl1" type=submit value=Aplicar /> </form> </body> </html>

Nada de diferente, com exceo do seguinte elemento:


<input type=hidden name=__VIEWSTATE value=dDwtMTkzMzU5NzEzMDt0PDtsPGk8Mj47Pjts PHQ8O2w8aTwxPjs+O2w8dDxwPGw8c3JjOz47bDxDZXJlYWwzLmdpZjs+Pjs7Pjs+Pjs+Pjs+ />

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


HTMLForm control. HTMLInputText control. HTMLInputCheckBox control. HtmlTextArea control. HTMLInputRadioButton control. HtmlTable control. HtmlTableRow control. HtmlTableCell control. HTMLSelect control. HTMLAnchor control. HtmlInputButton control. HtmlButton control. HtmlImage control. No prximo captulo trataremos de controles que j vm com uma certa inteligncia embutida. Veremos os Validation Server Controls.

www.juliobattisti.com.br

278

CAPTULO 8: VALIDATION SERVER CONTROLS

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Neste captulo vamos entender exatamente o que so os Server Validation Controls. Tambm aprenderemos a utilizar os diversos controles disponveis. Iremos estudar os seguintes controles: RequiredFieldValidator Control CompareValidator Control RangeValidator Control CustomValidator Control RegularExpressionValidator Control Veremos diversos exemplos de utilizao destes controles.

Validation Controls: Definio e Propriedades Gerais


Para facilitar a tarefa de fazer a validao dos dados digitados em um formulrio que foram criados os controles de validao Validation Controls. Por que estes controles no so chamados de HTMLServer Validation Controls? No Captulo 7 ns vimos que, para cada tag HTML utilizada para a criao de formulrios, existe um HTML Server Control correspondente. A vantagem dos HTML Server Controls que os mesmos so compilados como objetos em uma pgina ASP.NET. Sendo objeto temos acesso aos mtodos e propriedades do controle. J os controles de validao no possuem correspondentes no HTML. So na verdade controles completamente novos e no uma melhoria em relao a controles j existentes. Os controles de validao possuem as mesmas caractersticas que os chamados Web Server Controls (que sero estudados no Captulo 9). Estes controles iniciam com a palavra asp, conforme exemplo a seguir, onde temos uma pequena amostra da sintaxe do controle RequiredFieldValidator:
<asp:RequiredFieldValidator Atributo1 Atributo2 ... Atributon> </asp:RequiredFieldValidator>

Outra diferena quanto localizao das classes bases, ou seja, das classes das quais

NOTA: Estudaremos o controle RequiredFieldValidator em detalhes ainda neste captulo.

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

CAPTULO 8: VALIDATION SERVER CONTROLS

Como que Utilizamos os Controles de Validao?


Na criao do formulrio, devemos associar um controle de validao com cada campo onde os dados devam ser validados. Por exemplo, se existe um campo Nome, o qual de preenchimento obrigatrio, devemos associar um campo RequiredFieldValidator com o campo nome que obrigatrio. Quando o usurio envia a pgina para processamento, cada controle de validao ir checar o valor digitado no controle associado para verificar se est tudo OK, ou seja, para verificar se o formulrio passou no teste de validao. Basta que um nico campo no atenda as regras de validao definidas, para que o formulrio no passe no teste de validao. Neste caso podemos exibir uma mensagem de erro descrevendo o(s) controle(s) que no passou(aram) na validao, em um controle do tipo ValidationSummary. Por serem controles de servidor, mais especificamente, Web Server Controls, os controles de validao possuem uma srie de funcionalidades embutidas que os tornam extremamente interessantes para a criao de aplicaes Web. Dizemos que foi embutida inteligncia nestes controles. Estas funcionalidades, nas verses anteriores do ASP, tinham que ser codificadas manualmente pelo programador. Ao embutir funcionalidades nos prprios controles estamos reduzindo a quantidade de cdigo que precisa ser escrita. Esta frase j foi repetida n vezes neste livro e no me canso de repetir: Com o Framework .NET o programador precisa se preocupar menos com funes bsicas, as quais passaram para o controle do Framework .NET, precisando apenas cuidar da lgica da aplicao. Uma das funcionalidades dos controles de validao que eles so capazes de, automaticamente, detectar qual o navegador ou dispositivo que o cliente est utilizando, e se for o Internet Explorer 5 ou superior, ser gerado cdigo de validao no prprio cliente, no momento da criao da pgina. Em outras palavras, ao carregar uma pgina, no IE 5 ou superior, pgina esta que contm controles de validao, ser gerado, automaticamente, cdigo para fazer a validao no prprio cliente, evitando que a pgina seja enviada para o servidor se algum controle no tiver passado no teste de validao. Nesta situao a pgina somente ser enviada para processamento quando todos os controles tiverem passado no teste de validao. Para criar esta mesma funcionalidade nas verses anteriores do ASP, tnhamos que escrever uma boa quantia de cdigo. O cdigo de validao gerado automaticamente, no cliente, criado utilizando-se da linguagem DHTML Dynamic HTML. Para maiores informaes sobre DHTML consulte o seguinte endereo: www.wdvl.com. Se quisermos possvel desabilitar a validao no cliente. Para isso temos uma propriedade chamada EnableClientScript, da classe BaseValidator, da qual todos os controles de validao so derivados. A propriedade EnableClientScript do tipo Boleana True ou False. Estudaremos a classe BaseValidator logo em seguida. Ao desabilitarmos a validao no cliente (definindo EnableClientScript = False), podemos criar mensagens personalizadas de erro, ao invs de utilizar as mensagens pr-definidas e o controle ValidationSummary.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

A Me de Todos? Ou Seria o Pai de Todos?


Todos os controles de validao so derivados de uma classe base chamada BaseValidator. Esta classe faz parte do namespace System.Web.UI.WebControls. Por serem baseados na classe BaseValidator, os controles de validao herdam as propriedades e mtodos desta classe.

Principais Propriedades da Classe BaseValidator


Neste tpico vamos apresentar as principais propriedades da classe BaseValidator. Para uma descrio completa de todos os mtodos e propriedades da classe BaseValidator, abra a documentao do Framework .NET (Iniciar -> Programas -> Microsoft .NET Framework SDK -> Documentation) e, uma vez dentro da documentao, siga o seguinte caminho:
.NET Framework SDK -> .NET Framework Reference -> .NET Framework Class Library -> System.Web.UI.WebControls -> BaseValidator Class.

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.

Principais Mtodos da Classe BaseValidator


Vamos descrever alguns mtodos da classe BaseValidator e apresentar um exemplo prtico. O objetivo deste primeiro exemplo ver os controles de validao em funcionamento. No iremos explicar o cdigo do exemplo neste momento. medida que formos avanando no captulo e explicando os diversos controles de validao disponveis, voc poder voltar a este exemplo e facilmente entender o cdigo do mesmo. Principais mtodos da classe BaseValidator:

www.juliobattisti.com.br

282

CAPTULO 8: VALIDATION SERVER CONTROLS


Validate: responsvel por fazer a validao do controle associado com o controle de validao e atualizar a propriedade IsValid para True se a validao ocorrer com sucesso ou para False, caso contrrio. RegisterValidatorCommonScript: Pode ser utilizado para registrar cdigo na pgina, para que ocorra a validao no cliente.

Um Exemplo, s Para Comear


Vamos apresentar um pequeno exemplo, para que possamos ver os controles de validao em funcionamento. Conforme explicado anteriormente, no nos deteremos na explicao do cdigo do exemplo, neste momento. No exemplo proposto, temos um formulrio com um campo para digitao, onde o usurio deve digitar um valor entre 1 e 10. Se o usurio no digitar nada, ao clicar no boto Enviar ser exibida a seguinte mensagem: Voc no digitou nenhum nmero!!. Quando o usurio digita um nmero entre 1 e 10, a propriedade IsValid torna-se verdadeira e o evento Click do boto Enviar ser executado. Neste evento gerado um nmero aleatrio entre 1 e 10. Se o nmero digitado pelo usurio for igual ao nmero gerado aleatoriamente, exibida a seguinte mensagem: Parabns, voc acertou!!!; caso contrrio ser exibida a seguinte mensagem: Sinto muito, voc errou!!!. Na Listagem 8.1 temos o cdigo para o exemplo proposto.

NOTA: O exemplo apresentado baseado em um exemplo da documentao do Framework .NET.

Listagem 8.1 O primeiro exemplo com controles de validao chap8ex1.aspx.


<html> <head> <script language=C# runat=server>

void Button_Click(Object sender, EventArgs e) {

Random rand_number = new Random();

Compare1.ValueToCompare = rand_number.Next(1, 10).ToString(); Compare1.Validate();

if (Page.IsValid) { lblOutput.Text = Parabns, voc acertou!!!; } else {

283

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


lblOutput.Text = Sinto muito, voc errou!!!; }

lblOutput.Text += <br><br> + O nmero correto era: + Compare1.ValueToCompare;

} </script>

</head> <body>

<form runat=server>

<h3>Exemplo de validao.</h3>

<h5>Digite um nmero entre 1 e 10:</h5>

<asp:RequiredFieldValidator id=Require1" ControlToValidate=TextBox1" Type=Integer ErrorMessage=Voc no digitou nenhum nmero!! Text=* runat=server/>

<asp:TextBox id=TextBox1" 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

CAPTULO 8: VALIDATION SERVER CONTROLS


<br>

<asp:Button id=Button1" Text=Enviar OnClick=Button_Click runat=server/>

<br> <br>

<asp:Label id=lblOutput Font-Name=verdana Font-Size=10pt runat=server/>

<br> <br>

<asp:ValidationSummary id=Summary1" runat=server/>

</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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 8.1: Controles de validao chap8ex1.aspx.

Figura 8.2: O usurio no adivinhou o nmero gerado aleatoriamente.


Prometi que no iria comentar o cdigo deste primeiro exemplo, mas apenas um comentrio rpido, em relao gerao de nmeros aleatrios. Para gerar um nmero aleatoriamente, entre 1 e 10, declaramos e inicializamos uma varivel (talvez seria melhor dizer um objeto) do tipo Random:

www.juliobattisti.com.br

286

CAPTULO 8: VALIDATION SERVER CONTROLS


Random rand_number = new Random();

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>

Uma sintaxe alternativa a seguinte:

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


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, de propsito, para que voc no esquea esta associao. 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 dois campos: e-mail nome O campo e-mail de preenchimento obrigatrio, j o campo nome de preenchimento opcional. Para garantir que o campo e-mail seja preenchido vamos associar um controle de validao do tipo RequiredFieldValidator com o campo e-mail. Se o campo email no for preenchido vamos emitir a seguinte mensagem:
O email de preenchimento obrigatrio, por favor fornea o seu email e clique no boto Enviar.

Na Listagem 8.2 temos o cdigo para o exemplo proposto.

Listagem 8.2 O controle de validao RequiredFieldValidator.


<html> <head>

<script language=C# runat=server>

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

CAPTULO 8: VALIDATION SERVER CONTROLS


<form runat=server>

<h3>Exemplo do controle RequiredFieldValidator!!!</h3>

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


id=Summary1" runat=server/>

</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.

Figura 8.3: Todos os dados obrigatrios foram digitados. chap8ex2.aspx.


Deixe o campo e-mail em branco. No campo Nome digite: Jos da Silva. D um clique no boto Enviar. Voc obter o resultado indicado na Figura 8.4. Observe que neste caso o campo de validao detectou que o campo e-mail no foi preenchido e avisou.

www.juliobattisti.com.br

290

CAPTULO 8: VALIDATION SERVER CONTROLS

Figura 8.4: O controle de validao RequiredFieldValidator entrando em ao.


Vamos entender melhor o cdigo da Listagem 8.2. Na seo de cdigo no fizemos absolutamente nada. Somente colocamos o evento Enviar_Click e no corpo do procedimento alguns comentrios. Por exemplo, no corpo deste procedimento poderamos detectar se a validao ocorreu com sucesso para todos os controles e, em caso afirmativo, enviar as informaes digitadas pelo usurio para um banco de dados. Por enquanto ainda no sabemos fazer a conexo com banco de dados. Aprenderemos a conectar com banco de dados a partir do Captulo 10. Na seo de apresentao criamos um formulrio com dois controles (HtmlServerControls) do tipo texto (type=text). Um para o usurio digitar o e-mail e outro para digitar o nome. Queremos que o campo e-mail seja de preenchimento obrigatrio. Para isso utilizamos um controle de validao do tipo RequiredFieldValidator. A insero do controle de validao feita com o trecho de cdigo a seguir:
<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/>

291

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


O atributo mais importante o seguinte:
ControlToValidate=email

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.

Figura 8.5: A validao no cliente, gerada automaticamente para o IE, em ao.

www.juliobattisti.com.br

292

CAPTULO 8: VALIDATION SERVER CONTROLS


Se voc clicar no boto Enviar, estando o campo e-mail em branco tambm ser exibida a mensagem de erro O email de preenchimento obrigatrio, por favor fornea o seu e-mail e clique no boto Enviar. Este texto est definido no atributo ErrorMessge do controle de validao Requer_email e exibido no controle Summary1, que um controle do tipo ValidationSummary, especificamente projetado para exibir mensagens de erro quando algum campo no validado. Com este exemplo j podemos ter uma boa idia do funcionamento dos controles de validao. Se voc voltar para o exemplo da Listagem 8.1, j ter condies de entender grande parte do exemplo. Agora vamos continuar estudando os demais tipos de controle de validao disponveis com o ASP.NET.

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>

Uma sintaxe alternativa 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.

293

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


ErrorMessage=Mensagem de erro. ForeColor=Cor da fonte. BackColor=Cor de segundo plano />

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.

Listagem 8.3 O controle de validao CompareValidator.


<html> <head> <script language=C# runat=server>

void Enviar_Click(Object sender, EventArgs e) {

www.juliobattisti.com.br

294

CAPTULO 8: VALIDATION SERVER CONTROLS


// Cdigo para gravar os dados recebidos no // banco de dados. } </script>

</head> <body>

<form runat=server>

<h3>Exemplo do controle CompareValidator!!!</h3>

<input id=valor type=text size=40 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>

<input type=submit value=Enviar OnServerClick=Enviar_Click runat=server>

</form>

</body> </html>

295

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Digite o cdigo da Listagem 8.3 e salve o mesmo em um arquivo chamado chap8ex3.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/chap8ex3.aspx No campo valor digite 50. D um clique no boto Enviar. Observe que nenhuma mensagem de erro emitida. Agora digite 120 no campo valor. D um clique no boto Enviar. Voc obter uma mensagem de erro, conforme indicado na Figura 8.6.

Figura 8.6: O controle de validao CompareValidator entrando em ao.


Observe que neste caso o campo de validao detectou que o campo valor possui um valor maior do que 100 e a mensagem de erro foi exibida. Vamos comentar a definio de duas propriedades do controle CompareValidator: ValueToCompare=100" : Esta propriedade define um valor constante para comparao com o valor digitado. Operator=LessThan: Nesta propriedade definimos o operador de comparao. No exemplo definimos menor do que (LessThan). Na Tabela 8.1 temos a definio dos operadores permitidos para esta propriedade.

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

CAPTULO 8: VALIDATION SERVER CONTROLS

Valor LessThan LessThanEqual NotEqual

Descrio Menor do que. Menor ou igual a. Diferente.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


ControlToValidate=nome do controle associado MinimumValue=limite inferior da faixa MaximumValue=limite superior da faixa Type=Tipo do valor a ser comparado: string, Int32, Double, etc. ErrorMessage=Mensagem de erro. ForeColor=Cor da fonte. BackColor=Cor de segundo plano > </asp:RangeValidator>

Uma sintaxe alternativa a seguinte:


<asp:RangeValidator id=identificao no cdigo runat=server ControlToValidate=nome do controle associado MinimumValue=limite inferior da faixa MaximumValue=limite superior da faixa Type=Tipo do valor a ser comparado: string, Int32, Double, etc. ErrorMessage=Mensagem de erro. ForeColor=Cor da fonte. BackColor=Cor de segundo plano />

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.

Listagem 8.4 O controle de validao RangeValidator.


<html> <head>

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

CAPTULO 8: VALIDATION SERVER CONTROLS


<script language=C# runat=server>

void Enviar_Click(Object sender, EventArgs e) { // Cdigo para gravar os dados recebidos no // banco de dados. } </script>

</head> <body>

<form runat=server>

<h3>Exemplo do controle RangeValidator!!!</h3>

<input id=valor type=text size=40 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>

<input type=submit value=Enviar OnServerClick=Enviar_Click runat=server>

299

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


</form>

</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.

Figura 8.7: O controle de validao RangeValidator entrando em ao.


Observe que neste caso o campo de validao detectou que o campo valor possui um valor fora da faixa (entre 20 e 50) e a mensagem de erro foi exibida.

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

CAPTULO 8: VALIDATION SERVER CONTROLS


deste tipo, no temos controles prontos, precisamos criar um controle personalizado, utilizando como base o controle CustomValidator e definindo as funes de validao correspondentes. A sintaxe para este controle a seguinte:
<asp:CustomValidator id=identificao no cdigo runat=server ControlToValidate=controle a ser validado ClientValidationFunction=Nome da funo que far a validao para validao no Cliente. OnServerValidate=Nome do procedimento na seo de cdigo da pgina para validao no servidor ErrorMessage=Mensagem de erro ForeColor=Cor do texto da mensagem de erro. BackColor=Cor de segundo plano da mensagem de erro. > </asp:CustomValidator>

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


a validao no servidor definido no atributo OnServerValidate, do controle de validao, conforme indicado no comando a seguir:
OnServerValidate=ServerValidation

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.

Listagem 8.5 O controle de validao CustomValidator.


<%@ Page Language=C# %> <html> <head> <script runat=server>

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

CAPTULO 8: VALIDATION SERVER CONTROLS


// Por isso, dentro da funo ServerValidation, para acessar o valor digitado // no campo a ser validado, utilizamos a seguinte referncia: // args.Value. // Alm disso, utilizamos o mtodo Parse, da estrutura int, para converter // a referncia args.Value, no valor Int32 correspondente.

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>

<h3><font face=Verdana>Exemplo do controle CustomValidator!!</font></h3>

<asp:Label id=lblOutput runat=server Text=Digite um nmero par: Font-Name=Verdana Font-Size=10pt /><br> <p>

<asp:TextBox id=Text1" runat=server /> &nbsp;&nbsp;

303

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


<asp:CustomValidator id=CustomValidator1" ControlToValidate=Text1" OnServerValidate=ServerValidation Display=Static ErrorMessage=No um nmero par! ForeColor=green Font-Name=verdana Font-Size=10pt runat=server/> <p>

<asp:Button id=Button1" Text=Validar OnClick=ValidateBtn_OnClick runat=server/> </form>

</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

CAPTULO 8: VALIDATION SERVER CONTROLS

Figura 8.8: O controle de validao CustomValidator entrando em ao.


Tambm utilizamos dois controles do tipo Web Server Controls, para o campo de digitao e para o boto Validar. No Captulo 8 aprenderemos a utilizar os Web Server Controls. Utilizamos o evento Click do boto Validar, para determinar se a pgina foi validada ou no. Apenas para lembrar, a propriedade IsValid do objeto Page somente True quando todos os controles da pgina passarem no teste de validao; basta que um nico controle no seja validado, para que a propriedade Page.IsValid se torne False.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


BackColor=Cor de segundo plano da fonte da mensagem de erro. > </asp: RegularExpressionValidator>

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.

Listagem 8.6 O controle de validao CustomValidator.


<html> <head> <script language=C# runat=server>

void Enviar_Click(Object sender, EventArgs e) { // Cdigo para gravar os dados recebidos no // banco de dados.

</script>

</head> <body>

<form runat=server>

<h3>Exemplo do controle RegularExpressionValidator!!!</h3>

www.juliobattisti.com.br

306

CAPTULO 8: VALIDATION SERVER CONTROLS


<input id=cpf type=text size=40 runat=server>

<BR> <BR> <B>

<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 />

</B> <BR> <BR> <input type=submit value=Enviar OnServerClick=Enviar_Click runat=server> </form>

</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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


O [0-9] indica que o caractere digitado deve ser um valor entre 0 e 9. O {3} entre chaves indica que os trs primeiros caracteres devem estar entre 0 e 9. Todo caractere que deve ser digitado diretamente deve ser precedido de uma barra invertida. o caso do ponto que deve ser digitado aps os trs primeiros nmeros. Utilizando este mesmo raciocnio, definimos o restante da expresso.

Figura 8.9: O controle de validao RegularExpressionValidator entrando em ao.


Apenas para exemplificar, coloco como ficaria uma expresso para o CEP:
ValidationExpression=[0-9]{5}\-[0-9]{3}

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

CAPTULO 9: WEB FORM CONTROLS

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


ListBox Table, TableCell e TableRow Panel Image HyperLink LinkButton ImageButton Estes controles nos do acesso a um grande nmero de propriedades e eventos, o que permite um controle bastante preciso sobre o layout e a funcionalidade de uma pgina ASP.NET, o que justifica a existncia de mais um conjunto de controles, alm do conjunto dos HTML Server Controls. medida que formos estudando os diversos controles, iremos apresentar exemplos de utilizao dos mesmos.

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#.

A Classe Bsica WebControl


A classe WebControl, do namespace System.Web.UI.WebControls, a classe da qual so derivados os controles que iremos estudar neste captulo. Esta classe define os mtodos, eventos e propriedades comuns a todos os controles pertencentes ao namespace System.Web.UI.WebControls. Por serem derivados da classe WebControl, estes controles iro herdar suas propriedades e mtodos pblicos. Estudaremos as principais propriedades e mtodos da classe WebControl.

Principais Propriedades da Classe WebControl


Na Tabela 9.1 temos a descrio das principais propriedades da classe WebControl.

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

CAPTULO 9: WEB FORM CONTROLS

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

Font ForeColor Height Style TabIndex

ToolTip Visible Width

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.

Principais Mtodos da Classe WebControl


Na Tabela 9.2 temos a descrio dos principais mtodos da classe WebControl.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Propriedade DataBind Equals FindControl HasControls ToString

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.

Principais Eventos da Classe WebControl


Na Tabela 9.3 temos a descrio dos principais eventos da classe WebControl.

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.

Agora vamos passar ao estudo de cada controle, individualmente.

TextBox Web Server Control


Este controle utilizado para criar uma caixa de texto para digitao de texto. Podemos criar uma caixa de texto de uma nica linha ou de mltiplas linhas (o que crivamos utilizando um HTMLTextArea Server Control). Por padro, a propriedade TextMode definida como SingleLine, o que significa que o controle tem uma nica linha. Para definir este controle com mltiplas linhas, devemos definir a propriedade TextMode para MultiLine. Tambm podemos definir esta propriedade com o valor Password, para criar um texto para digitao de senhas, onde so exibidos apenas asteriscos enquanto o usurio digita a senha.

www.juliobattisti.com.br

312

CAPTULO 9: WEB FORM CONTROLS


A largura da caixa de texto definida pela propriedade Columns. Se a caixa de texto for de mltiplas linhas, a sua altura def inida pela propriedade Rows. Este controle derivado da classe TextBox, do namespace System.Web.UI.WebControls. A sintaxe para este controle a seguinte:
<asp:TextBox id=value AutoPostBack=True|False Columns=Nmero de colunas MaxLength=Tamanho mximo do texto a ser digitado Rows=Nmero de linhas. Text=Texto para a caixa de digitao. TextMode=Single | Multiline | Password Wrap=True|False OnTextChanged=OnTextChangedMethod runat=server />

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)

Exibe.Value = Nome.Text + \n + Seus comentrios: + \n + Comentrios.Text; }

</script>

<body>

<form method=post runat=server> <H2> Exemplo do controle TextBox!!</H2>

<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

CAPTULO 9: WEB FORM CONTROLS


<td><h3>Senha:</h3> </td> <td> <asp:TextBox runat=server id=Senha Text= Font_Face=Arial Font_Size=3" BackColor=Cyan ForeColor=Blue BorderColor=Green TextMode=Password Columns=40" />

</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>

<tr> <td><h3>Voc digitou:</h3></td>

315

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


<td><textarea id=Exibe cols=40" rows=5" runat=server /></td> </tr>

<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

CAPTULO 9: WEB FORM CONTROLS

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Label Web Server Control


Este controle utilizado para exibir texto em um formulrio. Podemos acessar suas propriedades e mtodos, inclusive alterar o texto do controle, atravs de programao. A sintaxe para este controle a seguinte:
<asp:Label id=identificao_no_cdigo Text=Texto a ser exibido runat=server/>

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.

Listagem 9.2 O controle Label chap9ex2.aspx.


<html> <script language=C# runat=server>

public void {

Enviar_Click(Object sender,EventArgs e)

Rotulo1.Text=Este o texto modificado; }

</script>

<body>

<form method=post runat=server>

www.juliobattisti.com.br

318

CAPTULO 9: WEB FORM CONTROLS


<H2> Exemplo do controle Label!!</H2>

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 9.2: Utilizando o controle Label chap9ex2.aspx.

CheckBox Web Server Control


Este controle utilizado para a criao de um controle do tipo caixa de seleo. Este tipo de controle pode assumir dois estados: marcado ou no marcado. Ao clicar no controle, o seu estado alterado, isto , se estiver marcado, ele ser desmarcado; se estiver desmarcado, ele ser marcado. O evento CheckedChanged disparado quando o formulrio enviado para o servidor e o status (marcado/desmarcado) do controle foi alterado em relao ao ltimo envio do formulrio. A sintaxe para este controle a seguinte:
<asp:CheckBox id=identificao_no_cdigo AutoPostBack=True|False Text=Rtulo de texto associado ao controle. TextAlign=Right|Left Checked=True|False OnCheckedChanged=Mtodo que ser executado em resposta ao evento OnCheckedChanged runat=server />

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

CAPTULO 9: WEB FORM CONTROLS


Vamos apresentar um exemplo de utilizao do controle CheckBox. O nosso exemplo constitudo de um formulrio no qual temos trs controles do tipo CheckBox, onde o usurio pode selecionar um ou mais controles. Ao clicar no boto Enviar, o evento Click deste boto informa, em um controle do tipo Label, quais as opes selecionadas. Na Listagem 9.3 temos o cdigo para o exemplo proposto.

Listagem 9.3 O controle CheckBox chap9ex3.aspx.


<html> <script language=C# runat=server>

public void {

Enviar_Click(Object sender,EventArgs e)

//Declarao das variveis auxiliares

String Aux=Opes selecionadas:

// Comeo a montar uma string que ser atribuda // propriedade Value do controle Dados.

if (Negcios.Checked==true) { Aux= Aux +Negcios } ;

if (Direito.Checked==true) { Aux= Aux +Direito } ;

if (Economia.Checked==true) { Aux= Aux +Economia } ;

Exibe.Text = Aux;

321

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


}

</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

CAPTULO 9: WEB FORM CONTROLS


<tr> <td><B>Opo 3:</B> </td> <td> <asp:CheckBox id=Economia runat=server Text=Economia AutoPostBack=True /> </td> </tr>

<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>

</form> </body> </html>

323

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Digite o cdigo da Listagem 9.3 e salve o mesmo em um arquivo chamado chap9ex3.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/chap9ex3.aspx Ao carregar a pgina ser exibido um formulrio com trs controles do tipo CheckBox, o boto Enviar e um controle do tipo Label. Selecione as opes Negcios e Economia. D um clique no boto Enviar. As opes selecionadas sero informadas em um controle do tipo Label, conforme indicado na Figura 9.3.

Figura 9.3: Utilizando o controle CheckBox chap9ex3.aspx.


Neste exemplo estamos utilizando a propriedade Checked para verificar se o controle foi ou no selecionado. No final do procedimento Enviar_Click, definimos o texto do controle do tipo Label, como sendo igual ao contedo da varivel Aux. Observe que para fazer esta definio utilizamos a propriedade Text, conforme indicado no comando a seguir:
Exibe.Text = Aux;

RadioButton Web Server Control


Este controle utilizado para a criao de controles do tipo Boto de rdio. Estes controles so criados em grupos, sendo que somente um dos controles do grupo pode ser selecionado. Para criar um grupo de controles do tipo RadioButton, devemos definir o mesmo valor para a propriedade GroupName, de todos os controles que fazem parte do grupo.

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

CAPTULO 9: WEB FORM CONTROLS


O Controle RadioButton Web Server Control derivado da classe base RadioButton, do namespace System.Web.UI.WebControls. A sintaxe para este controle a seguinte:
<asp:RadioButton id=Identificao_no_cdigo AutoPostBack=True|False Checked=True|False GroupName=Nome do Grupo. Text=Rtulo de texto que identifica o controle TextAlign=Right|Left OnCheckedChanged=Mtodo que ser executado em resposta ao evento OnCheckedChanged runat=server /> Considere o trecho de cdigo a seguir: <asp:RadioButton id=Carto Text=Carto de Crdito: Checked=True GroupName=GrupoPagamento runat=server />

<asp:RadioButton id=Transferncia Text=Transferncia Eletrnica: GroupName=GrupoPagamento runat=server/>

<asp:RadioButton id=Boleto Text=Boleto Bancrio GroupName=GrupoPagamento runat=server/>

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 9.4: Grupo de Controles do tipo RadioButton GrupoPagamento.


Para verificar qual opo foi selecionada, podemos utilizar a propriedade Checked de cada controle, conforme indicado no seguinte trecho de cdigo:
if (Carto.Checked) { Label1.Text = Voc selecionou: + Carto.Text; } else if (Transferncia.Checked) { Label1.Text = Voc selecionou: + Transferncia.Text; } else if (Boleto.Checked) { Label1.Text = Voc selecionou: + Boleto.Text; }

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:.

Button Web Server Control


Este controle utilizado para criar um boto de comando em um formulrio. Podemos criar dois tipos diferentes de botes, com este controle: Boto Enviar (Submit) Boto de Comando (Command) Um boto do tipo Enviar no tem um nome de comando (definido pela propriedade CommandName) associado com o boto. Este boto simplesmente envia a pgina para processamento no servidor. Por padro, um controle Button do tipo Enviar. Podemos definir um procedimento que executa em resposta ao evento Click do boto, como j fizemos em diversos exemplos deste livro.

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

CAPTULO 9: WEB FORM CONTROLS


Um boto do tipo Command possui um nome de comando associado com o boto, nome este que definido na propriedade CommandName do controle. Isso permite que sejam criados mltiplos controles do tipo Button, em um formulrio (Web Form) de uma pgina ASP.NET. Atravs de cdigo podemos determinar qual o boto que foi clicado e, para cada boto, podemos definir o cdigo que ser executado em resposta ao evento Click do boto. A sintaxe para este controle a seguinte:
<asp:Button id=Identificao_no_cdigo Text=Texto exibido no boto CommandName=Nome de comando. Define o controle como sendo do tipo Command CommandArgument=Define ou retorna os argumentos passados para o mtodo Command. OnClick=Mtodo que executado em resposta ao evento Click do boto. runat=server />

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Podemos alterar as aparncias de qualquer controle, utilizando a sua propriedade Style. Atravs desta propriedade, podemos controlar os diversos aspectos visuais de um controle. A seguir temos um exemplo de utilizao desta propriedade:
<asp:Button id=Enviar Text=Enviar style=color:White; background-color:Black; border-color:Red; border-width:6px; border-styke:Double; OnClick=Enviar_Click runat=server />

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;

Este controle produz o resultado indicado na Figura 9.5.

Figura 9.5: Usando a propriedade Style.

www.juliobattisti.com.br

328

CAPTULO 9: WEB FORM CONTROLS

ListBox Web Server Control


Este controle utilizado para criar uma lista de seleo, onde podemos selecionar um ou mais elementos. Para definir o nmero de elementos que so exibidos, simultaneamente, devemos definir a propriedade Rows. Por padro, exibida uma lista de uma nica linha. Para habilitar a seleo de mltiplos elementos da lista, devemos definir a propriedade SelectionMode=Multiple. Para adicionar elementos lista de elementos do controle ListBox, utilizamos o controle ListItem, conforme veremos no exemplo mais adiante. A sintaxe para este controle a seguinte:
<asp:ListBox id=Identificao_no_cdigo DataSource=<% Expresso para conexo com uma fonte de dados %> DataTextField=Nome do campo DataValueField=Valor do campo AutoPostBack=True|False Rows=Nmero de linhas do controle SelectionMode=Single|Multiple OnSelectedIndexChanged=Mtodo que ser executado em resposta ao evento. runat=server>

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

<asp:ListItem value=value selected=True|False> Texto do item. </asp:ListItem>

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.

Listagem 9.4 O controle ListBox chap9ex4.aspx.


<html> <head> <script language=C# runat=server>

329

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


void Enviar_Click(Object sender, EventArgs e) { if (ListBox1.SelectedIndex > -1) Label1.Text= O primeiro item que voc selecionou foi: + ListBox1.SelectedItem.Text; } </script> </head> <body>

<form runat=server> <h3><font face=Verdana>Exemplo do controle ListBox!!</font></h3>

<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>

<asp:Label id=Label1" Font-Name=Verdana Font-Size=10pt

www.juliobattisti.com.br

330

CAPTULO 9: WEB FORM CONTROLS


runat=server/> </form>

</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.

Figura 9.6: Utilizando o controle ListBox chap9ex4.aspx.


No evento Click, do boto Enviar, utilizamos o seguinte cdigo, para informar o primeiro item selecionado:
void Enviar_Click(Object sender, EventArgs e) { if (ListBox1.SelectedIndex > -1) Label1.Text= O primeiro item que voc selecionou foi: + ListBox1.SelectedItem.Text; }

O comando ListBox1.SelectedItem.Text que retorna o texto do primeiro item selecionado.

Table, TableCell e TableRow Web Server Controls


Este controles so utilizados para a criao de tabelas em uma pgina .aspx. So semelhantes aos Html Server Controls: HtmlTable, HtmlTableRow e HtmlTableCell, porm oferecem mais opes de propriedades, mtodos e eventos. Podemos construir uma tabela de tamanho fixo (nmero de linhas e colunas), ou podemos construir a tabela dinamicamente, atravs de cdigo de programao. Porm as modificaes nas linhas e colunas da tabela sero perdidas quando a pgina for

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


A sintaxe para este controle a seguinte:
<asp:Table id=Identificao_no_cdigo BackImageUrl=Endereo da imagem de segundo plano. CellSpacing=Distncia, em pixels, entre as bordas das clulas e o contedo. CellPadding= Distncia, em pixels, entre as clulas da tabela. GridLines=None|Horizontal|Vertical|Both HorizontalAlign=Center|Justify|Left|NotSet|Right runat=server > <asp:TableRow>

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:TableCell> Texto da Clula. </asp:TableCell>

</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:TableCell> Texto da clula. </asp:TableCell>

</asp:TableRow>.

www.juliobattisti.com.br

332

CAPTULO 9: WEB FORM CONTROLS


A propriedade HorizontalAlign define o alinhamento horizontal do contedo da clula, em relao clula; a propriedade VerticalAlign define o alinhamento vertical do contedo da clula, em relao clula. Para adicionarmos clulas (colunas) a uma linha da tabela, utilizamos o controle TableCell. Uma linha formada por uma coleo de clulas (Cells). Sintaxe para o controle TableCell:
<asp:TableCell id=Identificao_no_cdigo ColumnSpan=Nmero de colunas a ser mescladas. RowSpan=Nmero de linhas a ser mescladas. HorizontalAlign=Center|Justify|Left|NotSet|Right VerticalAlign=Bottom|Middle|NotSet|Top Wrap=True|False runat=server> Texto da Clula. </asp:TableCell>

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.

Listagem 9.5 Os controles Table, TableRow e TableCell chap9ex5.aspx.


<%@ Page Language=C# %> <html> <head>

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.

<script runat=server> void Page_Load(Object sender, EventArgs e)

{ // Declaro duas variveis.

333

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


// numrows contm o nmero de linhas. // numcells contm o nmero de colunas.

int numrows = 3; int numcells = 2;

// 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++) {

// Para cada passagem do lao externo, adiciono uma nova linha.

TableRow r = new TableRow();

for (int i=0; i<numcells; i++) {

// Para cada passagem do lao interno, adiciono uma nova clula.

TableCell c = new TableCell();

c.Controls.Add(new LiteralControl(linha + j.ToString() + + i.ToString())); r.Cells.Add(c); } Table1.Rows.Add(r); } } </script>

, coluna

</head> <body>

<form runat=server>

<h3><font face=Verdana>Exemplo de tabela dinmica!!</font></h3>

www.juliobattisti.com.br

334

CAPTULO 9: WEB FORM CONTROLS


<asp:Table id=Table1" GridLines=Both HorizontalAlign=Center style=color:White; background-color:Black; border-color:Red; border-width:6px; border-style:Double; Font-Name=Verdana Font-Size=8pt CellPadding=15" CellSpacing=0" runat=server />

</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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 9.7: Utilizando os controles Table, TableRow e TableCell chap9ex5.aspx.


que foi passado como parmetro para o controle executado e o resultado da execuo inserido no local do controle. Vamos acompanhar o que acontece para a primeira passada do lao externo e a primeira passada do lao interno, em outras palavras:
j=0 i=0

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));

Ao processar todo este comando, retornado apenas o argumento entre aspas:


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

CAPTULO 9: WEB FORM CONTROLS


Para finalizar, gostaria de lembrar que mais uma vez utilizamos a propriedade style, para definir alguns aspectos visuais do controle Table, conforme indicado no fragmento a seguir:
<asp:Table id=Table1" GridLines=Both HorizontalAlign=Center style=color:White; background-color:Black; border-color:Red; border-width:6px; border-style:Double; Font-Name=Verdana Font-Size=8pt CellPadding=15" CellSpacing=0" runat=server />

Panel Web Server Control


Este controle funciona como um Conteiner para outros controles; ao ser processado gerada uma clusula HTML <DIV>. Utilizamos este controle quando precisamos adicionar controles pagina, dinamicamente atravs de programao, ou quando precisamos ocultar e exibir um grupo de controles atravs do cdigo de programao. Por exemplo, vamos supor que voc queira que um conjunto de controles somente seja visvel quando o valor de um determinado valor de uma caixa de combinao seja selecionado. Neste caso voc pode colocar os diversos controles em um controle Panel e tornar o controle Panel no visvel. Quando um valor selecionado na caixa de combinao, utilizamos um evento associado a esta seleo para detectar qual foi o valor selecionado. Dependendo do valor selecionado, podemos tornar True a propriedade Visible do controle Panel; com isso todos os controles que foram colocados no controle Panel tambm sero exibidos. A sintaxe para este controle a seguinte:
<asp:Panel id=Identificao_no_cdigo BackImageUrl=endereo da imagem de segundo plano. HorizontalAlign=Center|Justify|Left|NotSet|Right Wrap=True|False runat=server> Outros controles que tero o controle Panel como Container. </asp:Panel>

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Vamos analisar um exemplo retirado da documentao do Framework .NET. Neste exemplo apresentado um formulrio com os seguintes controles: Um controle Panel, com uma linha de texto de contedo esttico. Durante o processamento da pgina, mais especificamente, durante o evento Load da pgina, vamos adicionar controles a este Panel, utilizando programao. Dois controles do tipo DrowpDownList (Caixa de Combinao). Em um controle, o usurio seleciona o nmero de rtulos a serem inseridos no Panel (de 0 a 4 rtulos). Em outro controle o usurio seleciona o nmero de Caixas de texto a serem inseridas no Panel. Um controle do tipo CheckBox que estiver marcado faz com que o Panel seja ocultado, o que tambm oculta todos os controles adicionados ao Panel. Na Listagem 9.6 temos o cdigo para o exemplo proposto.

Listagem 9.6 O controle Panel chap9ex6.aspx.


<%@ Page Language=C# %>

<html> <head> <script runat=server> void Page_Load(Object sender, EventArgs e) {

// Exibe/Oculta o controle Panel.

if (Check1.Checked) { Panel1.Visible=false; } else { Panel1.Visible=true; } // Adiciona controles do tipo Label ao controle Panel.

int numlabels = Int32.Parse(DropDown1.SelectedItem.Value);

for (int i=1; i<=numlabels; i++) {

www.juliobattisti.com.br

338

CAPTULO 9: WEB FORM CONTROLS


// O nome da varivel do tipo Label um ele (l) e no o nmero um (1).

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.

int numtexts = Int32.Parse(DropDown2.SelectedItem.Value);

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.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


> Panel1: Contedo esttico, definido no prprio controle <p> </asp:Panel> <p>Adicionar quantos rtulos?:

<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>

<br> Adicionar quantas caixas de texto?:

<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

CAPTULO 9: WEB FORM CONTROLS


Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex6.aspx carregado o formulrio com o controle Panel, dois controles Caixa de Combinao e um controle do tipo CheckBox, alm do boto enviar, evidentemente. Voc vai obter o resultado indicado na Figura 9.8.

Figura 9.8: Utilizando o controle Panel chap9ex6.aspx.


Na lista Adicionar quantos rtulos?, selecione 3. Na lista Adicionar quantas caixas de texto?, selecione 2. Certifique-se de que a opo Ocultar Painel esteja desmarcada. D um clique no boto Enviar; voc obter os resultados indicados na Figura 9.9. Agora marque a opo Ocultar Painel e d um clique no boto Enviar. Observe que o controle Panel foi ocultado e tambm todos os controles a ele adicionados.

341

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Alguns comentrios sobre o cdigo: No incio do procedimento Load, testamos se o controle Check1 foi selecionado. Em caso afirmativo, tornamos a propriedade Visible do controle Panel1 igual a False. Isso faz com que o controle Panel e todos os seus controles sejam ocultados.

Figura 9.9: Controles adicionados dinamicamente, atravs do evento Load da pgina.


Para adicionar o nmero de rtulos e o nmero de caixas de texto selecionados pelo usurio, utilizamos o evento Load da pgina. O cdigo para adicionar rtulos o seguinte:
int numlabels = Int32.Parse(DropDown1.SelectedItem.Value); for (int i=1; i<=numlabels; i++) { Label l = new Label(); l.Text = Rtulo + (i).ToString();

www.juliobattisti.com.br

342

CAPTULO 9: WEB FORM CONTROLS


l.ID = Rtulo + (i).ToString(); Panel1.Controls.Add(l); Panel1.Controls.Add(new LiteralControl(<br>)); }

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.

Image Web Server Control


Este controle utilizado para adicionar imagens em uma pgina ASP.NET. Podemos definir um texto que ser exibido no lugar da imagem, se por algum motivo o arquivo da imagem no estiver disponvel. Para definir este texto utilizamos a propriedade AlternateText. A sintaxe para este controle a seguinte:
<asp:Image id=Identificao_no_cdigo runat=server ImageUrl=Endereo onde est a figura a ser incorporada na pgina. AlternateText=Texto ImageAlign=NotSet|AbsBottom|AbsMiddle|BaseLine|Bottom|Left|Middle|Right|TextTop|Top />

Na Listagem 9.7 temos um pequeno exemplo de utilizao do controle Image.

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

CAPTULO 9: WEB FORM CONTROLS

Figura 9.10: Utilizando o controle Image chap9ex7.aspx.

HyperLink Web Server Control


Este controle utilizado para a criao de links em uma pgina ASP.NET. Por ser um controle do tipo Web Server Control, temos acesso a uma srie de mtodos e eventos do controle HyperLink. A sintaxe para este controle a seguinte:
<asp:HyperLink id=Identificao_no_cdigo. NavigateUrl=Endereo de destino do link. Text=Texto do link ImageUrl=Imagem de destino do link, se for o caso. Target=Onde o destino ser aberto, especialmente til, quando utilizamos frames. runat=server /> ou

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


<asp:HyperLink id=Identificao_no_cdigo. NavigateUrl=Endereo de destino do link. ImageUrl=Imagem de destino do link, se for o caso. Target=Onde o destino ser aberto, especialmente til, quando utilizamos frames. runat=server

Texto do Link.

</asp:HyperLink>

Na Listagem 9.8 temos um pequeno exemplo de utilizao do controle HyperLink.

Listagem 9.8 O controle HyperLink chap9ex8.aspx.


<html> <head> </head> <body> <h3><font face=Verdana>Exemplo do controle HyperLink. </font></h3> <B>Clique no link abaixo:</B> <br> <br> <asp:HyperLink id=hyperLink1" ImageUrl=livrosql2000.jpg NavigateUrl=http://http://www.axcel.com.br/descricao.cfm?id_livro=202" Text=SQL Server 2000 - Curso Completo!! Target=_new runat=server style=color:White; background-color:Black; border-color:Red; border-width:6px; border-style:Double; />

</body> </html>

www.juliobattisti.com.br

346

CAPTULO 9: WEB FORM CONTROLS


Digite o cdigo da Listagem 9.8 e salve o mesmo em um arquivo chamado chap9ex8.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/chap9ex8.aspx Voc vai obter o resultado indicado na Figura 9.11.

Figura 9.11: Utilizando o controle HyperLink chap9ex8.aspx.


Neste caso, a figura o link. Ao clicar na figura ser aberta uma nova janela (conforme definido na propriedade target=_new), onde ser carregada a pgina definida na propriedade NavigateUrl=http://http://www.axcel.com.br/ descricao.cfm?id_livro=202.

LinkButton Web Server Control


Este controle utilizado para a criao de um controle com aparncia de link e com funcionalidade de boto. Este controle pode ser do tipo Submit ou do tipo Command.

347

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Um LinkButton do tipo Enviar no tem um nome de comando (definido pela propriedade CommandName) associado com o boto. Este boto simplesmente envia a pgina para processamento no servidor. Por padro um controle Button do tipo Enviar. Podemos definir um procedimento que executa em resposta ao evento Click do boto, como j fizemos em diversos exemplos deste livro. Um LinkButton do tipo Command possui um nome de comando associado com o boto, nome este que definido na propriedade CommandName do controle. Isso permite que sejam criados mltiplos controles do tipo LinkButton, em um formulrio (Web Form) de uma pgina ASP.NET. Atravs de cdigo podemos determinar qual o boto que foi clicado e, para cada boto, podemos definir o cdigo que ser executado em resposta ao evento Click do respectivo boto. A sintaxe para este controle a seguinte:
<asp:LinkButton id=Identificao_no_cdigo Text=Texto do LinkButton Command= Nome de comando. Define o controle como sendo do tipo Command CommandArgument=CommandArgument OnClick=Mtodo que executa em resposta ao evento Click do controle. runat=server/>

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>

Na Listagem 9.9 temos um pequeno exemplo de utilizao do controle LinkButton.

Listagem 9.9 O controle LinkButton chap9ex9.aspx.


<html> <head> <script language=C# runat=server>

www.juliobattisti.com.br

348

CAPTULO 9: WEB FORM CONTROLS


void LinkButton1_Click(Object sender, EventArgs e) { Label1.Text=Voc clicou em um controle LinkButton; }

</script>

</head> <body> <form runat=server>

<h3><font face=Verdana>Exemplo do controle LinkButton!!</font></h3>

<asp:LinkButton id=LinkButton1" Text=Clique, por favor! Font-Name=Verdana Font-Size=14pt OnClick=LinkButton1_Click runat=server /> <BR> <BR>

<asp:Label id=Label1" runat=server /> </form> </body> </html>

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 9.12: Utilizando o controle LinkButton chap9ex9.aspx.


Observe que podemos definir um mtodo em resposta ao evento Click do controle LinkButton, conforme descrevemos antes: Aparncia de Link e funcionalidade de boto.

ImageButton Web Server Control


Este controle utilizado para detectar a regio de uma determinada imagem, onde o usurio clicou com o mouse. Com isso podemos criar a mesma funcionalidade de uma imagem mapeada, no HTML. Utilizamos o evento OnClick para determinar as coordenadas onde o usurio clicou na imagem. Com isso, dependendo do valor das coordenadas onde o usurio clicou, podemos tomar diferentes aes, como, por exemplo, carregar diferentes endereos. Com isso estamos criando, na prtica, uma imagem mapeada, onde diferentes regies da imagem esto vinculadas a diferentes endereos. Podemos utilizar o evento OnCommand para fazer com que a imagem tenho o mesmo comportamento de um boto de comando. Podemos associar um nome de comando com o boto, nome este que definido na propriedade CommandName do controle. Isso permite que sejam criados mltiplos controles do tipo LinkButton, em um formulrio (Web Form) de uma pgina ASP.NET. Atravs de cdigo podemos determinar qual o boto que foi clicado e, para cada boto, podemos definir o cdigo que ser executado em resposta ao evento Click do respectivo boto. A sintaxe para este controle a seguinte:
<asp:ImageButton id=Identificao_no_cdigo ImageUrl=Endereo do arquivo de imagem.

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

CAPTULO 9: WEB FORM CONTROLS


Command=Command CommandArgument=CommandArgument OnClick=Mtodo que ser executado em resposta ao evento Click do controle. runat=server />

Na Listagem 9.10 temos um exemplo de utilizao do controle ImageButton.

Listagem 9.10 O controle ImageButton chap9ex10.aspx.


<%@ Page Language=C# %> <html> <head>

<script runat=server>

void ImageButton_Click(object Source, ImageClickEventArgs e)

{ Label1.Text=Voc clicou nas seguintes coordenadas: + ( + e.X.ToString() + , + e.Y.ToString() + ); } </script> </head>

<body> <form runat=server>

<h3><font face=Verdana>Exemplo do controle ImageButton!! </font></h3> <B>Clique em qualquer ponto da imagem.</B>

<br> <br>

<asp:ImageButton id=imagebutton1" AlternateText=Axcel Books.

351

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


ImageAlign=left ImageUrl=livrosql2000.jpg OnClick=ImageButton_Click runat=server />

<br> <br>

<asp:Label id=Label1" runat=server />

</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( )

NOTA: A origem das coordenadas (0,0) no canto superior esquerdo.

Para acessar a coordenada Y, utilizamos o seguinte comando:


e.Y.ToString( )

www.juliobattisti.com.br

352

CAPTULO 9: WEB FORM CONTROLS

Figura 9.13: Utilizando o controle ImageButton chap9ex10.aspx.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


LinkButton ImageButton A principal questo que pode surgir a seguinte: Por que precisamos de mais um conjunto de controles, se j temos os HtmlServer Controls e os Validation Server Controls (que na verdade fazem parte dos Web Server Controls)? O principal motivo, conforme foi ressaltado durante o captulo, que os Web Form Controls fornecem um conjunto mais rico e variado de propriedades, mtodos e eventos do que os HtmlServer Controls. Esta variedade de mtodos, propriedades e eventos permite a criao de pginas ASP.NET mais sofisticadas e nas quais temos um controle apurado sobre os elementos da pgina, controle esse exercido atravs de cdigo de programao. Agora j conhecemos os elementos bsicos do Framework .NET (Captulos 1 e 2), os elementos bsicos da linguagem C# (Captulos 3, 4 e 5) e os elementos bsicos para a criao de pginas ASP.NET (Captulos 7, 8 e 9). A partir do prximo captulo vamos estudar a conexo de pginas ASP.NET com diversas fontes de dados, atravs da utilizao de ADO.NET.

www.juliobattisti.com.br

354

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


ADO.NET. Esta convivncia entre as tecnologias, facilita a migrao das pginas criadas com ASP 3.0 para ASP.NET, uma vez que as pginas ASP 3.0 continuaro funcionando, mesmo aps a instalao do Framework .NET. Como acessar bancos de dados a partir de pginas ASP.NET o assunto deste captulo. Vamos apresentar os namespaces onde esto as classes para acesso a dados. Iremos estudar as principais classes destes namespaces. Tambm aprenderemos a acessar bancos de dados do Microsoft SQL Server e do Microsoft Access. Veremos como apresentar os dados obtidos, utilizando os novos controles do ASP.NET. Veremos diversos exemplos de utilizao das classes estudadas. Sempre que for pertinente, faremos a comparao entre a maneira como uma determinada operao realizada com ASP 3.0 e a maneira como passamos a realizar a mesma operao com ASP.NET. O contedo visto neste captulo a base para os assuntos apresentados nos Captulos 11 e 12.

Uma Viso Geral do Acesso a Dados


Existe uma frase que resume bem a necessidade de acesso a dados: A informao certa, para a pessoa certa, na quantidade certa e no momento certo. Esta frase apresenta alguns aspectos importantes: A informao certa: A informao deve estar correta, isto , deve ser confivel. A informao utilizada para a tomada de decises, nos mais variados nveis de uma empresa. Se a informao estiver incorreta, as decises sero equivocadas e no iro gerar os resultados esperados. Pior do que no ter a informao ter informao incorreta, no confivel. Para a pessoa certa: Independente do nvel hierrquico, quer seja o operrio da fbrica ou o presidente da empresa, todos precisam de informao para trabalhar e alcanar os resultados desejados. A informao correta precisa estar disposio para as pessoas que dela necessitam. Na quantidade certa: Informao demais tambm um problema e pode atrapalhar ao invs de ajudar. E hoje as informaes vm das mais diversas fontes. Internet, e-mail, relatrios, banco de dados da empresa, arquivos do Office, jornais, revistas, livros, manuais tcnicos. Precisamos garimpar as informaes que realmente so necessrias ao nosso trabalho. No momento certo: Este um aspecto fundamental. Lembro-me da poca em que somente tnhamos o Mainframe e um bando de terminais espalhados pela empresa. Voc solicitava um novo relatrio para a turma do CPD. Duas semanas depois vinha o relatrio. Hoje, evidentemente, esta situao inaceitvel. Precisamos da informao instantnea, sempre disposio. Quando as empresas comearam a descentralizar seus ambientes computacionais, passando do modelo Mainframe/ Terminal para um modelo Cliente/Servidor com redes locais, novas possibilidades, e tambm problemas, comearam a surgir. Bancos de dados departamentais no integrados, diferentes formatos de dados, aplicaes Cliente/Servidor rodando em cada estao de trabalho, etc., isso fez com que a informao ficasse distribuda por toda a empresa e no mais centralizada no Mainframe.

www.juliobattisti.com.br

356

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


Um ambiente descentralizado mais flexvel, mas em contrapartida mais difcil de se gerenciar e de manter o controle. medida que o volume de informaes comeou a crescer, ficou difcil ter acesso aos dados de diferentes departamentos de uma maneira consistente e rpida. Na Figura 10.1 temos uma pequena ilustrao deste ambiente: Alm de mltiplas fontes de dados, temos diferentes formatos de dados. Evidentemente que a estrutura de um arquivo de mensagens de correio muito diferente da estrutura de uma planilha do Excel, por exemplo. Para que possamos criar aplicaes que acessam dados de diversas fontes, precisamos de tecnologias capazes de acessar dados de fontes to diversas como o Mainframe e um documento do Microsoft Word ou uma planilha do Microsoft Excel. O Framework .NET fornece, principalmente atravs do namespace System.Data, uma srie de classes para conexo e manipulao de dados dos mais variados formatos. Este conjunto de classes tambm conhecido como ADO.NET. Neste captulo vamos estudar as classes que do acesso a fontes de dados estruturadas, que seguem o modelo de dados relacionais. Podemos citar como exemplos de bancos de dados relacionais o Microsoft Access, o SQL Server 2000, o ORACLE, o DB2 da IBM, etc.

Figura 10.1: Dados de mltiplas e heterogneas fontes.

NOTA: Para maiores detalhes sobre o modelo de dados relacionais, consulte o Anexo II.

357

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Quais as Principais Diferenas do ADO.NET em Relao ao ADO?


Com ADO estabelecamos uma conexo com uma fonte de dados e utilizvamos, ou o mtodo Open do Objeto Connection, ou um objeto do tipo Command, para executar um comando SQL e retornar dados, no formato de uma tabela, para um objeto do tipo Recordset. A caracterstica principal que, para trabalhar com os dados e fazer alteraes nos mesmos, precisamos estabelecer uma conexo com o banco de dados. Com ADO.NET temos um modelo de dados desconectado. O protocolo HTTP conhecido como Connection Less. Ao solicitar uma pgina, estabelecida uma conexo com o servidor Web; os arquivos e imagens necessrios so solicitados e enviados para o navegador do cliente e a conexo fechada. Por isso o termo Connection Less, pois no mantida uma conexo permanente entre o servidor Web e o navegador do cliente. Esta natureza desconectada da Web causa alguns inconvenientes quando desenvolvemos aplicaes de banco de dados. ADO.NET resolve este problema, fornecendo uma srie de objetos que permitem que os dados, uma vez carregados para o navegador do cliente, sejam manipulados, mesmo sem existir uma conexo permanente com o banco de dados. Uma vez feitas as alteraes, incluses ou excluses necessrias, podemos, facilmente, sincronizar os dados que esto no cliente com o banco de dados no servidor. Veremos nos Captulos 10 e 11 exemplos de mtodos para sincronizao dos dados. O principal objeto do modelo ADO, para trabalhar com dados, o objeto RecordSet. Para exibir os dados de um objeto RecordSet, precisamos escrever uma boa quantia de cdigo. Com ADO.NET, o principal objeto, que funciona como um Conteiner para dados, o DataSet, o qual pode conter uma ou mais tabelas (o objeto RecordSet somente pode conter uma tabela) e tambm os relacionamentos entre as tabelas e informaes sobre chaves primrias e chaves estrangeiras. Com o modelo desconectado do ADO.NET, no utilizamos cursores, nem no lado cliente, nem no lado servidor. As classes de acesso a dados fornecem os mecanismos necessrios para a manipulao dos dados. O formato adotado para armazenar os dados no cliente o XML, um padro amplamente aceito pela indstria. Com ADO, ao utilizar tecnologias como RDS para trabalhar com dados desconectados, temos um formato proprietrio para os dados, formato este que somente aceito pelo Internet Explorer. Neste captulo vamos aprender a utilizar alguns objetos bsicos para o acesso a dados relacionais, mais especificamente, a dados do SQL Server e do Microsoft Access. Veremos como estabelecer uma conexo com o banco de dados, acessar dados de uma ou mais tabelas e exibir estes dados em uma pgina ASP.NET. Para exibio dos resultados obtidos, estaremos utilizando o Web Server Control DataGrid. Estudaremos este controle em detalhes. Veremos que o controle DataGrid facilita, enormemente, a tarefa de exibir dados em uma pgina ASP.NET. No nosso exemplo mais simples, veremos que, o que no ASP 3.0 exige vrias linhas de cdigo, no ASP.NET, com o controle DataGrid, pode ser feito em uma nica linha de cdigo.

NOTA: Para maiores informaes sobre Tabelas, Atributos, Chaves Primrias, Chaves Estrangeiras e Relacionamentos entre tabelas, consulte o Anexo II.

www.juliobattisti.com.br

358

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1

Bancos de Dados Utilizados nos Exemplos


Para os exemplos deste e dos prximos captulos utilizaremos um banco de dados do Microsoft Access e outro do SQL Server 2000.

O Banco de Dados do Microsoft Access NorthWind.mdb


O banco de dados NorthWind.mdb fornecido pela Microsoft e instalado juntamente com o Microsoft Access 2000. um banco de dados de exemplo, para controle de vendas de uma pequena empresa. Nele so armazenadas informaes sobre pedidos, clientes, funcionrios, produtos e fornecedores. A arquivo NorthWind.mdb, por padro, instalado na subpasta Samples, da pasta de instalao do Office 2000. Para os exemplos deste livro, faremos uma cpia deste arquivo, na pasta C:\Meus documentos e utilizaremos esta cpia nos exemplos. Neste banco de dados encontramos as seguintes tabelas: Categorias Clientes Detalhes do pedido Fornecedores Funcionrios Pedidos Produtos Transportadoras Na Figura 10.2 temos o diagrama Entidades x Relacionamentos para este banco de dados:

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.

Figura 10.2: O Banco de dados NorthWind.mdb do Microsoft Access.

359

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

O Banco de Dados do SQL Server Pubs


Ao instalarmos o Framework .NET instalada, digamos assim, uma miniverso do SQL Server. Nesta miniverso disponibilizado o banco de dados pubs, conforme indicado na Figura 10.3.

Figura 10.3: O Banco de dados pubs do SQL Server.


Ao instalar o Framework .NET podemos ter duas situaes distintas: 1. O SQL Server ainda no est instalado: Neste caso criada uma instncia chamada NETSDK. Para estabelecermos uma conexo, conforme veremos nos exemplos deste captulo, fornecemos o nome da instncia NETSDK, como valor para o parmetro server. 2. O SQL Server j est instalado: Neste caso criada uma nova instncia chamada SERVIDOR\NETSDK, onde SERVIDOR o nome do computador que voc est utilizando. Para estabelecermos uma conexo, conforme veremos nos exemplos deste captulo, fornecemos o nome completo da instncia SERVIDOR\NETSDK, como valor para o parmetro server. O computador que estou utilizando para os exemplos encaixa-se neste segundo caso. Nos exemplos deste captulo vou utilizar SERVIDOR\NETSDK, como valor para o parmetro Servidor, nos objetos onde este parmetro for necessrio. Se voc estiver utilizando um computador com um nome diferente, substitua SERVIDOR pelo nome do computador que voc est utilizando.

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

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


As principais tabelas deste banco de dados so as seguintes: authors (autores) discounts (descontos) employee (funcionrios, empregados) jobs (funes, cargos) publishers (editoras) sales (vendas) stores (lojas, livrarias) titles (livros, ttulos) titleauthor (relaciona os livros de cada autor) O Banco de dados pubs utilizado por uma rede de livrarias, para o controle de vendas e pesquisa dos ttulos existentes no catlogo da livraria. Na Figura 10.4 temos o diagrama Entidades x Relacionamentos para este Banco de dados.

NOTA: Os nomes de tabelas e campos do Banco de dados pubs esto em ingls, conforme fornecido na instalao do Framework .NET.

Figura 10.4: O diagrama Entidades x Relacionamentos do Banco de dados pubs.

361

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Uma Introduo ao ADO.NET


Agora vamos iniciar o estudo das principais classes para acesso a dados. O conjunto destas classes conhecido como ADO.NET. As classes que iremos estudar fazem parte dos seguintes namespaces da biblioteca de classes do Framework .NET: System.Data: Contm as principais classes utilizadas para acessar bases de dados relacionais. A classe DataSet faz parte deste namespace. System.Data.SqlClient: Classes utilizadas para acessar bancos de dados do SQL Server 2000. As classes deste namespace fornecem melhor desempenho para acesso ao SQL Server, pois utilizam a interface TDS Tabular Data Stream, nativa do SQL Server 2000. System.Data.Common: Contm as classes onde so definidas as propriedades e mtodos bsicos, herdados por classes de outros namespaces. System.Data.OleDb: Neste namespace encontramos as classes para acesso a fontes de dados, via OLE-DB Providers.

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.

Informando que Voc Deseja Utilizar Classes de um Determinado Namespace


Voc deve ter notado, nos exemplos dos captulos anteriores, que utilizamos uma srie de classes e estruturas do namespace System; todavia no fizemos nenhuma referncia a este namespace, no cdigo das pginas ASP.NET de exemplo. Como ento uma pgina capaz de acessar os mtodos de um namespace, sem ter feito referncia ao mesmo? Isso somente acontece com os namespaces bsicos, como o caso do namespace System. J com os namespaces que contm as classes para acesso a dados, a histria diferente. Para que possamos utilizar classes de um destes namespaces precisamos, explicitamente, fazer referncia aos mesmos, no incio da pgina ASP.NET. O que eu chamei de fazer referncia chamado pelo Framework .NET de importar um namespace. Temos duas maneiras diferentes para importar (ou fazer referncia, como preferirem) um namespace, em uma pgina ASP.NET.

www.juliobattisti.com.br

362

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


1. Utilizando a diretiva @Import, no incio da pgina. No fragmento de cdigo a seguir, estamos importando os namespaces System.Data, System.Data.SqlClient e System.OleDb:
<%@Import Namespace=System.Data %> <%@Import Namespace=System.Data.SqlClient %> <%@Import Namespace=System.Data..OleDb%>

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.

Classe ou Objeto; Objeto ou Classe?


Muitas vezes, os termos classe e objeto so utilizados, indiscriminadamente, com o mesmo sentido. Vamos fazer uma definio formal para estes termos, atravs de um exemplo: No namespace System.Data existe uma classe chamada DataSet. Quando declaramos e inicializamos uma varivel, como sendo do tipo DataSet, estamos criando um objeto baseado na classe DataSet. No trecho de cdigo a seguir, temos um exemplo onde criamos um objeto chamado MeusDados, o qual baseado na classe DataSet:
DataSet MeusDados = new DataSet( );

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Estabelecendo uma Conexo com o SQL Server 2000 SqlConnection


A classe SqlConnection faz parte do namespace System.Data.SqlClient. Esta classe utilizada para estabelecer uma conexo com um servidor SQL Server. Diferente do que acontecia com ADO, no podemos executar um comando SQL, utilizando a classe SqlConnection. Ainda neste captulo estudaremos as classes utilizadas para executar comandos em um banco de dados. A seguir temos um exemplo de criao de um objeto do tipo SqlConnection:
SqlConnection MinhaConeco = new SqlConnection(server=SERVIDOR\\NETSDK; + uid=sa;pwd=;database=pubs);

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.

ConnectionTimeOut Database DataSource ServerVersion State

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.

Listagem 10.1 A classe SqlConnection chap10ex1.aspx.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.SqlClient %>

www.juliobattisti.com.br

364

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


<html> <script language=C# runat=server>

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.

SqlConnection MinhaConexo = new SqlConnection(server=SERVIDOR\\NETSDK;uid=sa;pwd=;database=pubs);

// Declaro uma varivel do tipo String: auxPropriedades. // A varivel auxPropriedades ir conter o valor das propriedades // da conexo minhaConexo.

String auxPropriedades; auxPropriedades = Propriedades da conexo:;

auxPropriedades = auxPropriedades + \n\n + ConnectionString: + MinhaConexo.ConnectionString.ToString();

auxPropriedades = auxPropriedades + \n\n + Database: + MinhaConexo.Database.ToString();

auxPropriedades = auxPropriedades + \n\n + DataSource: + MinhaConexo.DataSource.ToString();

auxPropriedades = auxPropriedades + \n\n + State: + MinhaConexo.State.ToString();

ExibePropriedades.Font.Bold=true; ExibePropriedades.Text=auxPropriedades;

</script>

<body>

<h3><font face=Verdana>Classe SqlConnection!!!</font></h3>

365

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


<asp:TextBox runat=server id=ExibePropriedades Text= Rows=10" Cols=70" Font_Face=Arial Font_Size=3" BackColor=lightblue TextMode=MultiLine />

</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.

Figura 10.5: A classe SqlConnection.

www.juliobattisti.com.br

366

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


Comentrios sobre o cdigo do exemplo Chap10Ex1.aspx. Observe que a primeira coisa que fizemos foi referenciar os namespaces System.Data e System.Data.SqlClient:
<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.SqlClient %>

Se no fizssemos essa referncia, obteramos um erro de compilao, ao carregar a pgina, conforme indicado na Figura 10.6.

Figura 10.6: Erro por no referenciar os namespaces necessrios.


Observe o texto em destaque, onde dito que no foi possvel encontrar SqlConnection. Isto acontece porque esta classe faz parte do namespace System.Data.SqlClient, o qual no foi referenciado na pgina ASP.NET. Em seguida criamos um varivel MinhaConexo, baseada na classe SqlConnection:
SqlConnection MinhaConexo = new SqlConnection(server=SERVIDOR\\NETSDK;uid=sa;pwd=;database=pubs);

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Nome da instncia do SQL Server: SERVIDOR\NETSDK. Nome do usurio: uid=sa. Senha: pwd= , neste caso significa senha em branco. Banco de dados para fazer a conexo: database=pubs.

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

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1

Figura 10.7: Utilizando o mtodo Open da classe SqlConnection.

Estabelecendo uma Conexo com o Microsoft Access OleDbConnection


A classe OleDbConnection faz parte do namespace System.Data.OleDb. Esta classe utilizada para estabelecer uma conexo com uma fonte de dados, para a qual exista um OLE-DB Provider. Diferente do que acontecia com ADO, no podemos executar um comando SQL, utilizando a classe OleDbConnection; ao invs disso devemos utilizar um objeto Command. Ainda neste captulo estudaremos as classes utilizadas para executar comandos em um banco de dados. A seguir temos um exemplo de criao de um objeto do tipo OleDbConnection:
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1

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.

Listagem 10.2 A classe OleDbConnection chap10ex2.aspx.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>

<html>

<script language=C# runat=server>

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

MinhaConexo.Open();

// Declaro uma varivel do tipo String: auxPropriedades. // A varivel auxPropriedades ir conter o valor das propriedades // da conexo minhaConexo.

String auxPropriedades; auxPropriedades = Propriedades da conexo:;

auxPropriedades = auxPropriedades + \n\n + ConnectionString: + MinhaConexo.ConnectionString.ToString();

auxPropriedades = auxPropriedades + \n\n + Database: + MinhaConexo.Database.ToString();

auxPropriedades = auxPropriedades + \n\n + DataSource: + MinhaConexo.DataSource.ToString();

auxPropriedades = auxPropriedades + \n\n + State: + MinhaConexo.State.ToString();

ExibePropriedades.Font.Bold=true; ExibePropriedades.Text=auxPropriedades;

</script>

<body> <h3><font face=Verdana>Classe OleDbConnection!!!</font></h3>

www.juliobattisti.com.br

372

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


<asp:TextBox runat=server id=ExibePropriedades Text= Rows=10" Cols=70" Font_Face=Arial Font_Size=3" BackColor=lightblue TextMode=MultiLine />

</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.

Figura 10.9: Propriedades da classe OleDbConnection.

373

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Comentrios sobre o cdigo do exemplo Chap10Ex2.aspx. Os mesmos comentrios feitos para o exemplo da Listagem 10.1. Na Tabela 10.5 temos uma descrio dos principais mtodos da classe OleDbConnection:

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.

Uma Viso Geral do Processo de Acesso a Dados


Existem muitas maneiras de estabelecer uma conexo com uma fonte de dados, retornar um conjunto de dados e exibir estes dados em uma pgina ASP.NET. Neste captulo estaremos utilizando a seguinte abordagem: Criar uma conexo com uma fonte de dados utilizando SqlConnection ou OleDbConnection. Definir um comando SQL a ser executado no banco de dados. O comando definido utilizando um objeto do tipo SqlDataAdapter ou OleDbDataAdapter. O comando SQL define os dados que sero retornados a partir do banco de dados. Tambm podemos utilizar um objeto SqlCommand ou OleDbCommand. Uma opo criar um objeto Command e depois a propriedade SelectCommand do objeto DataAdapter como sendo igual ao objeto Command. Outra opo passar o comando SQL como parmetro do objeto DataAdapter, o que faz

www.juliobattisti.com.br

374

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


com que no seja necessria a criao explcita de um objeto Command. O objeto DataAdapter faz a ligao de um ou mais objetos do tipo Command com um objeto do tipo DataSet. Por exemplo, podemos ligar vrios objetos Command com um nico DataSet. Iremos detalhar todos estes aspectos nos exemplos deste captulo. Utilizamos os dados retornados pelo(s) comando(s) SQL para preencher um objeto do tipo DataSet. Vamos utilizar um Web Server Control Datagrid, para exibir os dados associados ao objeto do tipo DataSet. Na Figura 10.10 temos uma viso geral deste processo.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Criando Objetos Command


Para criar objetos Command temos duas opes: SqlCommand: Este objeto utilizado para definir um comando que ser executado atravs de uma conexo do tipo SqlConnection. OleDbCommand: Utilizado para definir um comando que ser executado atravs de uma conexo do tipo OleDbConnection. Conforme descrevemos no tpico anterior, podemos criar um objeto Command, no qual definimos um comando SQL a ser executado atravs de uma conexo. As propriedades dos objetos SqlCommand e OleDbCommand so semelhantes. Na Tabela 10.6 temos uma descrio das principais propriedades das classes SqlCommand/OleDbCommand:

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

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


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 criar um objeto OleDbCommand associado com esta conexo e vamos exibir as propriedades do objeto OleDbCommand 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 do SQL Server. Na Listagem 10.3 temos o cdigo para o exemplo proposto.

Listagem 10.3 A classe OleDbCommand chap10ex3.aspx.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>

<html>

<script language=C# runat=server>

protected void Page_Load(Object Src, EventArgs E ) { // Crio uma conexo com o banco de dados Northwind.mdb // localizado na pasta C:\Meus documentos.

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

// 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.

string TextoDoComando = SELECT NmeroDoPedido, CdigoDoCliente, + PasDeDestino FROM Pedidos;

OleDbCommand MeuComando = new OleDbCommand(TextoDoComando,MinhaConexo);

MinhaConexo.Open();

377

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


// Declaro uma varivel do tipo String: auxPropriedades. // A varivel auxPropriedades ir conter o valor das propriedades // do comando MeuComando.

String auxPropriedades; auxPropriedades = Propriedades do objeto OleDbCommand:;

auxPropriedades = auxPropriedades + \n\n + CommandType: + MeuComando.CommandType.ToString();

auxPropriedades = auxPropriedades + \n\n + CommandText: + MeuComando.CommandText.ToString();

auxPropriedades = auxPropriedades + \n\n + Timeout: + MeuComando.CommandTimeout.ToString();

auxPropriedades = auxPropriedades + \n\n + Connection: + MeuComando.Connection.ToString();

ExibePropriedades.Font.Bold=true; ExibePropriedades.Text=auxPropriedades;

</script>

<body>

<h3><font face=Verdana>Classe OleDbCommand!!!</font></h3>

<asp:TextBox runat=server id=ExibePropriedades Text= Rows=10" Cols=70"

www.juliobattisti.com.br

378

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


Font_Face=Arial Font_Size=3" BackColor=lightblue TextMode=MultiLine />

</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;

OleDbCommand MeuComando = new OleDbCommand(TextoDoComando,MinhaConexo);

Figura 10.11: Propriedades da classe OleDbCommand.

379

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Observe que primeiro criamos uma string TextoDoComando, a qual atribumos o comando SQL que ser associado com o objeto OleDbCommand. Em seguida criamos o objeto MeuComando e passamos como parmetros, para o mtodo construtor do objeto, primeiro a string TextoDoComando e em seguida o nome da conexo, atravs da qual o comando deve ser executado. importante salientar que, neste momento, o comando ainda no foi executado e, portanto, ainda no foram retornados dados. Em seguida comeamos a concatenar os valores das propriedades do objeto MeuComando em uma string auxPropriedades. No final, o valor desta string exibido em um controle do tipo TextArea. Ao invs dos objetos OleDbConnection e OleDbCommand, poderamos utilizar os objetos SqlConnection e SqlCommand para conectar com o SQL Server, conforme indicado no cdigo a seguir:
SqlConnection MinhaConexo = new SqlConnection(server=SERVIDOR\\NETSDK;uid=sa;pwd=;database=pubs);

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.

Retornando Dados com DataAdapter


Para criar objetos DataAdapter temos duas opes: SqlDataAdapter: Este objeto utilizado para executar um ou mais comandos ou Stored Procedures, em um banco de dados do SQL Server e associar os resultados obtidos com um objeto do tipo DataSet. OleDbDataAdapter: Utilizado para executar um ou mais comandos em uma fonte de dados, utilizando o OLEDB Provider respectivo, e associar os resultados obtidos com um objeto do tipo DataSet. Os objetos SqlDataAdapter/OleDbDataAdapter funcionam como uma ponte entre uma fonte de dados e o objeto DataSet, tanto para acesso quanto para alteraes nos dados. Esta ponte pode ser estabelecida de duas maneiras:

www.juliobattisti.com.br

380

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


1. 2. Atravs da utilizao do mtodo Fill do objeto DataAdapter, para retornar dados de uma fonte de dados e colocar estes dados em um objeto DataSet. Atravs da utilizao do mtodo Update do objeto DataAdapter, mtodo este que sincroniza os dados da fonte de dados original, com as modificaes feitas nos dados do objeto DataSet. Na Tabela 10.8 temos uma descrio das principais propriedades das classes SqlDataAdapter/OleDbDataAdapter:

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Na Tabela 10.10 temos uma descrio dos principais eventos das classes SqlDataAdapter/OleDbDataAdapter:

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

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


Na Tabela 10.11 temos uma descrio das principais propriedades da classe DataSet:

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.

Clear Clone GetChanges

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


pgina. Existem maneiras variadas para exibir os dados em uma pgina ASP.NET. Neste captulo estaremos utilizando o controle DataGrid. Em seguida apresentaremos um exemplo simples de conexo com um banco de dados do Microsoft Access. Neste exemplo vamos utilizar o controle DataGrid. Mais adiante, neste captulo, iremos estudar este controle, em detalhes.

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.

Listagem 10.4 Um exemplo completo chap10ex4.aspx.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>

<html>

<script language=C# runat=server>

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.

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

// Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna todos os dados da tabela Clientes.

www.juliobattisti.com.br

384

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT CdigoDoCliente, + NomeDaEmpresa, Cidade, Pas FROM Clientes, MinhaConexo);

// Criamos e preenchemos um objeto DataSet. // Observe que no temos mais o objeto Recordset, // como era de praxe com o ASP 3.0.

DataSet ds = new DataSet();

// 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.

DataView source = new DataView(ds.Tables[0]);

MinhaGrade.DataSource = source ; MinhaGrade.DataBind(); }

</script>

<body>

<% Exibe as informaes do DataGrid no corpo da pgina. %>

<h3><font face=Verdana>Clientes da empresa North Wind!!!</font></h3>

<ASP:DataGrid id=MinhaGrade runat=server Width=700" BackColor=#ccccff BorderColor=black

385

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Verdana Font-Size=8pt HeaderStyle-BackColor=#aaaadd MaintainState=false />

</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.

OleDbCommand MeuComando = new leDbCommand(TextoDoComando,MinhaConexo);

www.juliobattisti.com.br

386

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1

Figura 10.12: Exibindo dados do Banco de dados NorthWind.mdb.


3. 4. OleDbDataAdapter MeuDataAdapter = new OleDbDataAdapter( ); MeuDataAdapter.SelectCommand = MeuComando;

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


O passo final chamar o mtodo DataBind do controle DataGrid:
MinhaGrade.DataBind();

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.

Voc obter o resultado indicado na Figura 10.13.

Figura 10.13: Exibindo os clientes da Alemanha.

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

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


O objeto DataAdapter faz a ponte entre um ou mais objetos Command (SqlCommand ou OleDbCommand) e um objeto DataSet. Ao final deste processo, os dados esto armazenados em um objeto DataSet. O objeto DataView faz a ponte entre o objeto DataSet e um Web Form ou Web Form Control, onde sero exibidos os dados. Na Figura 10.14, temos uma viso geral deste processo:

Figura 10.14: Acessando dados com ASP.NET.


Nesta figura fica bem destacado o papel de ponte entre o objeto DataSet e o controle DataGrid, exercido pelo objeto DataView. No exemplo da figura, utilizamos o controle DataGrid, mas poderia ser qualquer outro Web Form Control capaz de acessar dados de um DataView. Um objeto DataView pode ser configurado para retornar apenas uma parte dos dados de um objeto DataTable. Podemos, por exemplo, ter dois objetos DataView, ligados com o mesmo objeto DataTable, porm exibindo diferentes dados. Vamos estudar mais alguns detalhes sobre o objeto DataView. Na Tabela 10.13 temos uma descrio das principais propriedades da classe DataView:

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Propriedade RowFilter RowStateFilter

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>

<script language=C# runat=server>

protected void Page_Load(Object Src, EventArgs E ) {

// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

// Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna todos os dados da tabela Clientes.

OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT CdigoDoFuncionrio, + Nome,Cargo,DataDeNascimento,Cidade FROM Funcionrios, MinhaConexo);

// Criamos e preenchemos um objeto DataSet. // Observe que no temos mais o objeto Recordset, // como era de praxe com o ASP 3.0.

DataSet ds = new DataSet();

// Utilizo o mtodo Fill do objeto DataAdapter, para preencher // o objeto DataSet, com os dados retornados pelo comando SQL.

391

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


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.

DataView source = new DataView(ds.Tables[0]);

// Utilizamos uma instruo Switch para definir a // classificao dos dados com base no valor selecionado // na lista CampoClassificar.

string aux = CampoClassificar.SelectedItem.Value;

switch (aux) { case Cargo: source.Sort=Cargo ASC; break;

case Cidade: source.Sort=Cidade ASC; break;

case Cdigo do Funcionrio: source.Sort=CdigoDoFuncionrio ASC; break;

case Data de Nascimento: source.Sort=DataDeNascimento ASC; break;

case Nome: source.Sort=Nome ASC; break; default: // outras opes.

www.juliobattisti.com.br

392

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


break; } MinhaGrade.DataSource = source ; MinhaGrade.DataBind(); } </script> <body> <% Exibe as informaes do DataGrid no corpo da pgina. %> <h3><font face=Verdana>Funcionrios da empresa North Wind!!!</font></h3> <BR> <form runat=server>

<h3><font face=Verdana>Classificar por:</font></h3>

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


<BR>

<B>Clique para Classificar ></B></td> <input type=submit value=Classificar runat=server>

</form> </body> </html>

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.

Figura 10.15: Relao de funcionrios classificada pelo Cdigo do Funcionrio.


Observe que a listagem est classificada em ordem crescente do Cdigo do Funcionrio. Vamos testar o nosso exemplo. Na lista Classificar Por, selecione Nome e d um clique no boto Classificar. Voc obter uma listagem classificada pelo nome do funcionrio, conforme indicado na Figura 10.16: Comentrios sobre o cdigo do exemplo Chap10Ex5.aspx.

www.juliobattisti.com.br

394

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


O cdigo para conectar com o banco de dados e retornar dados muito semelhante ao cdigo utilizado nos exemplos anteriores. Para maiores detalhes sobre esta parte do cdigo consulte os exemplos das Listagens 10.1, 10.2, 10.3 e 10.4. Na seo de apresentao da pgina criamos um formulrio e adicionamos um Web Server Control do tipo ListBox chamado CampoClassificar. Este controle exibe as opes de classificao. O cdigo que define o controle ListBox est indicado a seguir:
<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>

Figura 10.16: Relao de funcionrios classificada pelo Nome.

395

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Observe que, por padro, ao carregarmos a pgina, a opo Cdigo do Funcionrio vem selecionada selected=True. Para maiores informaes sobre o controle ListBox, consulte o Captulo 9. Na seo de cdigo precisamos verificar qual a opo selecionada no ListBox e, com base na opo selecionada, classificar os dados do DataView. Para isso utilizamos a instruo switch/case do C#, conforme indicado a seguir:
string aux = CampoClassificar.SelectedItem.Value; <l switch (aux) { case Cargo: source.Sort=Cargo ASC; break;

case Cidade: source.Sort=Cidade ASC; break;

case Cdigo do Funcionrio: source.Sort=CdigoDoFuncionrio ASC; break;

case Data de Nascimento: source.Sort=DataDeNascimento ASC; break;

case Nome: source.Sort=Nome ASC; break;

default: // outras opes. break; }

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

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


Em seguida, utilizamos a string aux como varivel de comparao para a instruo switch/case. Com base no valor da string aux, definimos a classificao dos dados do DataView. Para definir a classificao utilizamos a propriedade Sort do objeto source, objeto este que do tipo DataView, como no exemplo a seguir:
source.Sort=CdigoDoFuncionrio ASC;

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>

<script language=C# runat=server>

protected void Page_Load(Object Src, EventArgs E )

// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +

397

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo); // Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna todos os dados da tabela Clientes.

OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT NmeroDoPedido, + DataDoPedido,CidadeDeDestino,PasDeDestino FROM Pedidos, MinhaConexo);

// Criamos e preenchemos um objeto DataSet. // Observe que no temos mais o objeto Recordset, // como era de praxe com o ASP 3.0.

DataSet ds = new DataSet();

// 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.

DataView source = new DataView(ds.Tables[0]);

// 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.

string aux = CampoClassificar1.SelectedItem.Value;

// Se o usurio selecionou Crescente, concateno ASC, // caso contrrio, concateno DESC.

www.juliobattisti.com.br

398

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


if (Crescente.Checked) { aux = aux + ASC,; } else { aux = aux + DESC,; }

aux = aux + CampoClassificar2.SelectedItem.Value;

if (Crescente.Checked) { aux = aux + ASC; } else { aux = aux + DESC; }

// Ordeno passando aux para a propriedade Sort.

source.Sort = aux;

MinhaGrade.DataSource = source ; MinhaGrade.DataBind(); }

</script>

<body>

<% Exibe as informaes do DataGrid no corpo da pgina. %>

<h3><font face=Verdana>Funcionrios da empresa North Wind!!!</font></h3>

399

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


<form runat=server>

<B>Clique para Classificar ></B></td> <input type=submit value=Classificar runat=server>

<BR> <BR>

<table>

<tr> <td>

<B><font face=Verdana>Classificar primeiro por:</font></B> </td>

<td>

<B><font face=Verdana>&nbsp;&nbsp;Em seguida por:</font></B> </td>

<td> <B><font face=Verdana>&nbsp;Em qual ordem?</font></B> </td> </tr>

<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

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


</td>

<td> &nbsp;&nbsp; <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>

<asp:RadioButton id=Crescente Text=Crescente Checked=True GroupName=Ordem runat=server />

&nbsp;&nbsp;

<asp:RadioButton id=Decrescente Text=Decrescente GroupName=Ordem runat=server />

</td>

</tr>

401

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


</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 />

<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

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1

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 &nbsp 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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


No formulrio, na seo de apresentao da pgina, adicionamos dois controles do tipo ListBox, onde o usurio pode selecionar por quais campos deseja classificar a listagem. Tambm acrescentamos um grupo chamado Ordem, com dois controles do tipo RadioButton, onde o usurio pode selecionar Crescente ou Decrescente. Com base nos valores selecionados nestes controles, definimos o contedo de uma varivel string aux. Uma vez definido o contedo da string aux, utilizamos esta para definir o valor da propriedade Sort do objeto source, o qual um objeto do tipo DataView:
string aux = CampoClassificar1.SelectedItem.Value;

// Se o usurio selecionou Crescente, concateno ASC, // caso contrrio, concateno DESC.

if (Crescente.Checked) { aux = aux + ASC,; } else { aux = aux + DESC,; }

aux = aux + CampoClassificar2.SelectedItem.Value;

if (Crescente.Checked) { aux = aux + ASC; } else { aux = aux + DESC; }

// Ordeno passando aux para a propriedade Sort.

source.Sort = aux;

www.juliobattisti.com.br

404

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


Observe que, no segundo if, no acrescentamos a vrgula aps ASC ou DESC. No primeiro if acrescentamos, pois, quando temos dois ou mais campos para definir a propriedade Sort, precisamos separar estes campos por vrgula. Se o usurio selecionar PasDeDestino na primeira lista, CidadeDeDestino na segunda lista e Crescente, a varivel aux ter o seguinte valor:
aux = PasDeDestino ASC, CidadeDeDestino ASC

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.

Um Pouco Mais Sobre o Controle DataGrid


O controle DataGrid, sem sombra de dvidas, assunto para um captulo inteiro. Como no dispomos de tanto espao, caso contrrio teramos um livro de mais de 2000 pginas, vamos apresentar as principais caractersticas deste poderoso controle, atravs de alguns exemplos prticos. Neste tpico veremos como algumas propriedades e mtodos do controle DataGrid so capazes de efetuar verdadeiras maravilhas. Nos Captulos 11 e 12 estudaremos mais sobre o controle DataGrid, principalmente sobre como fazer alteraes e excluses nos dados exibidos pelo controle.

Primeira Maravilha do DataGrid: Paginao


Quando obtemos um nmero grande de registros interessante dividir a exibio do mesmo em pginas, onde exibimos um determinado nmero de registros por vez. Isso o que chamamos de paginao. Por exemplo, podemos fazer com que 1000 registros sejam divididos em pginas onde so exibidos 20 registros por vez. Fazer paginao com ASP 3.0 no era uma tarefa das mais fceis. Um boa quantia de cdigo era necessria e tudo tinha que ser implementado manualmente. Com o controle DataGrid, definir paginao est resumido a configurar duas propriedades:

405

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


AllowPaging: Esta propriedade do tipo Boleana. Se for True, a paginao habilitada; se for False, a paginao desabilitada. Por padro esta propriedade False. Ao tornarmos AllowPaging True, na ltima linha do DataGrid so exibidos os smbolos < para voltar pgina anterior e > para ir prxima pgina. Podemos alterar estes valores utilizando as propriedades PagerStyle-NextPageText para alterar o texto do link que vai para a prxima pgina e PagerStyle-PrevPageText, para alterar o texto do link que volta para a pgina anterior. Quando estamos na primeira pgina, o link para a pgina anterior automaticamente desabilitado, pois no existe pgina anterior primeira. Quando estamos na ltima pgina, o link para a prxima pgina automaticamente desabilitado, pois no existe pgina aps a ltima. PageSize: O valor desta propriedade define o nmero de registros que sero exibidos, por vez. Se esta propriedade no for definida, sero exibidos 10 registros por pgina. Para definir que sejam exibidos 20 registros por pgina, sendo Prxima pgina >>, o texto do link para a prxima pgina e << Pgina anterior, o texto para o link para a pgina anterior, definimos as seguintes propriedades/valores do controle DataGrid:
AllowPaging=True PageSize=20 PagerStyle-NextPageText=Prxima pgina >> PagerStyle-PrevPageText=<< Pgina anterior

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

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1

Segunda Maravilha do DataGrid: Mais do que um Conjunto de Dados na Mesma Pgina


Vamos ver um exemplo prtico, onde exibiremos dados de duas tabelas, do banco de dados NorthWind, na mesma pgina ASP.NET. Para isso faremos uso de dois controles do tipo DataGrid. O exemplo Proposto: Exibir, na mesma pgina, informaes da tabela Funcionrios e da tabela Transportadores. Na Listagem 10.7 temos o cdigo para o exemplo proposto.

Listagem 10.7 Exibindo dados de mltiplas tabelas em uma pgina ASP.NET.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>

<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.

<script language=C# runat=server>

protected void Page_Load(Object Src, EventArgs E ) {

// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo); // Para podermos acessar mltiplas tabelas vamos criar // um objeto Command, conforme indicado a seguir:

OleDbCommand MeuComando = new OleDbCommand();

// defino algumas propriedades do objeto Command.

MeuComando.Connection = MinhaConexo; MeuComando.CommandType = CommandType.Text;

407

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


// Utilizamos um objeto DataAdapter para executar dois comandos SQL. // Um comando para retornar dados da tabela Funcionrios. // Um comando para retornar dados da tabela Transportadoras.

OleDbDataAdapter MeuDataAdapter = new OleDbDataAdapter();

// 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.

DataSet ds = new DataSet();

MeuComando.CommandText=Select CdigoDoFuncionrio,Nome,Sobrenome,Cargo From Funcionrios;

MeuDataAdapter.Fill(ds,Funcionrios);

// Altero a propriedade CommandText para retornar dados // da tabela Transportadores. // Chamo novamente o mtodo Fill.

MeuComando.CommandText = Select * From Transportadoras; MeuDataAdapter.Fill(ds,Transportadoras);

// Conectamos um controle DataGrid com

www.juliobattisti.com.br

408

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


// cada tabela do DataSet criado anteriormente. // ****************************************************** // GradeFuncionrios o id (nome) de um controle do tipo // DataGrid que est na seo de apresentao da pgina. // Este controle exibir dados dos Funcionrios. // ****************************************************** // GradeTransportadoras o id (nome) de um controle do tipo // DataGrid que est na seo de apresentao da pgina. // Este controle exibir dados das Transportadoras.

DataView Funcionrios = new DataView(ds.Tables[0]); GradeFuncionrios.DataSource = Funcionrios ; GradeFuncionrios.DataBind();

DataView Transportadoras = new DataView(ds.Tables[1]); GradeTransportadoras.DataSource = Transportadoras ; GradeTransportadoras.DataBind(); }

</script>

<body>

<h3><font face=Verdana>Funcionrios da empresa North Wind!!!</font></h3> <HR>

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


HeaderStyle-BackColor=#aaaadd HeaderStyle-Font-Bold=True MaintainState=false />

<BR> <HR>

<h3><font face=Verdana>Transportadoras da empresa North Wind!!!</font></h3>

<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

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1

Figura 10.19: Exibindo dados de mltiplas tabelas em uma pgina ASP.NET.


Comentrios sobre o cdigo do exemplo Chap10Ex7.aspx. Vamos descrever os passos utilizados para acessar e exibir dados das tabelas Funcionrios e Pedidos. Alguns passos j foram explicados em exemplos anteriores, mas iremos repetir a explicao, para fazermos uma reviso do contedo deste captulo: 1. 2. Utilizamos o evento Pge_Load para colocar o cdigo necessrio ao nosso exemplo. Iniciamos estabelecendo uma conexo com o banco de dados NorthWind.mdb:
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb; OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

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();

// defino algumas propriedades do objeto Command. MeuComando.Connection = MinhaConexo; MeuComando.CommandType = CommandType.Text;

411

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


4. Agora criamos um objeto DataAdapter e definimos a sua propriedade SelectCommand. Ao definirmos esta propriedade informamos qual o objeto OleDbCommand que estar associado ao DataAdapter:
OleDbDataAdapter MeuDataAdapter = new OleDbDataAdapter(); MeuDataAdapter.SelectCommand = MeuComando;

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();

DataView Transportadoras = new DataView(ds.Tables[1]); GradeTransportadoras.DataSource = Transportadoras ; GradeTransportadoras.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

CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1


8. Na seo de apresentao, utilizamos algumas propriedades do DataGrid para definir a sua aparncia. Por exemplo: HeaderStyle-BackColor=#aaaadd: Define a cor de segundo plano da primeira linha do DataGrid, a linha que contm os ttulos das colunas. HeaderStyle-Font-Bold=True: Define que o texto da primeira linha deve ser exibido com fonte em negrito. Este exemplo demonstra, mais uma vez, o poder e flexibilidade dos novos objetos para acesso a dados oferecidos pelo ADO.NET e tambm demonstra o poder dos Web Server Controls, mais especificamente do controle DataGrid.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


controle que pode ser associado a uma fonte de dados. Os conceitos vistos nesta parte inicial so a base para que possamos estudar os Data-bound controls.

Um tal de Data Binding


Data Binding , sem dvidas, uma das caractersticas de ASP.NET que mais poupam tempo do programador. Tarefas que exigiam dezenas de linhas de cdigo com as verses anteriores de ASP, agora podem ser feitas configurando-se umas poucas propriedades dos Data-bound controls. Com o ASP.NET, o processamento e as funes de Data Binding so executados no Servidor. O resultado que retorna HTML compatvel com qualquer navegador, o que elimina a limitao das tcnicas de Data Binding no lado cliente. Com a manuteno de estado automtica e as operaes de PostBack e round-trip (descritas anteriormente), o funcionamento da pgina transparente para o usurio, ou seja, do ponto de vista de quem est utilizando a pgina pouca importncia tem onde est ocorrendo o processamento; desde que o desempenho seja satisfatrio e o acesso possa ser feito de qualquer navegador disponvel. Para que tudo isso seja possvel, as novas caractersticas do Framework .NET, como PostBack e round-trip de pginas so fundamentais. Antes de explicarmos em detalhe a sintaxe para Data Binding, vamos ver um exemplo prtico onde fazemos uma comparao entre a maneira de construir um controle do tipo Lista de Opes com ASP 3.0, onde as opes so criadas, automaticamente, a partir de um banco de dados; e a maneira de construir a mesma lista, utilizando Data Binding com ASP.NET.

Maneira Antiga: Criando uma Lista Dinmica com ASP 3.0


Neste exemplo construiremos uma lista com os nomes de todos os pases para os quais existem Pedidos. A lista ser construda a partir da tabela Pedidos do banco de dados C:\Meus documentos\NorthWind.mdb. Na Listagem 11.1 temos o cdigo para o exemplo proposto.

Listagem 11.1 Uma lista dinmica com ASP 3.0 Chap11ex1.asp.


<%@ Language=VBScript %> <HTML> <HEAD> <TITLE>Lista dinmica de Pases.</TITLE>

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


</HEAD>

<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.

O prximo comando deve estar todo em uma nica linha.

conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE=c:\Meus documentos\NorthWind.mdb

conn.Open

Agora criamos um Objeto RecordSet. Este Objeto ir acessar o campo PasDeDestino da tabela Pedidos.

Set Paises = Server.CreateObject(ADODB.Recordset)

O prximo comando deve estar todo em uma nica linha.

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

%>

<P><B>Paises para o quais existem pedidos!!!</B></P>

www.juliobattisti.com.br

416

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


<FORM action=Chap11ex1.asp method=post>

<SELECT id=listapaises name=listpaises>

<%

Agora construo a lista de opes a partir dos dados obtidos da tabela Pedidos. Para cada produto obtido, crio uma nova opo na lista.

Do While Not Paises.EOF

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

%>

</SELECT> <BR> <BR> <HR>

<INPUT type=submit value=Paises id=Localizar name=Localizar>

</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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Ao carregar a pgina voc obtm o resultado indicado na Figura 11.1.

Figura 11.1: Uma lista dinmica com ASP 3.0.


Alm da conexo, criamos um lao Do While para percorrer todos os registros do RecordSet e construir uma opo da lista para cada registro. Com ASP 3.0 no temos muitas alternativas. Agora vamos demonstrar como a utilizao de Data Binding torna as coisas bem mais fceis.

A Evoluo: Data Binding com ASP.NET.


Neste exemplo construiremos uma lista com os nomes de todos os pases para os quais existem Pedidos. A lista ser construda utilizando um Web Server Control do tipo DropDownList. Para ligar a fonte de dados com o controle, simplesmente faremos uso do mtodo DataBind do controle.

Listagem 11.2 Uma lista dinmica com ASP.NET Chap11ex2.aspx.


Na Listagem 11.2 temos o cdigo para o exemplo proposto.
<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>

<html>

<script language=C# runat=server>

www.juliobattisti.com.br

418

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


protected void Page_Load(Object Src, EventArgs E )

// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

// 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.

DataSet ds = new DataSet();

// 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]);

// Ligo o objeto DataView a um controle do tipo

419

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


// DropDownList MinhaLista.

MinhaLista.DataSource = source ; MinhaLista.DataBind(); }

</script>

<body>

<h3><font face=Verdana>Lista Dinmica com ASP.NET!!!</font></h3>

<form runat=server>

<asp:DropDownList id=MinhaLista runat=server DataTextField=PasDeDestino >

</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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2

Figura 11.2: Uma lista dinmica com ASP.NET.


Observe a simplicidade para criar a lista. Na seo de cdigo definimos a propriedade DataSource do controle MinhaLista, que um controle do tipo DropDownList. Depois chamamos o mtodo DataBind deste controle:
MinhaLista.DataSource = source ; MinhaLista.DataBind();

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Data Binding de Valores Simples


A idia bsica do Data Binding fazer com que, ao ser processada a pgina ASP.NET, um ou mais valores sejam retornados em posies especficas. Pode ser um conjunto de valores retornados para um controle como o DropDownList que utilizamos no exemplo da Listagem 11.2, ou pode ser um nico valor. Por exemplo, podemos fazer com que o rtulo de um controle seja baseado no valor contido em outro controle. Toda vez que a pgina for carregada e o mtodo DataBind for chamado, o valor do rtulo ser atualizado. O exemplo do DropDownList, da Listagem 11.2, onde so exibidos diversos valores, conhecido como repeatedvalue-binding. Quando a ligao feita com um nico valor, temos o exemplo de um single-value-binding. Vamos analisar a sintaxe e alguns exemplos para single-value-binding.

Sintaxe Para o Data Binding


Podemos fazer o Data Binding com qualquer propriedade de um controle, utilizando a seguinte sintaxe:
<%# fonte de dados %>

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.

Listagem 11.3 Um exemplo de single-value-binding.


<html> <script language=C# runat=server> void { Page.DataBind(); } </script> <body> <form runat=server> Page_Load(Object Src, EventArgs E )

www.juliobattisti.com.br

422

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


<h3>Exemplo de single-value-binding!!! </H3> <HR>

<asp:TextBox id=CaixaTexto Text=Valor Inicial runat=server />

<BR> <HR>

<B>Rtulo: </B> <asp:Label id=RotuloTexto Text=<%# CaixaTexto.Text %> runat=server />

</form> </body> </html>

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 11.3: Um exemplo de single-value-binding.


Mais especificamente com a definio da propriedade Text, onde colocamos uma expresso de ligao que aponta para a propriedade Text do controle CaixaTexto:
Text=<%# CaixaTexto.Text %>

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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


id=RotuloTexto Text=<%# Page.EnableViewState %> runat=server />

Data Binding de Mltiplos Valores. repeated-value-binding


Quando um controle ligado a uma fonte de dados como um DataView, temos um exemplo de repeated-value-binding. No exemplo da Listagem 11.2, apresentamos o exemplo onde os valores de um controle do tipo DropDownList so obtidos a partir de um objeto DataView. Existem diversos controles capazes de receber dados de um objeto DataView ou DataReader, se for o caso. Neste captulo estudaremos os seguintes controles: CheckBoxList DataList DropDownList RadioButtonList Repeater O controle DataGrid tambm recebe dados de um DataView, conforme j vimos nos exemplos do Captulo 10. No Final deste captulo estudaremos mais algumas caractersticas do controle DataGrid.

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.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


TextAlign=Right|Left OnSelectedIndexChanged=Evento que executa quando um checkbox alterado runat=server >

<asp:ListItem value=value selected=True|False> Items adicionados estaticamente. </asp:ListItem>

</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.

Listagem 11.4 Um exemplo do controle CheckBoxList.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>

<html>

<script language=C# runat=server>

protected void Page_Load(Object Src, EventArgs E ) {

www.juliobattisti.com.br

426

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

// 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);

// Criamos e preenchemos um objeto DataSet.

DataSet ds = new DataSet();

// 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.

DataView source = new DataView(ds.Tables[0]);

// 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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


MinhaLista.DataBind();

// Ligo o objeto DataView a um controle do tipo // CheckBoxList.

MeusCheckBox.DataSource = source; MeusCheckBox.DataBind();

</script>

<body>

<h3><font face=Verdana>Lista e CheckBox dinmicos com ASP.NET!!!</font></h3>

<form runat=server>

<asp:DropDownList id=MinhaLista runat=server DataTextField=CidadeDeDestino >

</asp:DropDownList>

<BR> <BR> <BR> <BR> <BR>

<asp:CheckBoxList id=MeusCheckBox CellPadding=2" DataTextField=CidadeDeDestino DataValueField=CidadeDeDestino

www.juliobattisti.com.br

428

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


RepeatColumns=2" RepeatDirection=Vertical RepeatLayout=Table TextAlign=Right BackColor=#c0c0c0" BorderWidth=2" Font-Bold=True BorderColor=Blue runat=server >

</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

Figura 11.4: O controle CheckBoxList.

429

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Voc obtm uma lista com o nome das cidades do Brasil para as quais existem pedidos e um grupo de controles do tipo CheckBox, com um controle para cada cidade, conforme indicado na Figura 11.4. Comentrios sobre o cdigo do exemplo: Para retornar apenas o nome das cidades do Brasil, para as quais houve pedidos, tivemos que lanar mo de um comando SQL um pouco sofisticado:
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT CidadeDeDestino + FROM Pedidos Group By CidadeDeDestino,PasDeDestino HAVING PasDeDestino=Brasil + Order By CidadeDeDestino, MinhaConexo);

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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


if (OpcoesDeCartao.Items[0].Selected) { Comando 1 Comando 2 ... Comando n }

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.

Listagem 11.5 Detectando as opes selecionadas.


<%@ Page Language=C# %> <html> <head>

</head> <body>

<script language=C# runat=server>

void Verifica_Selecionados(Object sender, EventArgs e)

{ Mensagem.Text=<B>Selected Item(s):</B> + <br> + <br>;

for (int i=0; i<MinhasOpcoes.Items.Count; i++) {

if (MinhasOpcoes.Items[i].Selected) Mensagem.Text=Mensagem.Text + MinhasOpcoes.Items[i].Text + <br>; } }

</script>

431

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


<form runat=server>

<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>

<asp:label id=Mensagem runat=server />

</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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex5.aspx Clique no Item 1 e observe que, automaticamente o Item selecionado informado no controle Label. Selecione o Item 5. Novamente o Item selecionado informado. Marque o Item 4, mesma coisa. Agora desmarque o Item 4, o Label atualizado, conforme indicado na Figura 11.5.

Figura 11.5: Exemplo da coleo Items.


Comentrios sobre o cdigo do exemplo: Na definio do controle, utilizamos o evento OnSelectedIndexChanged. Este evento disparado toda vez que clicamos em uma das opes do controle CheckBoxList. Em resposta a este evento, criamos o procedimento Verifica_Selecionados, na seo de cdigo da pgina. O procedimento Verifica_Selecionados define a propriedade Text do label Mensagem, para exibir quais opes esto atualmente selecionadas. Utilizamos um lao For que varia de 0 at o nmero de opes do controle. Para obter o nmero de opes do controle, utilizamos a propriedade Count da coleo Items:
MinhasOpcoes.Items.Count

No interior do lao for, se uma determinada opo estiver selecionada:


if (MinhasOpcoes.Items[i].Selected)

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


O principal mtodo deste controle DataBind( ), o qual faz a ligao do controle com uma fonte de dados. Poderamos redefinir o controle DropDownList do exemplo Chap11ex2.aspx, da seguinte maneira:
<asp:DropDownList id=MinhaLista runat=server DataTextField=PasDeDestino BackColor=#c0c0c0" ForeColor=Blue Font-Bold=True Font-Italic=True >

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.

Figura 11.6: Propriedades do controle DropDownList.

435

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


A sintaxe para este controle:
<asp:RadioButtonList id=identificao_no_cdigo AutoPostBack=True|False CellPadding=Distncia entre as bordas e o contedo das clulas. DataTextField=Campo a partir do qual obtido o texto de cada RadioButton DataValueField=Campo a partir do qual obtido o valor de cada RadioButton RepeatColumns=Define o nmero controles por linha RepeatDirection=Vertical|Horizontal RepeatLayout=Flow|Table TextAlign=Right|Left OnSelectedIndexChanged=Evento que executa quando clicamos em um RadioButton runat=server>

<asp:ListItem Text=Texto do item. Value=Valor do item. Selected=True|False />

</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.

Listagem 11.6 Um exemplo do controle RadioButtonList.


<%@ Import Namespace=System.Data %>

www.juliobattisti.com.br

436

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


<%@ Import Namespace=System.Data.OleDb %>

<html>

<script language=C# runat=server>

void Page_Load(Object Src, EventArgs E ) {

// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

// 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);

// Criamos e preenchemos um objeto DataSet.

DataSet ds = new DataSet();

// 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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


DataView source = new DataView(ds.Tables[0]);

// Ligo o objeto DataView a um controle do tipo // RadioButtonList - MeusBotoes.

MeusBotoes.DataSource = source; MeusBotoes.DataBind();

</script>

<body>

<h3><font face=Verdana>Radio Button dinmicos com ASP.NET!!!</font></h3>

<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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


<HR> </form>

</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.

Figura 11.7: O controle RadioButtonList opes geradas dinamicamente.


Observe que utilizamos algumas propriedades para definir os aspectos visuais do controle: RepeatColumns=3: Define que os controles sero exibidos em uma tabela com trs colunas, ou seja, trs controles por linha. RepeatLayout=Table: Os controles sero organizados no formato de uma tabela. TextAlign=Right: Alinhamento de texto direita. BackColor=#c0c000": Cor de segundo plano da tabela, na qual so colocados os controles. BorderWidth=2": Tamanho da borda externa em pixels. Font-Bold=True: Exibe a fonte em negrito. BorderColor=Blue: Define a cor da borda externa.

439

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Mais um Pouco Sobre o Controle DataGrid


No Captulo 10 mostramos algumas das capacidades do controle DataGrid, ao mesmo tempo que chamamos a ateno para o fato de ser este um controle bastante poderoso, que nos oferece um grande nmero de funcionalidades. Vamos aprender, em detalhes, mais duas funcionalidades importantes do controle DataGrid: Ordenar dados. Filtrar dados. Nos exemplos que iremos apresentar, vamos utilizar, como fonte de dados para o controle DataGrid, um objeto DataView. Desta maneira poderemos utilizar as facilidades de ordenao e filtragem do objeto DataView, para definir quais dados e de que maneira estes dados sero exibidos no DataGrid.

Ordenao com o Controle DataGrid


O controle DataGrid possui uma propriedade chamada AllowSorting (j descrita no Captulo 10). Quando esta propriedade definida em True, os ttulos de coluna, do controle DataGrid, so transformados em Hyperlinks. Quando clicamos em um destes links, ocorre um PostBack e o cdigo definido para o evento SortCommand executado. Vamos construir um exemplo onde so exibidos todos os pedidos para o Brasil, a partir da tabela Pedidos do Banco de dados NorthWind.mdb. Definiremos a propriedade AllowSorting do controle DataGrid para True. O passo final criar o cdigo que executa quando o usurio clica no ttulo de uma das colunas. Por exemplo, se o usurio clicar na coluna CidadeDeDestino, devemos ordenar os dados pela CidadeDeDestino. Na Listagem 11.7 temos o cdigo para o exemplo proposto.

Listagem 11.7 Ordenao com o controle DataGrid.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>

<html>

NOTA: Para a criao deste exemplo, utilizaremos algumas tcnicas avanadas. Todas as tcnicas utilizadas sero descritas aps o cdigo do exemplo.

<script language=C# runat=server>

// 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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


// // // // No evento Page_Load definimos a ordenao padro, pelo campo NmeroDoPedido e chamamos o procedimento BuscaDados(). A definio do campo padro de ordenao somente ocorre quando a pgina carregada pela primeira vez, isto , quando no for um PostBack.

void Page_Load(Object Src, EventArgs E )

if (Page.IsPostBack) { // No faz nada. } else // Define, por padro, a ordenao por NmeroDoPedido. { OrdenaPor = NmeroDoPedido; }

// Chamo a rotina que acessa o Banco de dados e preenche o DataGrid.

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.

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

441

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

// 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);

// Criamos e preenchemos um objeto DataSet.

DataSet ds = new DataSet();

// 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.

DataView source = new DataView(ds.Tables[0]);

// Defino a propriedade Sort, do objeto source, como sendo // igual ao valor da String OrdenaPor.

source.Sort=OrdenaPor;

// Ligo o objeto DataView a um controle do tipo // DataGrid - MinhaGrade.

MinhaGrade.DataSource = source; MinhaGrade.DataBind();

www.juliobattisti.com.br

442

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


// Rotina que executa em resposta ao evento OnSortCommando // do controle DataGrid. // Esta rotina recebe dois argumentos, um do tipo Object e outro // e outro do tipo DataGridSortCommandEventArgs.

void OrdenaDados(Object sender, DataGridSortCommandEventArgs e) {

// 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>

<h3><font face=Verdana>Ordenao com o controle DataGrid!!!</font></h3>

<form runat=server>

<H4> Clique no ttulo da coluna para ordenar pelo campo respectivo.</H4> <HR>

<ASP:DataGrid id=MinhaGrade runat=server Width=700" BackColor=#ccccff BorderColor=black ShowFooter=false

443

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


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.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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2

Figura 11.8: Dados ordenados pela coluna CidadeDeDestino.


Na seo de apresentao da pgina, inserimos um controle do tipo DataGrid. Definimos a propriedade AllowSorting=True. Isso faz com que o cabealho das colunas seja exibido como um link. Na propriedade OnSortCommand, definimos o nome do procedimento que ser executado quando o usurio clicar no link referente ao cabealho de uma coluna:
AllowSorting=True OnSortCommand=OrdenaDados

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Neste momento o objeto DataView ordenado pela coluna, cujo nome est contido na String OrdenaPor. O elemento principal: o procedimento OrdenaDados. Este procedimento executado em resposta ao evento OnSortCommand, o qual acontece toda vez que o usurio clica em um link, de uma das colunas do DataGrid. Vamos acompanhar o que acontece quando, por exemplo, o usurio clica no link da coluna CidadeDeDestino. 1. 2. 3. O evento OnSortCommand disparado. Em resposta ao evento OnSortCommand, o procedimento OrdenaDados executado. O procedimento OrdenaDados recebe dois argumentos. O primeiro um argumento do tipo Object e o segundo do tipo DataGridSortCommandEventArgs. Este segundo evento tem uma propriedade chamada SortExpression, a qual retorna o nome da coluna correspondente ao link clicado pelo usurio. No nosso exemplo a expresso:
OrdenaPor = e.SortExpression.ToString();

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.

Filtrando Dados com o Controle DataGrid


Para filtrar os dados de um objeto DataView, utilizamos a propriedade RowFilter. Atribumos, a esta propriedade, uma expresso de filtragem. Por exemplo, se quisermos que sejam exibidos apenas os pedidos em que o campo PasDeDestino seja igual a Brasil, utilizamos o seguinte comando:
PasDeDestino = Brasil

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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


Exemplo: Vamos apresentar um exemplo, onde destacaremos as seguintes tcnicas: Utilizao de um comando SQL para retornar dados de duas tabelas. Utilizao da propriedade RowFilter, do objeto DataView, para filtrar os dados exibidos em um DataGrid. O nosso exemplo ser composto de um formulrio onde temos um controle DataGrid que exibe os campos indicados na Tabela 11.2.

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.

Listagem 11.8 Filtragem com o controle DataGrid.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>

<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.

<script language=C# runat=server>

// Declaro uma varivel do tipo String. // Esta varivel contm o nome da coluna pela qual

447

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


// faremos a ordenao. // Esta varivel pode ser acessada em qualquer procedimento da pgina.

String OrdenaPor; String FiltraDados;

void Page_Load(Object Src, EventArgs E ) {

if (Page.IsPostBack) { // Define o valor da String FiltraDados que, // na prtica, a expresso de filtragem dos dados, // que ser atribuda propriedade RowFilter.

FiltraDados=NomeDaEmpresa LIKE * + DigitaCriterio.Text + *; } else

// Define, por padro, a ordenao por NmeroDoPedido. // Atribui um valor padro para o campo de pesquisa. { OrdenaPor = NmeroDoPedido; DigitaCriterio.Text=a; }

// Chamo a rotina que acessa o Banco de dados e preenche o DataGrid.

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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


void BuscaDados() {

// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

// 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;

ComandoSQL = aux1SQL + aux2SQL +aux3SQL +aux4SQL;

OleDbDataAdapter MeuComando = new OleDbDataAdapter(ComandoSQL, MinhaConexo);

// Criamos e preenchemos um objeto DataSet. // Observe que no temos mais o objeto Recordset, // como era de praxe com o ASP 3.0.

DataSet ds = new DataSet();

// Utilizo o mtodo Fill do objeto DataAdapter, para preencher

449

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


// 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.

DataView source = new DataView(ds.Tables[0]);

// Defino a propriedade Sort, do objeto source, como sendo // igual ao valor da String OrdenaPor.

source.Sort=OrdenaPor;

// Defino a propriedade RowFilter, para aplicar o critrio de filtragem. // definido na varivel

source.RowFilter=FiltraDados;

// Ligo o objeto DataView a um controle do tipo // DataGrid.

MinhaGrade.DataSource = source; MinhaGrade.DataBind();

// Rotina que executa em resposta ao evento OnSortCommando // do controle DataGrid.

void OrdenaDados(Object sender, DataGridSortCommandEventArgs e) {

// 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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


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>

<h3><font face=Verdana>Ordenao com o controle DataGrid!!!</font></h3>

<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>

<TR> <TD> Critrio > </TD>

<TD> <asp:TextBox runat=server id=DigitaCriterio Text= Font_Face=Arial Font_Size=3" Font-Bold=True BackColor=lightblue

451

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Height=20" /> </TD>

<TD> <asp:Button id=Pesquisar Text=Pesquisar runat=server /> </TD>

</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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


Ser exibida uma pgina com todos os pedidos. 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. Clique no ttulo da coluna NmeroDoPedido para classificar a listagem pelo NmeroDoPedido, conforme indicado na Figura 11.9.

Figura 11.9: Todos os pedidos sendo exibidos.


Agora vamos definir um critrio de Filtragem. No campo Critrio digite a palavra Moreno e d um clique no boto Pesquisar. Sero exibidos apenas os pedidos para os clientes que contm a palavra Moreno em qualquer parte do campo NomeDaEmpresa, conforme indicado na Figura 11.10. Para voltar a exibir todos os registros, apague o contedo do campo Critrio e d um clique no boto Pesquisar. Comentrios sobre o cdigo do exemplo Chap11ex8.aspx: Novamente utilizamos trs procedimentos. 1. 2. 3. Page_Load Busca_Dados OrdenaDados

453

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 11.10: Aplicando um critrio de filtragem.


Criamos duas variveis do tipo String; uma para conter o nome do campo pelo qual ordenamos a listagem OrdenaPor e outra para conter a expresso referente ao critrio de Filtragem FiltraDados:
String OrdenaPor; String FiltraDados;

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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


aux4SQL= ORDER BY Pedidos.NmeroDoPedido;

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

O Controle DataGrid em Detalhes


Nos exemplos que utilizamos at o momento, definimos a propriedade DataSource de um controle DataGrid como sendo um objeto DataView e chamamos o mtodo DataBind do DataGrid. Isso faz com que seja gerado um DataGrid com tantas colunas quantos forem os campos do objeto DataView, sendo que as colunas do DataGrid so geradas automaticamente. Podemos ter controle sobre a maneira como as colunas de um DataGrid so geradas. Por exemplo, podemos definir diferentes aspectos visuais para cada coluna, diferentes tipos, etc. Cada coluna de um DataGrid um controle de um dos seguintes tipos: BoundColumn ButtonColumn EditCommandColumn HyperLinkColumn TemplateColumn Por padro a propriedade AutoGenerateColumns definida em True, o que faz com que as colunas do DataGrid sejam geradas, automaticamente, e sejam do tipo BoundColumn. Para cada campo da fonte de dados, quer seja um objeto DataView ou um objeto DataReader, ser gerada uma coluna do tipo BoundColumn, na ordem em que os campos aparecem na fonte de dados. A primeira coluna gerada exibir os dados do campo NmeroDoPedido; a segunda exibir os dados do campo CidadeDeDestino e assim por diante. Para controlar, manualmente, quais colunas faro parte do DataGrid e qual o formato das colunas, devemos definir a propriedade AutoGenerateColumns=False. Uma vez definida esta propriedade como False, podemos adicionar as colunas desejadas. Para controlar a aparncia de cada coluna, definimos uma srie de propriedades para cada coluna. Alm de definir cada coluna manualmente, tambm podemos definir as caractersticas da primeira linha do DataGrid, normalmente a linha de ttulos; dos itens de cada linha; dos itens de cada linha quando em modo de edio e da ltima linha do DataGrid. Estes elementos so definidos dentro de uma coluna do tipo TemplateColumn. A seguir temos a sintaxe completa para o controle DataGrid, quando definimos as colunas do mesmo manualmente:
<asp:DataGrid id=identificao_no_cdigo runat=server

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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


DataSource=<%# Fonte de dados. %> AutoGenerateColumns=False (outras propriedades) >

<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.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Text=ButtonCaption Visible=True|False/>

<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/>

<asp:TemplateColumn FooterText=FooterText HeaderImageUrl=url HeaderText=HeaderText ReadOnly=True|False SortField=DataSourceFieldToSortBy Visible=True|False>

www.juliobattisti.com.br

458

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


<HeaderTemplate> Header template HTML </HeaderTemplate > <ItemTemplate> ItemTemplate HTML </ItemTemplate> <EditItemTemplate> EditItem template HTML </EditItemTemplate> <FooterTemplate> Footer template HTML </FooterTemplate>

</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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Tipo EditCommandColumn TemplateColumn

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.

Um Exemplo de Criao Manual de Colunas BoundColumn


Cada tipo de coluna tem uma srie de propriedades que podemos utilizar para controlar os aspectos visuais, funcionais e de formatao da coluna. Vamos apresentar um exemplo onde criamos manualmente as colunas de um DataGrid, utilizando colunas do tipo BoundColumn. Utilizaremos algumas propriedades para definir as caractersticas de cada coluna, e depois estudaremos mais detalhes sobre as propriedades disponveis. Na Listagem 11.9 temos o cdigo para o exemplo proposto.

Listagem 11.9 Criando colunas manualmente em um DataGrid.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.SqlClient %>

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>

<script language=C# runat=server>

void BuscaDados() {

// Crio uma conexo com o banco de dados pubs localizado no servidor local. // Vamos acessar a instncia SERVIDOR\NETSDK.

SqlConnection myConnection = new SqlConnection(server=SERVIDOR\\NETSDK; + uid=sa;pwd=;database=pubs);

// 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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


SqlDataAdapter myCommand = new SqlDataAdapter(SELECT + au_id,au_fname,phone FROM Authors Order By au_fname, myConnection);

// Criamos e preenchemos um objeto DataSet.

DataSet ds = new DataSet(); myCommand.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.

DataView source = new DataView(ds.Tables[0]); MinhaGrade.DataSource = source ; MinhaGrade.DataBind(); }

void Page_Load(Object sender, EventArgs e) { BuscaDados(); }

</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>

<asp:DataGrid id=MinhaGrade BorderColor=black BorderWidth=1" CellPadding=3" AutoGenerateColumns=false runat=server>

<HeaderStyle

461

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


BackColor=#00aaaa Font-Bold=True Font-Name=Courier New ForeColor=White >

</HeaderStyle>

<Columns>

<asp:BoundColumn HeaderText=Cdigo DataField=au_id ItemStyle-BackColor=#c0c0c0" >

</asp:BoundColumn>

<asp:BoundColumn HeaderText=Nome DataField=au_fname ItemStyle-Font-Italic=True ItemStyle-Font-Name=Courier New >

</asp:BoundColumn>

<asp:BoundColumn HeaderText=Telefone DataField=phone ItemStyle-BackColor=#c0ffff ItemStyle-Font-Bold=True > </asp:BoundColumn> </Columns>

</asp:DataGrid>

</form>

</body> </html>

www.juliobattisti.com.br

462

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


Digite o cdigo da Listagem 11.9 e salve o mesmo em um arquivo chamado chap11ex9aspx, 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/chap11ex9aspx Ser exibida uma listagem com o cdigo, nome e telefone dos autores, da tabela authors, do Banco de dados pubs, conforme indicado na Figura 11.11.

Figura 11.11: Colunas com diferentes formataes.


Observe que as colunas apresentam diferentes formataes. Comentrios sobre o cdigo do exemplo Chap11ex8.aspx: Em primeiro lugar observe que aplicamos diversas formataes diferentes s diversas partes do controle DataGrid. 1. 2. 3. 4. Para a primeira linha dos ttulos das colunas, aplicamos as seguintes formataes: Negrito, fonte Courier New e cor Branca. Para a primeira coluna aplicamos cor cinza para o segundo plano. Para a segunda coluna aplicamos uma fonte Courier New e Itlico. Para a terceira coluna aplicamos negrito e uma tonalidade de verde para a cor de segundo plano.

463

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Para criar as colunas manualmente, em primeiro lugar definimos a propriedade AutoGenerateColumns do DataGrid como False:
AutoGenerateColumns=False

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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


<asp:BoundColumn HeaderText=Telefone DataField=phone ItemStyle-BackColor=#c0ffff ItemStyle-Font-Bold=True > </asp:BoundColumn>

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.

Implementando Paginao com o Controle DataGrid


No Captulo 10 descrevemos o conceito de paginao e vimos que, para habilitar a paginao, devemos definir a propriedade AllowPaging como True. Neste tpico veremos

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


como fazer com que a paginao funcione, ou seja, quando o usurio clica no link Prxima Pgina ou no nmero da prxima pgina, faremos com que seja exibido o prximo conjunto de registros. Ao tornarmos a propriedade AllowPaging igual a True, ser criada mais uma linha, no final do DataGrid. Nesta linha podemos exibir um link para a prxima pgina e para a pgina anterior ou a numerao de pgina: 1 2 3 4 5 6 7 8 9 10 ...; onde cada nmero um link para a pgina respectiva. Podemos personalizar o que exibido nesta linha que chamaremos de Barra de Navegao. Por padro os links de navegao so alinhados esquerda, no DataGrid. Cada vez que o usurio clica em um dos links da Barra de Navegao, disparado o evento PageIndexChanged. Ao criarmos o DataGrid definimos a propriedade PageIndexChanged com o nome do procedimento que ser executado em resposta ao evento. Neste procedimento colocaremos o cdigo para navegar para a pgina relacionada ao link clicado pelo usurio. Em resumo, para fazer paginao com o DataGrid, devemos fazer o seguinte: Definir a propriedade AllowPaging como True. Definir o nome do procedimento que ser executado em resposta ao evento PageIndexChanged. Criar o cdigo do procedimento que executa em resposta ao evento OnIndexChanged. Para definir as caractersticas da linha onde so exibidos os links de navegao, ns fazemos uso das propriedades PagerStyle-Definio, do controle DataGrid. Por exemplo, para alinhar os links de navegao direita, ns definimos a seguinte propriedade:
PagerStyle-HorizontalAlign=Right

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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2

Propriedade PagerStyle-PrevPageText PagerStyle-Position

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.

Listagem 11.10 Paginao com o controle DataGrid.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>

<html>

<script language=C# runat=server>

void Page_Load(Object Src, EventArgs E ) { if (!Page.IsPostBack) { MinhaGrade.CurrentPageIndex = 0; BuscaDados(); } }

void BuscaDados() {

467

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


// Crio uma conexo com o banco de dados do Microsoft Access. // C:\Meus documentos\NorthWind.mdb.

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

// Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna as cidades da Alemanha. String aux1SQL; String aux2SQL; String ComandoSQL;

aux1SQL= SELECT CdigoDoCliente,NomeDaEmpresa,Cidade,Pas,Telefone ; aux2SQL= FROM Clientes Order By CdigoDoCliente;

ComandoSQL= aux1SQL + aux2SQL;

OleDbDataAdapter MeuComando = new OleDbDataAdapter(ComandoSQL, MinhaConexo);

// Criamos e preenchemos um objeto DataSet.

DataSet ds = new DataSet();

// 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.

DataView source = new DataView(ds.Tables[0]);

// Ligo o objeto DataView a um controle do tipo

www.juliobattisti.com.br

468

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


// DataGrid - MinhaGrade.

MinhaGrade.DataSource = source; MinhaGrade.DataBind();

// Procedimento que faz a navegao para a prxima pgina // ou para a pgina anterior, dependendo do link clicado // pelo usurio.

void TrocaPagina(Object sender, DataGridPageChangedEventArgs e) { MinhaGrade.CurrentPageIndex=e.NewPageIndex; BuscaDados(); }

</script>

<body>

<h3><font face=Verdana>Paginao com ASP.NET!!!</font></h3>

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


PagerStyle-PrevPageText=<<- Pgina Anterior PagerStyle-Font-Bold=True PagerStyle-Font-Size=12pt PagerStyle-BackColor=#c0c0c0"

/>

<HR> </form> </body> </html>

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.

Figura 11.12: Listagem de Clientes dividida em pginas.

www.juliobattisti.com.br

470

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


Clique no link Prxima Pgina ->> e observe que so exibidos os prximos dez clientes. Tambm observe que o link <<- Pgina Anterior foi habilitado, conforme indicado na Figura 11.13.

Figura 11.13: Navegando com o controle DataGrid.


Comentrios sobre o cdigo do exemplo Chap11ex8.aspx: Na definio do DataGrid utilizamos uma srie de propriedades para a definio dos aspectos visuais da barra de navegao. Estas propriedades esto descritas na Tabela 11.4. Uma propriedade interessante a propriedade Mode, que por padro tem o valor NextPrev. Se alterarmos o seu valor para NumericPages, ao invs do link Prximo e do link Anterior, teremos diversos links, um para cada pgina do DataGrid. Vamos alterar a definio do DataGrid, para que a mesma fique da seguinte maneira:
<ASP:DataGrid id=MinhaGrade runat=server CellPadding=3 CellSpacing=0" Font-Name=CourierNew Font-Size=10pt HeaderStyle-BackColor=#aaaadd MaintainState=false

471

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


AllowPaging=True OnPageIndexChanged=TrocaPagina PageSize=10" PagerStyle-Position=TopAndBottom PagerStyle-Mode=NumericPages PagerStyle-Font-Bold=True PagerStyle-Font-Size=12pt PagerStyle-BackColor=#c0c0c0" />

Se fizermos estas alteraes e recarregarmos a pgina, obteremos o resultado indicado na Figura 11.14.

Figura 11.14: PagerStyle-Mode=NumericPages.


No evento Page_Load detectamos se no um PostBack (isto acontece quando a pgina est senda carregada pela primeira vez); caso no seja um PostBack, definimos a pgina atual como sendo a primeira pgina e executamos o procedimento BuscaDados:
MinhaGrade.CurrentPageIndex = 0; BuscaDados();

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

CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2


O procedimento BuscaDados idntico ao utilizado em exemplos anteriores e, portanto, dispensa maiores comentrios. O procedimento TrocaPagina definido na propriedade OnPageIndexChanged, do DataGrid:
OnPageIndexChanged=TrocaPagina

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


Nos diversos exemplos deste captulo, utilizaremos os objetos do namespace System.Data.OleDb, para fazer conexo com um banco de dados do Microsoft Access C:\Meus documentos\ NorthWind.mdb. Voc pode, facilmente, adaptar os exemplos para utilizar um banco de dados do SQL Server ou do ORACLE. Para utilizar um banco de dados do SQL Server, basta alterar a string de conexo, de tal maneira que, ao invs de utilizar o banco de dados NorthWind.mdb, voc passe a utilizar o banco de dados NorthWind que instalado com o SQL Server 2000. Porm, para obter um melhor desempenho, sugiro que voc utilize, ao invs dos objetos do namespace System.Data.OleDb, os objetos do namespace System.Data.SqlCliente, os quais so especficos e otimizados para o acesso a bancos de dados do SQL Server. Para conexo com o ORACLE voc apenas precisa alterar a string de conexo, para fazer a conexo com um servidor/ banco de dados onde o ORACLE esteja rodando.

No Esquea, Estamos em um Modelo Desconectado


Vamos recordar os passos que utilizamos nos Captulos 10 e 11, para conectar e retornar dados a partir de uma fonte de dados: 1. 2. 3. 4. 5. Criamos um objeto OleDbConnection ou SqlConnection. Criamos um objeto OleDbDataAdapter ou SqlDataAdapter. Passamos como parmetros para este objeto uma string SQL e uma referncia para o objeto Connection, criado no item 1. Criamos um objeto do tipo DataSet. Utilizamos o mtodo Fill, do objeto DataAdapter, para executar o comando SQL passado como parmetro, na criao do objeto DataAdapter e retornar os dados para o objeto DataSet. Neste momento temos um objeto DataSet com dados. Podemos criar um objeto DataView para ligar estes dados (Data Bound) a um controle, como por exemplo DataGrid ou DropDownList. importante salientar que o objeto DataSet no mantm nenhuma conexo com o banco de dados, ou seja, o mesmo est desconectado do banco de dados. Para fazermos alteraes nos dados, e enviar estas alteraes de volta para o banco de dados, utilizaremos a seguinte abordagem: Criaremos um objeto do tipo DataTable, ligado a uma das tabelas do DataSet. Faremos as alteraes, incluses e excluses necessrias, utilizando os mtodos respectivos do objeto DataTable. Utilizaremos mtodos do objeto DataAdapter para enviar as alteraes de volta para o banco de dados. Se no utilizarmos estes mtodos, as alteraes no sero enviadas para o banco de dados e sero perdidas quando a pgina for encerrada.

O Objeto DataTable Alteraes nos Dados Desconectados


O objeto DataTable faz parte do namespace System.Data. Este objeto utilizado para representar uma tabela de dados na memria.

475

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Podemos criar um objeto DataTable completamente independente, isto , podemos definir atravs de cdigo as colunas do objeto e adicionar registros. Outra maneira criar o objeto associado a uma tabela de um objeto DataSet. Uma das maneiras de criar um objeto DataSet utilizando o prprio construtor da classe DataTable, conforme o exemplo a seguir:
DataTable MinhaTabela = new DataTable(Pedidos);

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);

Na Tabela 12.1 temos a descrio das principais propriedades da classe DataTable.

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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


Na Tabela 12.2 temos a descrio dos principais mtodos da classe DataTable.

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.

Clear Clone Copy LoadDataRow

NewRow RejectChanges

Inserindo, Excluindo e Adicionando Dados com o Objeto DataTable


Vamos apresentar alguns exemplos onde faremos as seguintes operaes: Adio de uma nova linha. Excluso de uma linha. Alterao de uma linha. Neste tpico aprenderemos a fazer as alteraes no conjunto de dados da tabela representada pelo objeto DataTable. Porm ainda no faremos a sincronizao de dados com o banco de dados. Iremos comprovar este fato exibindo os dados do DataTable, aps as alteraes e conferindo que as mesmas no foram enviadas para o banco de dados. Isso comprova o modelo desconectado do ASP.NET. Nos prximos tpicos aprenderemos a fazer a sincronizao com o banco de dados. Exemplo 1: Vamos criar um exemplo onde acessamos os dados da tabela Clientes, do banco de dados NorthWind.mdb. Retornaremos apenas os clientes para o Brasil. Utilizando cdigo, no evento Page_Load, adicionaremos dois novos registros ao objeto DataTable. Exibiremos a tabela original em um DataGrid e a tabela com os novos registros em um

477

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


segundo DataGrid. Em seguida abriremos o banco de dados NorthWind.mdb e comprovaremos que as adies no foram enviadas para o banco de dados. Na Listagem 12.1 temos o cdigo para o exemplo proposto.

Listagem 12.1 O objeto DataTable Chjap12Ex1.aspx.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>

<html>

<script language=C# runat=server>

protected void Page_Load(Object Src, EventArgs E ) {

// Crio uma conexo com o banco de dados NorthWind.mdb // que est na pasta C:\Meus documentos.

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

// Utilizamos um objeto DataAdapter para executar um comando SQL, // o qual retorna todos os dados da tabela Clientes.

String auxSQL1; String auxSQL2; String auxSQL3; String ComandoSQL;

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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


OleDbDataAdapter MeuComando = new OleDbDataAdapter(ComandoSQL, MinhaConexo);

// Criamos e preenchemos um objeto DataSet.

DataSet ds = new DataSet();

// 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.

DataView source = new DataView(ds.Tables[0]);

MinhaGrade1.DataSource = source ; MinhaGrade1.DataBind();

// Agora vamos criar um objeto DataTable. // Chamaremos este objeto de Clientes2 e iremos // associ-lo a primeira tabela do objeto ds.

DataTable Clientes2 = ds.Tables[0];

// Adicionaremos duas novas linhas tabela Clientes2.

DataRow Linha = Clientes2.NewRow();

// Defino os valores para a linha a ser inserida.

Linha[CdigoDoCliente]=XXYYK; Linha[NomeDaEmpresa]=ABC Ltda.; Linha[Endereo]=Rua das letras, 123"; Linha[Telefone]=222-2222"; Linha[Pas]=Brasil;

479

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Clientes2.Rows.Add(Linha);

DataRow Linha2 = Clientes2.NewRow(); <l // Defino os valores para a linha a ser inserida.

Linha2[CdigoDoCliente]=WWMMK; Linha2[NomeDaEmpresa]=LMN Ltda.; Linha2[Endereo]=Rua dos nmeros, 123"; Linha2[Telefone]=555-5555"; Linha2[Pas]=Brasil;

Clientes2.Rows.Add(Linha2);

MinhaGrade2.DataSource = Clientes2.DefaultView; MinhaGrade2.DataBind();

</script>

<body> <% Exibe as informaes do DataGrid no corpo da pgina. %>

<h3><font face=Verdana>Exemplo do objeto DataSet!!!</font></h3>

<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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


HeaderStyle-BackColor=#aaaadd MaintainState=false />

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 12.1: Utilizando o objeto DataTable Chap12ex1.aspx.


2. Em seguida criamos um objeto DataTable, chamado Clientes2, objeto este ligado primeira tabela do objeto DataSet, que no nosso caso a tabela Clientes. Na prtica estamos criando uma cpia da tabela Clientes, na tabela Clietnes2.
DataTable Clientes2 = ds.Tables[0];

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.

DataRow Linha = Clientes2.NewRow();

// Defino os valores para as colunas da linha a ser inserida.

Linha[CdigoDoCliente]=XXYYK; Linha[NomeDaEmpresa]=ABC Ltda.; Linha[Endereo]=Rua das letras, 123";

www.juliobattisti.com.br

482

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


Linha[Telefone]=222-2222"; Linha[Pas]=Brasil;

// Adiciona a linha coleo de linhas da tabela Clientes2.

Clientes2.Rows.Add(Linha);

4.

Repetimos as operaes do item anterior, para adicionar mais uma linha:


// Declaro um objeto do tipo DataRow.

DataRow Linha2 = Clientes2.NewRow();

// Defino os valores para a linha a ser inserida.

Linha2[CdigoDoCliente]=WWMMK; Linha2[NomeDaEmpresa]=LMN Ltda.; Linha2[Endereo]=Rua dos nmeros, 123"; Linha2[Telefone]=555-5555"; Linha2[Pas]=Brasil;

// Adiciona a linha coleo de linhas da tabela Clientes2.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 12.2: O Banco de dados NorthWind.mdb ainda no foi atualizado.


Exemplo 2: Vamos modificar um pouco o exemplo anterior. Ao invs de adicionarmos duas novas linhas, vamos excluir as duas primeiras linhas do objeto DataTable. Vamos exibir os dados originais, retornados do Banco de dados NorthWind.mdb e a tabela Clientes2, aps as excluses dos registros. Na Listagem 12.2 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.

Listagem 12.2 O objeto DataTable Excluindo linhas.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>

<html>

<script language=C# runat=server>

protected void Page_Load(Object Src, EventArgs E ) {

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

String auxSQL1;

www.juliobattisti.com.br

484

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


String auxSQL2; String auxSQL3; String ComandoSQL;

auxSQL1= SELECT CdigoDoCliente,NomeDaEmpresa,Endereo,Telefone,Pas; auxSQL2= FROM Clientes Where Pas=Brasil; auxSQL3= Order By NomeDaEmpresa;

ComandoSQL= auxSQL1+auxSQL2+auxSQL3;

OleDbDataAdapter MeuComando = new OleDbDataAdapter(ComandoSQL, MinhaConexo); DataSet ds = new DataSet(); MeuComando.Fill(ds,Clientes2");

DataView source = new DataView(ds.Tables[0]);

MinhaGrade1.DataSource = source ; MinhaGrade1.DataBind();

// Agora vamos criar um objeto DataTable. // Chamaremos este objeto de Clientes2, para // distinguir da tabela Clientes, da coleo de // Tabelas do DataSet.

DataTable Clientes2 = ds.Tables[0];

// 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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


// ********************************************************* // Vamos descartar as excluses. Para isto chamaremos o mtodo // RejectChanges(), do objeto DataTable. // A chamada deste mtodo far com que as linhas marcadas para // excluso sejam restauradas ao seu estatus padro e, portanto, // exibidas no DataGrid MinhaGrade2.

Clientes2.RejectChanges();

MinhaGrade2.DataSource = Clientes2.DefaultView; MinhaGrade2.DataBind();

// 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();

MinhaGrade3.DataSource = Clientes2.DefaultView; MinhaGrade3.DataBind();

</script>

<body>

www.juliobattisti.com.br

486

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


<% Exibe as informaes do DataGrid no corpo da pgina. %>

<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>

<ASP:DataGrid id=MinhaGrade3" runat=server

487

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Width=700" BackColor=#c0c0c0" BorderColor=black ShowFooter=false CellPadding=3 CellSpacing=0" Font-Name=Courier New Font-Size=8pt Font-Bold=True HeaderStyle-BackColor=#aaaadd MaintainState=false />

</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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3

Figura 12.3: Utilizando o objeto DataTable Chap12ex2.aspx.


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. // Vamos descartar as alteraes. Para isto chamaremos o mtodo // RejectChanges(), do objeto DataTable. // A chamada deste mtodo far com que as linhas marcadas para // excluso sejam restauradas ao seu estatus padro e, portanto, // exibidas no DataGrid MinhaGrade2.

Clientes2.RejectChanges(); MinhaGrade2.DataSource = Clientes2.DefaultView; MinhaGrade2.DataBind();

489

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Conforme podemos comprovar na Figura 12.3, as linhas no foram excludas. Em seguida marcamos as duas primeiras linhas para excluso, porm agora chamamos o mtodo AcceptChanges, para confirmar as excluses. Exibimos os resultados no controle DataGrid3:
// 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();

MinhaGrade3.DataSource = Clientes2.DefaultView; MinhaGrade3.DataBind();

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>

<script language=C# runat=server>

// Declaro variveis que sero globais para a pgina.

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;

protected void Page_Load(Object Src, EventArgs E ) { if (!Page.IsPostBack) { OcultaControles();

// Defino a string para o comando SQL;

String auxSQL1; String auxSQL2; String comandoSQL;

auxSQL1 = Select CdigoDoCliente,NomeDaEmpresa,Endereo,Pas,Telefone From Clientes; auxSQL2 = Where Pas=Brasil + Order By NomeDaEmpresa;

comandoSQL = auxSQL1+auxSQL2; MinhaConexo = new OleDbConnection(DefineConexo);

491

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


MeuComando = new OleDbDataAdapter(comandoSQL, MinhaConexo);

// 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]);

// Ligo o objeto DataView a um controle do tipo // ListBox

MinhaLista.DataSource = source ; MinhaLista.DataBind();

} }

void OcultaControles() { txtNovoCdigoDoCliente.Visible =false; txtNovoNomeDaEmpresa.Visible = false; txtNovoEndereo.Visible=false; txtNovoTelefone.Visible=false; txtNovoPas.Visible=false; txtMostraAtualizado.Visible=false; txtMensagem.Visible=false; }

void ClienteSelecionado(Object sender, EventArgs e) {

www.juliobattisti.com.br

492

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


OcultaControles();

// Localiza o registro, correspondente ao // cliente selecionado na lista.

// Defino a string para o comando SQL;

String auxSQL1; String auxSQL2; String comandoSQL;

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.

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]);

DataTable Clientes = ds.Tables[0];

// Vamos definir o campo CdigoDoCliente como sendo a chave // primria da tabela Clientes.

Clientes.PrimaryKey = new DataColumn[] {Clientes.Columns[CdigoDoCliente]};

493

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


DataRow Linha = Clientes.Rows.Find(MinhaLista.SelectedItem.Value);

// 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();

void AtualizarRegistro(Object sender, EventArgs e) {

// Localiza o registro, correspondente ao // cliente que est sendo atualizado.

// Defino a string para o comando SQL;

String auxSQL1; String auxSQL2; String comandoSQL;

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.

MeuComando.Fill(ds); DataView source = new DataView(ds.Tables[0]);

www.juliobattisti.com.br

494

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


DataTable Clientes = ds.Tables[0];

// Vamos definir o campo CdigoDoCliente como sendo a chave // primria da tabela Clientes.

Clientes.PrimaryKey = new DataColumn[] {Clientes.Columns[CdigoDoCliente]};

DataRow Linha = Clientes.Rows.Find(MinhaLista.SelectedItem.Value);

// 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();

// Agora vamos editar o valor da linha.

Linha.BeginEdit(); Linha[CdigoDoCliente] Linha[NomeDaEmpresa] Linha[Endereo] Linha[Telefone] Linha[Pas] Linha.EndEdit(); = = = = = txtCdigoDoCliente.Text; txtNomeDaEmpresa.Text;

txtEndereo.Text; txtTelefone.Text; txtPas.Text;

// Defino o valor dos controles da terceira coluna // como sendo igual aos novos valores da linha

txtMostraAtualizado.Visible=true;

txtNovoCdigoDoCliente.Text = Linha[CdigoDoCliente].ToString(); txtNovoCdigoDoCliente.Visible =true;

495

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


txtNovoNomeDaEmpresa.Text = Linha[NomeDaEmpresa].ToString(); txtNovoNomeDaEmpresa.Visible = true;

txtNovoEndereo.Text = Linha[Endereo].ToString(); txtNovoEndereo.Visible=true;

txtNovoTelefone.Text = Linha[Telefone].ToString(); txtNovoTelefone.Visible = true;

txtNovoPas.Text = Linha[Pas].ToString(); txtNovoPas.Visible=true;

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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


<form runat=server>

<div align=left> <table border=0"> <tr>

<td> <p align=right> <B> Selecione um cliente ->> </B> </td>

<td> <asp:DropDownList id=MinhaLista runat=server BackColor=#c0c0c0" Font-Bold=True DataTextField = NomeDaEmpresa

DataValueField = CdigoDoCliente AutoPostBack = True onSelectedIndexChanged = ClienteSelecionado

>

</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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Font-Bold=True BackColor=#c0c0c0" Enabled=False Visible=False Height=20" Width=200" />

</td>

</tr>

<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" Height=20" Width=200" Enabled=False />

</td>

<td> <asp:TextBox runat=server

www.juliobattisti.com.br

498

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


id=txtNovoCdigoDoCliente Text= BackColor=#c0c0c0" TextMode=SingleLine Font_Face=Arial Font_Size=3" Height=20" Width=200" Enabled=False Visible=False /> </td> </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" Height=20" Width=200" />

</td>

<td>

499

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


<asp:TextBox runat=server id=txtNovoNomeDaEmpresa 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>Endereo:</B> </td>

<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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


<td> <asp:TextBox runat=server id=txtNovoEndereo 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>Telefone:</B> </td>

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


</td>

<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> <p align=right> <B>Pas:</B> </td>

<td>

<asp:TextBox runat=server id=txtPas Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" Height=20" Width=200"

www.juliobattisti.com.br

502

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


/>

</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> <asp:Button id=AtualizaDados Text=Atualizar dados runat=server OnCLick=AtualizarRegistro />

</td>

<td>

503

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


<asp:TextBox runat=server id=txtMensagem Text=Atualizado com sucesso !!! TextMode=SingleLine Font_Face=Arial Font_Size=3" Font-Bold=True BackColor=#c0c0c0" Visible=False Enabled=False Height=20" Width=200" /> </td>

</table> </div>

<asp:Label id=Label1" runat=server/>

</form> </body> </html>

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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3

Figura 12.4: Uma lista com os clientes do Brasil Chap12ex3.aspx.

Figura 12.5: O registro do cliente automaticamente localizado.


Clique no campo Telefone e altere o nmero do telefone para: (011-11) 555-2167.

505

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


D um clique no boto Atualizar dados. Na coluna do meio so exibidos os valores originais do registro para o cliente Tradio Hipermercados e, na coluna da direita, so exibidos os valores j alterados, conforme indicado na Figura 12.6.

Figura 12.6: Exibindo os valores antes e depois da edio.


Cabe, mais uma vez, ressaltar que os valores foram alterados no objeto DataTable, desconectado do banco de dados. As alteraes ainda no foram enviadas para o Banco de dados NorthWind.mdb. Para comprovar isto, basta abrir o Banco de dados NorthWind.mdb e verificar que o registro para o cliente Tradio Hipermercados no foi alterado. No prximo tpico aprenderemos a sincronizar o objeto DataTable com o banco de dados. Comentrios sobre o cdigo do exemplo Chap12ex3.aspx. O exemplo um pouco extenso, porm veremos que a sua funcionalidade bastante simples. Declaramos algumas variveis com escopo de pgina, ou seja, fora de qualquer procedimento. Estas variveis sero utilizadas em diversos procedimentos da pgina, e por isso foram declaradas com escopo de pgina:
// Declaro variveis que sero globais para a pgina.

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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


No evento Page_Load da pgina, fazemos a conexo com o Banco de dados NorthWind.mdb, retornamos dados da tabela Clientes e fazemos a ligao com o controle MinhaLista. O controle MinhaLista exibe uma listagem com o nome dos clientes do Brasil. O cdigo do evento Page_Load somente executado quando a pgina carregada pela primeira vez, ou seja, quando no for um PostBack. Observe que, no incio do procedimento, testamos se ou no um PostBack:
if (!Page.IsPostBack)

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

DataValueField = CdigoDoCliente AutoPostBack = True onSelectedIndexChanged = ClienteSelecionado > </asp:DropDownList>

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Quando selecionado um cliente, na lista de clientes, disparado o evento onSelectedIndexChanged. Para tratar este evento, definimos o procedimento ClienteSelecionado. Vamos analisar o funcionamento deste procedimento. O procedimento ClienteSelecionado inicia ocultando os controles da terceira coluna:
OcultaControles();

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];

Agora vamos definir a chave primria para a tabela Clientes:


Clientes.PrimaryKey = new DataColumn[] {Clientes.Columns[CdigoDoCliente]};

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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


Em resumo, o procedimento ClienteSelecionado faz o seguinte: 1. 2. 3. 4. 5. Oculta os controles da terceira coluna. Conecta com o banco de dados. Cria um objeto DataTable Clientes. Localiza o registro correspondente ao cliente selecionado na lista de clientes. Exibe os dados do cliente, nos controles TextBox da segunda coluna. Uma vez exibidos os dados do cliente, o usurio poder alterar o contedo dos campos, com exceo do campo CdigoDoCliente, que est desabilitado para alteraes (Enabled=False). O usurio faz as alteraes necessrias e clica no boto Atualizar dados. Ao clicar neste boto disparado o procedimento AtualizaRegistro. O procedimento AtualizaRegistro faz a conexo com o banco de dados e localiza o registro do cliente que est sendo editado. Neste caso so retornados os valores originais do registro, sem as alteraes feitas pelo usurio. Esta parte do procedimento idntica utilizada no procedimento ClienteSelecionado. Uma vez localizado o registro, com os valores originais, utilizamos uma srie de variveis auxiliares, para armazenar os valores originais para o registro do cliente:
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();

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;

txtNomeDaEmpresa.Text; txtEndereo.Text; txtTelefone.Text; txtPas.Text;

Em seguida tornamos os controles da terceira coluna visveis e exibimos, nestes controles, o registro j alterado:

509

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


// Defino o valor dos controles da terceira coluna // como sendo igual aos novos valores da linha txtMostraAtualizado.Visible=true;

txtNovoCdigoDoCliente.Text = Linha[CdigoDoCliente].ToString(); txtNovoCdigoDoCliente.Visible =true;

txtNovoNomeDaEmpresa.Text = Linha[NomeDaEmpresa].ToString(); txtNovoNomeDaEmpresa.Visible = true;

txtNovoEndereo.Text = Linha[Endereo].ToString(); txtNovoEndereo.Visible=true;

txtNovoTelefone.Text = Linha[Telefone].ToString(); txtNovoTelefone.Visible = true;

txtNovoPas.Text = Linha[Pas].ToString(); txtNovoPas.Visible=true;

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;

= auxEndereo; = auxTelefone; = auxPas;

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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


5. 6. 7. Edita o registro. Exibe os novos valores na terceira coluna. Exibe os valores originais na segunda coluna. O exemplo longo mas salienta uma srie de tcnicas teis que podem ser, facilmente, adaptadas para as aplicaes que o leitor venha a desenvolver com ASP.NET. Agora hora de aprendermos a sincronizar as alteraes feitas em um objeto DataTable, com o banco de dados, de tal forma que estas alteraes sejam enviadas de volta ao banco de dados.

Sincronizando Dados com o Banco de Dados


Para sincronizar as alteraes feitas nos dados desconectados, com o banco de dados, utilizaremos algumas propriedades do objeto OleDbDataAdapter/SqlDataAdapter. Tambm utilizaremos o mtodo Update, deste objeto. O processo para enviar as alteraes para o banco de dados bastante simples: 1. 2. 3. Definimos uma chave primria para o objeto DataTable. Criamos um objeto do tipo OleDbComandBuilder/SqlCommandBuilder. Na criao deste objeto passamos o nome do objeto DataAdapter como parmetro. Defino as seguintes propriedades do objeto DataAdapter: InsertCommand: Um comando SQL que envia, para o banco de dados, as novas linhas do objeto DataTable. DeleteCommand: Um comando SQL que exclui do banco de dados as linhas que foram excludas no objeto DataTable. UpdateCommand: Um comando SQL que envia, para o banco de dados, as alteraes feitas nas linhas do objeto DataTable. Estas propriedades podem ser definidas manualmente ou atravs da utilizao de um objeto OleDbCommandBuilder/ SqlCommandBuilder. O objeto CommandBuilder possui um mtodo GetDeleteCommand para gerar, automaticamente, o comando para enviar as excluses para o banco de dados; possui um mtodo GetInsertCommand para gerar, automaticamente, o comando para inserir as novas linhas no banco de dados; e um mtodo GetUpdateCommand para gerar, automaticamente, o comando para enviar as alteraes para o banco de dados. 4. Uma vez definidos os comandos necessrios, chamamos o mtodo Update do objeto DataAdapter. Este mtodo executa, no banco de dados, os comandos definidos nas propriedades InsertCommand, DeleteCommand e UpdateCommand. Caso tenhamos definido apenas uma destas propriedades, somente os respectivos comandos sero executados. Por exemplo, se construmos um formulrio para cadastrar clientes, apenas precisaremos definir a propriedade InsertCommand. Vamos lembrar do exemplo Chap12ex1.aspx. Neste exemplo inserimos duas linhas no objeto DataTable e comprovamos que estas adies no foram enviadas para o Banco de dados NorthWind.mdb. Se quisermos atualizar

511

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


o Banco de dados NorthWind.mdb, basta incluir as seguintes linhas de cdigo, no final do procedimento Page_Load, do referido exemplo:
// Em primeiro lugar, defino uma chave primria para o objeto DataTable.

Clientes2.PrimaryKey = new DataColumn[] {Clientes2.Columns[CdigoDoCliente]};

// 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

OleDbCommandBuilder CriaComando = new OleDbCommandBuilder(MeuComando);

// Agora defino a propriedade InsertCommand do objeto MeuDataAdapter.

MeuDataAdapter.InsertCommand= CriaComando.GetInsertCommand(); MeuDataAdapter.Update(ds,Clientes2");

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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


Endereo Telefone Pas

Figura 12.7: Erro CdigoDoCliente repetido.


Os demais campos no so de preenchimento obrigatrio. Na Listagem 12.4 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 em que temos novidades.

Listagem 12.4 Formulrio para Cadastro de Clientes Chap12ex4.aspx.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>

<html>

<script language=C# runat=server> // Declaro variveis que sero globais para a pgina.

OleDbDataAdapter MeuDataAdapter;

513

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


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;

void InserirCliente(Object sender, EventArgs e) {

// Defino a string para o comando SQL;

String comandoSQL; comandoSQL = Select * From Clientes;

MinhaConexo = new OleDbConnection(DefineConexo); MeuDataAdapter = new OleDbDataAdapter(comandoSQL, MinhaConexo);

MeuDataAdapter.Fill(ds,Clientes);

DataView source = new DataView(ds.Tables[0]);

DataTable Clientes = ds.Tables[0];

// Vamos definir o campo CdigoDoCliente como sendo a chave // primria da tabela Clientes.

Clientes.PrimaryKey = new DataColumn[] {Clientes.Columns[CdigoDoCliente]};

// Chamo o mtodo NewRow da tabela Clientes.

DataRow Linha = Clientes.NewRow();

// Defino os valores para a linha a ser inserida.

www.juliobattisti.com.br

514

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


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);

// Agora crio os comandos necessrios para enviar // as alteraes/incluses/excluses para o banco // de dados NorthWind.mdb

// Em primeiro lugar crio um objeto do tipo OleDbCommandBuilder

OleDbCommandBuilder CriaComando = new OleDbCommandBuilder(MeuDataAdapter);

// Agora defino a propriedade InsertCommand do objeto MeuDataAdapter.

MeuDataAdapter.InsertCommand= CriaComando.GetInsertCommand();

// Chamo o mtodo Update do objeto DataAdapter.

MeuDataAdapter.Update(ds,Clientes);

// Informo que o registro foi inserido com sucesso.

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.

515

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


txtCdigoDoCliente.Text =; txtNomeDaEmpresa.Text txtNomeDoContato.Text =; =;

txtCargoDoContato.Text =; txtEndereo.Text txtCidade.Text txtRegio.Text txtCEP.Text txtPas.Text txtTelefone.Text txtFax.Text =; =; =; =; =; =; =;

</script>

<body>

<asp:Label id=Label1" runat=server />

<HR> <asp:Label id=Label2" runat=server />

<h3><font face=Verdana> CADASTRO DE CLIENTES <BR> Empresa North Traders Ltda. </font> </h3>

www.juliobattisti.com.br

516

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


<HR>

<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 />

<asp:RequiredFieldValidator id=Requer_Telefone ControlToValidate=txtTelefone

517

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Type=String ErrorMessage=O Telefone campo Obrigatrio. Text=O Telefone campo Obrigatrio. ForeColor=Red runat=server />

<asp:RequiredFieldValidator id=Requer_Pas ControlToValidate=txtPas Type=String ErrorMessage=O Pas campo Obrigatrio. Text=O Pas campo Obrigatrio. ForeColor=Red runat=server />

<div align=left> <table border=0">

<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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


</td>

</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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Height=20" Width=250" /> </td> </tr> <tr> <td> <p align=right> <B>Cargo do Contato:</B> </td> <td> <asp:TextBox runat=server id=txtCargoDoContato Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" MaxLength=30" Height=20" Width=250" /> </td> </tr> <tr> <td> <p align=right> <B>Endereo:(*)</B> </td> <td> <asp:TextBox runat=server id=txtEndereo Text= TextMode=SingleLine Font_Face=Arial Font_Size=3"

www.juliobattisti.com.br

520

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


MaxLength=60" Height=20" Width=200" /> </td> </tr> <tr> <td> <p align=right> <B>Cidade:</B> </td> <td> <asp:TextBox runat=server id=txtCidade Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" MaxLength=15" Height=20" width=250" /> </td> </tr> <tr> <td> <p align=right> <B>Regio:</B> </td> <td> <asp:TextBox runat=server id=txtRegio Text= TextMode=SingleLine Font_Face=Arial

521

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Font_Size=3" MaxLength=15" Height=20" Width=250" /> </td> </tr> <tr> <td> <p align=right> <B>CEP:</B> </td> <td> <asp:TextBox runat=server id=txtCEP Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" MaxLength=10" Height=20" Width=250" /> </td> </tr> <tr> <td> <p align=right> <B>FAX:</B> </td> <td> <asp:TextBox runat=server id=txtFax Text= TextMode=SingleLine

www.juliobattisti.com.br

522

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


Font_Face=Arial Font_Size=3" MaxLength=24" Height=20" Width=250" /> </td> </tr> <tr> <td> <p align=right> <B>Telefone:(*)</B> </td> <td> <asp:TextBox runat=server id=txtTelefone Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" MaxLength=24" Height=20" Width=200" /> </td> </tr> <tr> <td> <p align=right> <B>Pas:(*)</B> </td> <td>

<asp:TextBox runat=server id=txtPas

523

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" MaxLength=15" Height=20" Width=200" /> </td> <td> </tr> <tr> <td> <p align=right> <b>Clique no boto Cadastrar.</b> </td> <td> <asp:Button id=CadastraCliente Text=Cadastrar Cliente runat=server OnCLick=InserirCliente /> </td> </tr> <tr> <td> <B><p align=right> *** </B> </td> <td> <B> Campos de preenchimento obrigatrio </B> </td> </tr>

</table> </div> </form>

</body> </html>

www.juliobattisti.com.br

524

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


Digite o cdigo da Listagem 12.4 e salve o mesmo em um arquivo chamado chap12ex4.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/chap12ex4.aspx

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.

Figura 12.8: Formulrio para cadastro de Clientes.


Digite informaes para um cliente fictcio, porm deixe o campo Telefone, que um campo obrigatrio, em branco. Clique no boto Cadastrar Clientes. O cadastro do cliente no feito e voc informado de que o campo Telefone obrigatrio, conforme indicado na Figura 12.9.

525

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 12.9: Os controles de validao em ao.


Digite um valor para o telefone e d um clique no boto Cadastrar Cliente. Agora sim, o cliente cadastrado e o formulrio reapresentado, para que voc possa cadastrar outro cliente, conforme indicado na Figura 12.10. Comentrios sobre o cdigo do exemplo Chap12ex4.aspx. Para alinhar os controles, na seo de apresentao, utilizamos uma tabela com duas colunas. Na primeira coluna colocamos um texto descritivo do campo e, na segunda coluna, um controle TextBox para que o usurio digite informaes. Utilizamos controles de validao do tipo RequiredFieldValidator, para garantir que os seguintes campos sejam preenchidos: CdigoDoCliente NomeDaEmpresa Endereo Telefone Pas

www.juliobattisti.com.br

526

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3

Figura 12.10: Cliente cadastrado com sucesso.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 12.11: Erro ao deixar um campo Requerido em branco.


O evento InserirCliente faz o seguinte: 1. 2. Conecta com o banco de dados utilizando os comandos j vistos em exemplos anteriores. Cria um objeto DataTable Clientes, e define a chave primria:
DataTable Clientes = ds.Tables[0]; Clientes.PrimaryKey = new DataColumn[] {Clientes.Columns[CdigoDoCliente]};

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();

// Defino os valores para a linha a ser inserida.

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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3


Linha[Telefone] Linha[Fax] = txtTelefone.Text; = txtFax.Text;

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.

txtCdigoDoCliente.Text txtNomeDaEmpresa.Text =; txtNomeDoContato.Text =; txtCargoDoContato.Text txtEndereo.Text =; txtCidade.Text txtRegio.Text txtCEP.Text txtPas.Text =; =; =; =;

=;

=;

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.

Excluindo Registros a Propriedade DeleteCommand


Para enviar as excluses feitas em um objeto DataTable, para o banco de dados, utilizamos os seguintes passos: 1. Definimos uma chave primria para o objeto DataTable. Considere o exemplo:
Clientes.PrimaryKey = new DataColumn[] {Clientes.Columns[CdigoDoCliente]};

529

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


2. Localizo a linha a ser excluda. Para localizar a linha posso utilizar o mtodo Find, da coleo Rows, descrito e exemplificado anteriormente. Tambm posso utilizar, caso eu conhea, o ndice da linha a ser excludo. Vejamos alguns exemplos:
// Excluo a primeira linha do DataTable Clientes, utilizando o ndice da linha. Clientes.Rows[0].Delete(); // Outra alternativa localizar a linha a ser excluda e depois chamar o mtodo Delete da linha.

DataRow Linha = Clientes.Rows.Find(MinhaLista.SelectedItem.Value); Linha.Delete();

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

CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3

Adicionando Registros a Propriedade InsertCommand


Para enviar as adies de registros, feitas em um objeto DataTable, para o banco de dados, utilizamos os seguintes passos: 1. Definimos uma chave primria para o objeto DataTable. Considere o exemplo:
Clientes.PrimaryKey = new DataColumn[] {Clientes.Columns[CdigoDoCliente]};

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.

DataRow Linha = Clientes.NewRow();

// Defino os valores para a linha a ser inserida.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Definidos os comandos necessrios, hora de fazer com que estes comandos 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 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

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET

PARTE

3
Conceitos Avanados do ASP.NET e Segurana

533

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET


Com isso podemos criar aplicaes realmente distribudas, onde as diversas funcionalidades do sistema esto localizadas em diferentes servidores, inclusive de diferentes empresas. Neste captulo veremos como criar Web Services e depois utilizar os Web Services criados em nossas pginas ASP.NET. Em seguida aprenderemos a utilizar o ambiente de desenvolvimento do Framework .NET Visual Studio .NET. Aprenderemos a criar pginas ASP.NET simples e tambm exemplos mais elaborados, que fazem conexo com bancos de dados. Veremos que o Visual Studio .NET traz, para o desenvolvimento Web, as mesmas facilidades que temos no desenvolvimento de aplicaes Windows tradicionais. Com o Visual Studio .NET construmos aplicaes Web, baseadas em ASP.NET, arrastando componentes na pgina e configurando as diversas opes, propriedades e eventos dos componentes. Com o Visual Studio .NET a produtividade do programador, na criao de aplicaes Web, aumenta enormemente, uma vez que o Visual Studio .NET traz para o desenvolvimento de pginas ASP.NET um modelo j conhecido, onde simplesmente vamos arrastando elementos na pgina e fazendo as configuraes necessrias.

Uma Introduo aos Web Services


O fator que mais provocou mudanas nas metodologias e tecnologias de desenvolvimento de aplicaes, nos ltimos tempos, foi Internet. A criao de aplicaes distribudas e o compartilhamento de informaes passaram a ser mais uma necessidade do que uma realidade. Como fazer o sistema de uma empresa, baseado no Mainframe, trocar informaes com o sistema de outra empresa, baseado no modelo Cliente/Servidor? Muitas vezes, dentro da mesma empresa temos diferentes ambientes e a questo do compartilhamento de informaes e integrao de aplicaes uma das mais difceis de serem resolvidas. Com a Internet iniciou-se um processo de padronizao em diversas frentes: TCP/IP como protocolo da Internet e tambm das redes internas, das empresas. HTML como um formato padro para a publicao de informaes. HTTP como protocolo de transporte. Porm alguns problemas ainda persistiam. Como viabilizar a troca de informaes entre empresas que, na maioria das vezes, utilizam formatos de dados proprietrios e completamente incompatveis? Como resposta a esta questo, o padro XML (Extensible Markup Language) tem sido uma resposta eficaz e amplamente aceita pelo mercado. Porm ainda persiste a questo de como fazer que uma aplicao possa utilizar funcionalidades de outras aplicaes, sem ter que reescrever toda a lgica que j est implementada. Acredito que a utilizao dos Web Services seja a resposta para esta ltima questo. Com Web Services podemos construir aplicaes e componentes de software capazes de interagirem. Os Web Services podem ser criados em diferentes linguagens ou plataformas. O que garante a interoperabilidade a utilizao de um formato padro para troca de mensagens (XML) e um protocolo padro para o envio e recebimento destas mensagens (SOAP Simple Object Access Protocol); sendo que as mensagens no formato SOAP so empacotadas e transportadas utilizando-se HTTP ou SMTP, protocolos amplamente utilizados na Internet.

535

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


O fato de utilizar padres amplamente aceitos que torna os Web Services uma alternativa atraente. Cabe ressaltar que o conceito de Web Services no uma novidade do Framework .NET. Outras empresas como IBM e Sun j trabalham com o conceito de Web Services, sendo que a IBM tambm utiliza os padres XML e SOAP. Um Web Service um componente ou unidade de software (eu prefiro o termo Pedao de Cdigo, mas reconheo que no um termo muito, digamos, elegante) que fornece uma funcionalidade especfica, como por exemplo uma rotina para validao do nmero de Carto de Crdito ou do Dgito Verificador de um nmero de CPF; unidade esta que pode ser acessada por diferentes sistemas, atravs da utilizao de padres da Internet, como por exemplo XML, HTTP e SOAP. A utilizao destes padres de vital importncia para que possamos criar aplicaes distribudas utilizando Web Services. Um Web Service pode ser utilizado internamente, por uma nica aplicao ou por vrias aplicaes da mesma empresa; ou pode ser exposto atravs da Internet, para utilizao por qualquer aplicao. Por exemplo, imagine que o Governo do Estado disponibiliza um Web Service para clculo do ICMS. Todas as mquinas registradores de Supermercados, Padarias e demais estabelecimentos possuem um programa que utiliza este Web Service. Se a legislao do ICMS mudar, tudo o que o governo precisaria fazer seria alterar o Web Service e as mquinas registradoras j passariam a fazer o clculo do ICMS, baseado na nova verso. Pelo exemplo podemos ver que a utilizao de Web Services baseada em um mundo amplamente conectado, atravs de padres utilizados na Internet. Como a forma de acesso a um Web Service padronizada, isto permite que diferentes sistemas possam acessar e trocar dados com um mesmo Web Service. Para que uma aplicao possa fazer uso de um Web Service, basta que ela seja capaz de entender SOAP e XML. A Microsoft vem trabalhando com diversas companhias e junto ao W3C (www.w3.org), que uma entidade responsvel pela padronizao de diversas linguagens e protocolos de Internet, em uma proposta para a padronizao do SOAP e de outros padres que do suporte utilizao de Web Services. Para que um Web Service possa ser utilizado, algumas funes precisam estar disponveis: Descoberta: Precisa existir uma maneira de descobrirmos a existncia do Web Service. Por exemplo, quando voc est criando uma aplicao de Comrcio Eletrnico, voc precisa de mecanismos para localizar Web Services com funcionalidades especficas e que possam ser utilizados pela aplicao que est sendo criada. Para resolver esta questo existem duas especificaes sendo atualmente analisadas: 1) UDDI (Universal Description, Discovery and Integration www.UDDI.org); 2) DISCO (Discovery). Descrio das funcionalidades e mtodos disponibilizados pelo Web Service: Para documentar e expor as funcionalidades de um Web Service, a Microsoft props ao W3C a especificao WSDL (Web Service Description Language). O WSDL define regras para a descrio das funcionalidades de um Web Service, utilizando XML. So descritos os mtodos e propriedades suportados pelo Web Service, os tipos de dados e os protocolos que podem ser utilizados para o envio e recebimento de mensagens. Maiores detalhes em www.w3.org/TR/wsdl. Protocolo padro para troca de mensagens: Conforme descrito anteriormente, utilizado o protocolo SOAP. Maiores informaes em www.w3.org/TR/SOAP.

www.juliobattisti.com.br

536

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET

Possveis Utilizaes Para um Web Service


Vamos ver alguns exemplos onde poderamos utilizar Web Services como uma forma de criar aplicaes mais flexveis e de fcil manuteno. Criao de uma funcionalidade especfica para ser utilizada por um programa cliente: Esta uma das situaes mais simples possveis. Criamos um Web Service, cuja funcionalidade ser utilizada por um outro programa. Por exemplo, podemos criar um Web Service que contm informaes sobre as taxas de imposto de todos os estados Brasileiros e a forma de clculo dos impostos. Este Web Service pode ser utilizado por sites de comrcio eletrnico para calcular o preo final do produto, de acordo com o local de entrega. Neste cenrio, o sistema do site de comrcio eletrnico formata uma mensagem com as informaes do produto e do local de destino, na forma de uma mensagem XML, a qual encapsulada no formato SOAP para ser transportada pelo protocolo HTTP. No destino o Web Service desempacota a mensagem, l as informaes no formato XML, faz os clculos com base nos valores recebidos, empacota o resultado no formato XML, o qual encapsulado no formato SOAP para ser transportado pelo protocolo HTTP, de volta para o programa que fez a solicitao de clculo. Integrao entre diferentes aplicaes: Este um dos grandes problemas a serem resolvidos pela rea de TI das empresas. Podemos utilizar Web Services para fazer a integrao entre diferentes aplicaes, criadas em diferentes plataformas e que trabalham com diferentes formatos de dados. Com Web Services, podemos expor a funcionalidade e os dados de cada aplicao como um Web Service. Em seguida criamos uma aplicao que utiliza o conjunto de Web Services, criados a partir das aplicaes individuais, aplicao esta que habilita a interoperabilidade entre as diversas aplicaes. Esta situao ilustrada na Figura 13.1.

Figura 13.1: Interoperabilidade entre aplicaes com Web Services.

537

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


A utilizao de Web Services tambm de grande utilidade em aplicaes de Workflow, onde um determinado processo ou tarefa realizado em diferentes sees da empresa. O exemplo clssico o caso de aprovao das despesas de viagens para um funcionrio. O funcionrio envia uma solicitao com a justificativa para o chefe imediato, o qual aprova a solicitao e envia para o setor de Recursos Humanos para as providncias necessrias. Uma vez alocados os recursos necessrios, o setor de Recursos Humanos informa o funcionrio sobre horrios, datas, etc. Para automatizarmos um Workflow como este do exemplo, precisamos interagir com dados e sistemas de diferentes departamentos da empresa, os quais normalmente no esto integrados, com formatos de dados diferentes. Neste ponto que podemos utilizar Web Services para criar um sistema de Workflow que, do ponto de vista do usurio, funciona como um sistema integrado, que utiliza um nico modelo de dados e conjunto de funcionalidades. A Microsoft fornece um produto que facilita a criao de um sistema como o descrito no pargrafo anterior: BizTalk Server. Com este produto podemos criar processos de negcios e automatizar a gerao de mensagens no formato XML, para interoperabilidade entre os sistemas.

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

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET

Criando um Web Service


Vamos criar um Web Service que tem um nico mtodo: Calcula_Imposto. Este mtodo recebe trs parmetros: O valor total da compra. O valor do desconto. O estado de destino. Com base no estado de destino, o mtodo calcula o valor do imposto sobre o preo final, j aplicado o desconto. Por simplicidade vamos considerar pedidos apenas para cinco estados e um valor padro para os demais estados. O percentual de imposto para cada estado est descrito na Tabela 13.1.

Tabela 13.1 Imposto a ser aplicado para cada estado. Estado RS SC PR SP RJ Outros % Imposto 12 15 17 20 22 25

Sintaxe Para a Criao de um Web Service


O primeiro passo criar o cdigo para o Web Service, cdigo este que gravado em um arquivo com a extenso .asmx. No existe nenhuma traduo para a extenso asmx. Para caracterizar o cdigo como um Web Service, inclumos a diretiva, como primeira linha do cdigo:
<%@ WebService Language=C# class=NomeDaClasse %>

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Agora implementamos a classe CalculosLegais e os mtodos da classe. Um detalhe importante que, aps o nome da classe, colocamos dois-pontos e a palavra Webservice. Antes de cada mtodo colocamos a palavra WebMethod entre colchetes. Vamos chamar o mtodo que faz o clculo dos impostos de: CalculaImposto. A estrutura bsica para a definio do WebService CalculosLegais est indicada na Listagem 13.1.

Listagem 13.1 Estrutura bsica para a criao de um Web Service.


<%@ WebService Language=C# class=CalculosLegais %>

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));

case RJ: return ValorComDesconto*1.22; break;

default: return ValorComDesconto*1.25; break; } } }

www.juliobattisti.com.br

540

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET


Digite o cdigo da Listagem 13.1 e salve o mesmo em um arquivo chamado CalculosLegais.asmx, na pasta chap13, dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.

Uma Maneira Fcil de Testar a Funcionalidade de um Web Service


Com o Framework .NET podemos, facilmente, testar o funcionamento de um Web Service. Para isto basta acessar o arquivo .asmx, utilizando o navegador, como se fosse uma pgina .aspx normal. Para o nosso exemplo vamos utilizar o seguinte endereo: http://localhost/chap13/CalculosLegais.asmx Ao acessarmos um arquivo .asmx, o Framework .NET utiliza um template chamado DefaultWsdlHelpGenerator.aspx, que fica localizado na pasta \WinNT\Microsort.NET\ Framework\[Version], onde WinNT a pasta onde foi instalado o Windows 2000. O template DefaultWsdlHelpGenerator.aspx identifica a requisio para um arquivo .asmx e gera, automaticamente, uma pgina de sada, onde temos a possibilidade de testar os mtodos do Web Service que est sendo acessado, conforme indicado na Figura 13.2.

Figura 13.2: Pgina para teste do Web Service gerada automaticamente.


Esta pgina traz informaes genricas sobre o Web Service que est sendo testado. Mas o principal componente desta pgina, para o nosso exemplo, um link para o mtodo CalculaImposto. D um clique neste link. Observe

541

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


que so exibidos campos para que digitemos os valores para os parmetros do mtodo. Digite os valores indicados na Figura 13.3.

Figura 13.3: Definindo valores para os parmetros do mtodo CalculaImposto.


D um clique no boto Invoke. O mtodo ser executado e os resultados, retornados em uma nova janela, no formato XML, conforme indicado na Figura 13.4.

Figura 13.4: Valor retornado pelo mtodo CalculaImposto, no formato XML.

www.juliobattisti.com.br

542

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET


Esta funcionalidade bastante til, pois nos permite testar os mtodos de um Web Service antes de gerar um proxie (veremos com gerar proxies mais adiante) e utilizar o Web Service em nossas pginas ASP.NET (aprenderemos a utilizar Web Services em pginas ASP.NET mais adiante). Na Pgina da Figura 13.3, onde podemos definir valores para os parmetros do mtodo CalculaImposto, temos uma srie de informaes sobre os formatos possveis para a comunicao com um Web Service. Conforme visto nesta pgina, temos trs opes possveis: SOAP: um protocolo baseado em XML, para troca de informaes, mais precisamente: de mensagens, entre diferentes componentes de software, atravs da Web. A implementao do protocolo SOAP, no Framework .NET, utiliza o protocolo HTTP como protocolo de transporte. Com isso o SOAP segue o comportamento padro do HTTP, ou seja, envia uma requisio para o servidor (que no caso do SOAP um Web Service) e aguarda uma resposta. Para maiores detalhes sobre o protocolo SOAP, consulte o endereo: www.w3.org/TR/SOAP A seguir temos o exemplo de uma requisio e resposta utilizando o protocolo SOAP. Observe que os dados esto no formato XML:
POST /Chap13/CalculosLegais.asmx HTTP/1.1 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: http://tempuri.org/CalculaImposto

<?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

<?xml version=1.0" encoding=utf-8"?>

543

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


<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> <CalculaImpostoResponse xmlns=http://tempuri.org/> <CalculaImpostoResult>double</CalculaImpostoResult> </CalculaImpostoResponse> </soap:Body> </soap:Envelope>

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

HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length

<?xml version=1.0" encoding=utf-8"?> <double xmlns=http://tempuri.org/>double</double>

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

<?xml version=1.0" encoding=utf-8"?> <double xmlns=http://tempuri.org/>1400</double>

www.juliobattisti.com.br

544

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET


O nosso objetivo criar um Web Service e poder utilizar as funcionalidades disponibilizadas por ele, em nossas pginas ASP.NET. Porm ainda temos um passo antes de que o Web Service CalculosLegais esteja disponvel para uso. O passo que falta a criao de um proxy para o Web Service. No prximo tpico veremos o que um proxy e como cri-lo.

Proxies: Conceito e Criao


Conceito
Um proxy um elemento intermedirio entre a pgina ASP.NET e o Web Service. Vamos imaginar a situao onde temos uma pgina ASP.NET em um servidor www.abc.com, acessando um web service localizado em um segundo servidor: www.xyz.com. Com a utilizao de um proxy, fazemos com que o Web Service, localizado no servidor www.xyz.com, parea estar disponvel localmente para a pgina ASP.NET que o est utilizando. O Proxy intercepta o pedido da pgina ASP.NET e envia o pedido para o Web Service no servidor remoto. Quando a resposta retorna, o Proxy captura a resposta e a encaminha para a pgina ASP.NET que fez a solicitao. O Proxy tambm responsvel por formatar o pedido no formato do protocolo SOAP, antes de o pedido ser enviado para o Web Service. Na Figura 13.5, temos uma pequena ilustrao deste conceito:

Figura 13.5: O papel do Proxy, no acesso ao Web Service.


Vamos recapitular os passos na criao do Web Service CalculosLegais: 1. 2. 3. Criao do cdigo-fonte em um arquivo .asmx (j feito). Gerao de um proxy utilizando o utilitrio Wsdl.exe (prximo tpico). Compilao do cdigo gerado no item 2, para a gerao da DLL representativa do Web Service.

545

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


4. 5. Distribuio da DLL criada no item anterior, para que ela possa ser acessada atravs da Web. Utilizao do Web Service, nas pginas ASP.NET onde a funcionalidade dele for necessria.

Criando o Proxy Utilizando o Utilitrio Wsdl.exe


Para criarmos o Proxy, utilizamos um utilitrio fornecido com o Framework .NET: Wsdl.exe. Este utilitrio pode ser encontrado no seguinte caminho:
X:\Arquivos de programas\Microsoft.NET\FrameworkSDK\Bin

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>

Os parmetros para o utilitrio Wsdl.exe so explicados na Tabela 13.2.

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.

/protocol:protocol /namespace:myNameSpace /out:filename /username:username /password:password /domain:domain

www.juliobattisti.com.br

546

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET


Para Web Services utilizados com o ASP.NET, podemos retornar a descrio do Web Service, simplesmente concatenando ?WSDL a URL que aponta para o arquivo .asmx. No nosso exemplo, o arquivo .asmx est no seguinte endereo: http://localhost/Chap13/CalculosLegais.asmx. Para retornar a descrio do mesmo, no formato WSDL, simplesmente vamos concatenar ?WSDL, no final da URL, quando utilizarmos o comando Wsdl.exe, para gerar o proxy. Vamos utilizar o comando Wsdl.exe para gerar o proxy para o Web Service CalculosLegais.asmx. Para isso, abra um Prompt de Comando (Iniciar -> Programas -> Acessrios -> Prompt de comando). Na janela que surge, digite o seguinte comando:
Wsdl http://localhost/Chap13/CalculosLegais.asmx?WSDL

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:

Figura 13.6: Gerao do proxy.


Na Listagem 13.2 temos o cdigo do Arquivo CalculosLegais.cs. Este cdigo gerado automaticamente pelo utilitrio wsdl.exe e no precisamos alter-lo.

Listagem 13.2 Cdigo gerado pelo utilitrio wsdl.exe.


// // <autogenerated> // // // // Changes to this file may cause incorrect behavior and will be lost if This code was generated by a tool. Runtime Version: 1.0.2914.16

547

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


// the code is regenerated.

// </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;

[System.Web.Services.WebServiceBindingAttribute(Name=CalculosLegaisSoap, Namespace=http://tempuri.org/)] public class CalculosLegais : System.Web.Services.Protocols.SoapHttpClientProtocol

[System.Diagnostics.DebuggerStepThroughAttribute()] public CalculosLegais() { this.Url = http://localhost/Chap13/CalculosLegais.asmx; }

[System.Diagnostics.DebuggerStepThroughAttribute()] [System.Web.Services.Protocols.SoapDocumentMethodAttribute(http://tempuri.org/ CalculaImposto, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]

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

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET


[System.Diagnostics.DebuggerStepThroughAttribute()] public System.IAsyncResult BeginCalculaImposto(long Total, int Desconto, string Estado, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke(CalculaImposto, new object[] { Total, Desconto, Estado}, callback, asyncState); }

[System.Diagnostics.DebuggerStepThroughAttribute()] public System.Double EndCalculaImposto(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((System.Double)(results[0])); } }

Compilando o Arquivo CalculosLegais.cs Para Gerar a DLL Correspondente


Agora precisamos compilar o arquivo com cdigo-fonte CalculosLegais.cs, para gerar a DLL correspondente. Para isso utilizaremos o compilador de linha de comando do CSharp: csc. Este compilador possui muitos parmetros de linha de comando. Vamos explicar apenas os parmetros utilizados para a criao da DLL. Abra um Prompt de comando e execute o seguinte comando:
csc /out:CalculosLegais.dll /t:library /r:System.XML.dll /r:System.Web.Services.dll CalculosLegais.cs

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 13.7 Gerao da DLL CalculosLegais.dll.

Disponibilizando a DLL Para que a Mesma Possa Ser Utilizada


Para que a DLL, contendo o WebService CalculosLegais, possa ser utilizada por uma aplicao Web, devemos copi-la para a pasta BIN da respectiva aplicao. Caso esta pasta ainda no exista, dever ser criada e a DLL, copiada para a pasta BIN. No nosso exemplo, vamos criar uma pgina ASP.NET que utiliza o Web Service CalculosLegais. Neste caso, a pgina ASP.NET estar na pasta Chap13. Lembrando que, no servidor que estou utilizando, a pasta Chap13 encontra-se no seguinte caminho:
D:\InetPub\wwwroot\Chap13.

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:

Figura 13.8: Disponibilizando a DLL CalculosLegais.dll para uso.

www.juliobattisti.com.br

550

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET

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.

Figura 13.9: Tornando a pasta Chap13 uma aplicao Web.


7. De volta ao Gerenciador de servios de Internet, observe que o cone de Chap13 foi alterado. O novo cone indica que Chap13 uma aplicao Web, conforme indicado na Figura 13.10.

551

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 13.10: cone indicando que Chap13 uma aplicao Web.


8. Feche o Gerenciador de servios de Internet.

Utilizando o Web Service em uma Pgina ASP.NET


Agora o passo final: Vamos criar uma pgina ASP.NET que utiliza o Web Service CalculosLegais, que criamos nos passos anteriores. Exemplo: Vamos criar uma pgina ASP.NET onde temos trs controles: Um controle DropDownList, onde so exibidas as opes: RS, SC, PR, SP, RJ e Outros. Um controle TextBox, onde o usurio digita o valor da compra. Um controle TextBox, onde o usurio digita o valor do desconto. Um controle Label, onde exibido o valor final, calculado pelo mtodo CalculaImposto, do Web Service CalculosLegais. Na Listagem 13.3 temos o cdigo para o exemplo proposto.

Listagem 13.3 Pgina ASP.NET utilizando um Web Service Chap13Ex1.aspx.


<%@ Page Language=C# Debug=true %> <html>

<script language=C# runat=server>

public void {

Enviar_Click(Object sender,EventArgs e)

CalculosLegais ChamaCalculo = new CalculosLegais();

www.juliobattisti.com.br

552

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET


// Declaro variveis para conter valores do formulrio.

string txtEstado; string txtValor; string txtDesconto;

txtEstado=Estado.SelectedItem.Value; txtValor=Valor.Text; txtDesconto=Desconto.Text;

double txtValorFinal;

txtValorFinal=ChamaCalculo.CalculaImposto(Convert.ToInt32(txtValor), Convert.ToInt32(txtDesconto), txtEstado);

Exibe.Value = Preo Inicial Estado Desconto

: + txtValor +\n+

: + txtEstado + \n+ : + txtDesconto + \n+

********************************** + \n+ PREO FINAL } </script> : + Convert.ToString(txtValorFinal);

<body>

<form method=post runat=server> <H2> Utilizao do Web Service - CalculosLegais!!</H2>

<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.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


/>

<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

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET


Columns=40" />

</td> </tr>

<tr> <td><B>Desconto:</B> </td> <td>

<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>

<tr> <td><B>Clique no boto></B></td> <td><input type=submit value=Calcular

555

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


OnServerClick=Enviar_Click runat=server> </td> </tr> </table>

</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

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET

Figura 13.11: Pgina ASP.NET utilizando o WebService CalculosLegais.


3. Declaramos uma varivel do tipo double, que ir conter o valor retornado pelo mtodo CalculaImposto, do WebService CalculosLegais.
double txtValorFinal;

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+

********************************** + \n+ PREO FINAL : + Convert.ToString(txtValorFinal);

Observe que agora podemos reaproveitar a funcionalidade do mtodo CalculaImposto em qualquer pgina ASP.NET da aplicao Chap13.

557

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Apenas para recapitular, eis os passos necessrios para a criao e utilizao de um Web Service, utilizando C# e ASP.NET: 1. 2. 3. 4. 5. 6. 7. 8. Criao do cdigo-fonte em um arquivo .asmx. Testar a funcionalidade do arquivos .asmx. Criar um proxy para o Web Service, utilizando o utilitrio wsdl.exe. Compilar o proxy gerado no item 3, para gerar uma DLL. Se a pasta onde est a pgina ASP.NET que vai utilizar o Web Service ainda no for uma aplicao Web, utilizar o Gerenciador de servios de Internet, para transform-la em uma aplicao Web. Criar uma pasta bin dentro da pasta correspondente aplicao Web. Copiar a DLL para dentro da pasta bin. Criar uma ou mais pginas ASP.NET que utilizam o Web Service.

O Novo Ambiente Grfico de Desenvolvimento Visual Studio .NET


O Visual Studio .NET o ambiente grfico, para desenvolvimento de aplicaes .NET, dentre elas pginas ASP.NET e aplicaes Web. Conforme veremos neste tpico, uma das grandes vantagens do Visual Studio .NET que podemos criar pginas ASP.NET, com a mesma facilidade com que crivamos aplicaes para o Windows, utilizando o Visual Basic 6.0 ou o Delphi 6.0. Com o Visual Studio .NET podemos criar pginas ASP.NET, simplesmente arrastando elementos em uma interface grfica, configurando propriedades para estes elementos e definindo cdigo para ser executado em resposta a eventos disparados pelos elementos da pgina. Inicialmente veremos quais as principais novidades do Visual Studio .NET e daremos uma olhada rpida no Ambiente de Desenvolvimento. Em seguida construiremos alguns exemplos, utilizando instrues detalhadas, passo a passo.

O que h de Novo no Visual Studio .NET


Em primeiro lugar uma interface nica; ou seja, quer estejamos criando uma aplicao Win32 utilizando VB.NET ou uma aplicao Web utilizando C# e ASP.NET, o ambiente RAD (Rapid Application Development) o mesmo. Nas verses anteriores do Visual Studio, cada linguagem tinha o seu prprio ambiente de desenvolvimento, e agora com o Visual Studio .NET todas as linguagens e projetos compartilham um ambiente comum, apenas com menus e barras de ferramentas que se adaptam de acordo com projeto e elemento que est sendo editado.

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

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET


Start Page: Ao abrirmos o Visual Studio .NET carregada uma pgina chamada de Start Page. Esta pgina permite que o usurio configure o ambiente de desenvolvimento de acordo com as suas preferncias. Por exemplo, pode ser que voc esteja acostumado com a interface do Visual Basic 6.0 e prefira ter os menus, barras de ferramentas e teclas de atalho configuradas de uma maneira semelhante ao que era no VB 6. Para solicitar tal configurao, na pgina inicial (Start Page), voc clica na opo My Profile e seleciona as opes indicadas na Figura 13.12.

Figura 13.12: Personalizando o ambiente do Visual Studio .NET.


Suporte a Tecnologia Windows Instaler, edio de cdigo HTML e CSS (Cascadin Style Sheets), diretamente no ambiente grfico, edio de XML e visualizao do resultado das pginas tambm diretamente no ambiente grfico, etc. So inmeras as novidades. O prprio Ambiente do Visual Studio .NET serve de assunto para um livro inteiro. Para maiores informaes sobre as novidades consulte o seguinte endereo: http://msdn.microsoft.com/vstudio/nextgen/overview.asp Voc tambm pode consultar a documentao do Visual Studio .NET. Agora vamos conhecer um pouco do novo ambiente, atravs da criao de alguns exemplos. Exemplo 1: Criando uma Aplicao ASP.NET Web Application Neste exemplo vamos criar uma aplicao Web, baseada em ASP.NET e C#. Para a criao desta aplicao precisamos de que o IIS (Internet Information Services) e o Visual Studio .NET estejam instalados e funcionando. Estarei utilizando um servidor com os seguintes dados:
Sistema: Windows 2000 Server em Ingls Nome: Servidor IP: 10.204.123.1 Diretrio raiz do IIS: d:\inetpub\wwwroot

559

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Sempre que for feita referncia a uma destas configuraes, substitua pelas configuraes que voc estiver utilizando, caso sejam diferentes das aqui apresentadas. Criaremos uma aplicao Web chamada: AppWebChap13. Dentro destas aplicaes Web, criaremos algumas pginas ASP.NET utilizando o Visual Studio .NET. Para nos conectarmos com as pginas da aplicao AppWebChap13, utilizaremos o seguinte endereo: http://servidor/AppWebChap13/nome_da_pgina.aspx Para criar a aplicao Web: AppWebChap13, faa o seguinte: 1. 2. 3. 4. 5. 6. 7. 8. 9. Abra o Visual Studio .NET: Iniciar -> Programas -> Microsoft Visual Studio .NET 7.0 -> Microsoft Visual Studio .NET 7.0 ( duas vezes mesmo, uma a pasta de opes e outra o atalho para o Visual Studio). O Visual Studio carregado e a pgina Start Page exibida, conforme indicado na Figura 13.13. Para criar uma nova aplicao Web, devemos criar um novo Projeto. Isto pode ser feito clicando na opo New Project da pgina de abertura ou selecionando o comando File -> New -> Project ou pressionando Ctrl+Shift+N. D um clique na opo New Project. Ser aberta a janela New Project, onde podemos selecionar o tipo de aplicao que ser criada. Em Project Types, d um clique em Visual C# Projects. Nas opes que so exibidas, no painel da direita, d um clique em ASP.NET Web Application. No campo Name, digite: AppWebChap13. No campo Location, digite: http://SERVIDOR. A janela New Project deve estar com as configuraes indicadas na Figura 13.14.

Figura 13.13: Personalizando o ambiente do Visual Studio .NET.

www.juliobattisti.com.br

560

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET

Figura 13.14: Criando o projeto AppWebChap13.


10. D um clique no boto OK e aguarde alguns instantes. 11. Surge uma janela indicando que uma nova aplicao Web est sendo criada, conforme indicado na Figura 13.15.

Figura 13.15: Novo projeto sendo criado.


12. O projeto criado e, por padro, criada, dentre outros elementos, uma pgina ASP.NET chamada WebForm1.aspx. Este formulrio pode ser acessado atravs do endereo: http://servidor/AppWebChap13/WebForm1.aspx. Toda aplicao Web tem uma pgina que chamada de pgina inicial do projeto. o mesmo conceito de pgina padro de um diretrio virtual, ou seja, se simplesmente digitarmos o endereo: http://servidor/AppWebChap13, ser carregada a pgina inicial do projeto, no nosso exemplo: WebForm1.aspx. 13. Alm da pgina inicial, o Visual Studio .NET cria uma srie de outros arquivos que so utilizados para a configurao da aplicao Web. Estes arquivos podem ser gerenciados atravs da janela Solution Explorer, destacada na Figura 13.16.

561

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 13.16: Os elementos que compem a aplicao Web.


14. Outro elemento importante do ambiente de desenvolvimento a Barra de Ferramentas Toolbox. Quando voc coloca o mouse sobre esta opo, exibida uma barra com os diversos elementos que podemos colocar em nossas pginas ASP.NET, conforme destacado na Figura 13.17.

Figura 13.17: A barra de ferramentas para a criao da pgina ASP.NET.

www.juliobattisti.com.br

562

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET


15. Na Toolbox temos os diversos controles que podem ser colocados em uma pgina ASP.NET. So os mesmos controles que aprendemos a utilizar nos captulos 7, 8 e 9. A diferena que, com o Visual Studio .NET, podemos criar a pgina, utilizando um ambiente grfico, onde simplesmente arrastamos os controles, configuramos as propriedades destes e criamos cdigo que executa em resposta aos eventos gerados na pgina. 16. Vamos adicionar um controle do tipo Label, onde colocaremos o seguinte texto: Primeira pgina criada como o Visual Studio. Em seguida vamos salvar a pgina WebForm1.aspx e enviar as alteraes para o servidor, para que a pgina possa ser testada. 17. Aponte o mouse para Toolbox. Nas opes que surgem, d um clique no controle Label e arraste-o para a pgina WebForm1.aspx. Utilize o mouse para aumentar o tamanho do controle. 18. Para alterar o texto do label, utilizamos a janela Properties que, por padro, encontra-se no lado direito da tela, abaixo da janela Solution Explorer. 19. Certifique-se de que o controle Label esteja selecionado e localize a propriedade Text, na janela de propriedades. Altere o valor desta propriedade para Primeira pgina criada com o Visual Studio. 20. Observe que temos diversas propriedades que podem ser alteradas, como por exemplo a cor de segundo plano (BackColor), a cor das bordas (BorderColor), etc. medida que vamos alterando estas propriedades, o Visual Studio vai, automaticamente, gerando o cdigo da pgina ASP.NET para refletir as mudanas. 21. Na propriedade BackColor, selecione um cinza claro. A sua janela deve estar semelhante indicada na Figura 13.18.

Figura 13.18: Criando a primeira pgina.

563

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


22. Agora vamos salvar o projeto. 23. Selecione o comando File -> Save All. 24. O Visual Studio primeiro salva uma cpia local dos arquivos e pginas que fazem parte do projeto. Em seguida precisamos enviar estas alteraes para o servidor. Para isso selecione o comando Build -> Build. 25. Na parte inferior do Visual Studio surge a janela Output, informando sobre o andamento do processo de envio da aplicao para o servidor. No final, se no for encontrado nenhum erro, ser exibida, na janela Output, a seguinte mensagem:
Done Build: 1 succeeded, 0 failed, 0 skipped

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.

Figura 13.19: Carregando a pgina criada com o Visual Studio.

Figura 13.20: Exibindo o cdigo da pgina.

www.juliobattisti.com.br

564

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET


30. Observe que o controle Label definido com a utilizao de um Web Server Control do tipo asp.Label. Este cdigo gerado, automaticamente, pelo Visual Studio, conforme indicado a seguir:
<asp:Label id=Label1 style=Z-INDEX: 101; LEFT: 80px; POSITION: absolute; TOP: 46px runat=server Width=325px Height=38px BackColor=#E0E0E0"> Primeira pgina criada com o Visual Studio </asp:Label>

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.

Figura 13.21: Com o Visual Studio fcil localizar os membros de um controle.


34. Na lista que exibida selecione a opo Font-Bold e tecle o sinal de igual (=). Observe outra maravilha: O Visual Studio mostra a lista de valores possveis para a propriedade selecionada, no nosso exemplo: True ou False. Basta

565

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


selecionar True e pronto, est habilitado Negrito para o nosso controle. Com este recurso do Visual Studio fica muito mais fcil localizar as propriedades, mtodos e eventos de um determinado elemento. Quando selecionamos um mtodo, so destacados os parmetros e os tipos de cada parmetro. Este recurso de grande valor, pois, alm de localizar rapidamente a propriedade ou mtodo desejado, reduz drasticamente a entrada de valores incompatveis para a propriedade ou para os parmetros de um mtodo. 35. Vamos salvar novamente a nossa aplicao: File -> Save All. 36 Vamos atualizar a verso da aplicao no Servidor: Build -> Build. 37. Agora s test-la novamente, utilizando o endereo: http://servidor/AppWebChap13/WebForm1.aspx 38 Voc obter os resultados indicados na Figura 13.22. 39. Mantenha o Visual Studio .NET aberto. Agora que j conhecemos os aspectos bsicos da criao de uma aplicao Web, com o Visual Studio, vamos criar mais alguns exemplos, para aprender a utilizar melhor a interface grfica.

Figura 13.22: Verso atualizada da nossa aplicao.


Exemplo 2: Criando uma Nova Pgina na Aplicao AppWebChap13 Neste exemplo vamos criar uma nova pgina ASP.NET, na aplicao AppWebChap13. Vamos chamar esta pgina de Form2.aspx. Neste formulrio colocaremos um controle do tipo DropDownList e dois controles do tipo TextBox, para o usurio digitar informaes. Tambm colocaremos um boto Enviar. Quando o usurio clicar no boto Enviar, utilizaremos o evento OnClick do boto, para exibir os valores digitados pelo usurio em um controle TextArea. 1. Para criar uma nova pgina ASP.NET utilize o seguinte comando:
File Add New Item.

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

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET

Figura 13.23: Adicionando um novo Web Form.


3. 4. D um clique no boto Open. A pgina Form2.aspx ser criada e exibida no Visual Studio. Agora vamos arrastar os seguintes controles: Um controle do tipo DropDownList. Trs controles do tipo TextBox. Quatro controles do tipo Label, um ao lado de cada um dos controles anteriores, para identificar o contedo de cada controle. Um controle do tipo Button. 5. Neste momento os controles esto desalinhados. Para alinhar os controles facilmente, voc pode selecionar os controles a serem alinhados e depois utilizar o comando Format -> Align. Para selecionar vrios controles voc pode segurar a tecla Shift e ir clicando nos controles a serem selecionados. 6. 7. 8. Agora que alinhamos os controles vamos configurar as diversas propriedades de cada controle. Configure a propriedade Text, para os controles Label e para o controle Button, com os valores indicados na Figura 13.24. Agora vamos configurar a propriedade Id para o controle DropDownList, para os controles TextBox e para o controle Button, conforme indicado a seguir:
DropDownList Primeiro TextBox Segundo TextBox Terceiro TextBox Controle Button -> -> -> -> > ID= SelecionaPais ID= Nome ID= Email ID= Exibe ID= Enviar

567

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 13.24: Definindo os rtulos para os controles.


9. Agora vamos configurar as demais opes dos controles do nosso formulrio.
Argentina Brasil Chile EUA Frana

10. Vamos adicionar os seguintes itens para o controle DropDownList:

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

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET

Figura 13.25: Adicionando itens ao controle DropDownList.


14. Agora precisamos criar o cdigo que executa em resposta ao evento OnClick do boto de comando. Para definir este procedimento, basta dar um clique duplo no boto Enviar Dados. Automaticamente aberta a janela de cdigo, com a estrutura do procedimento j definida. Tudo o que temos que fazer digitar o seguinte cdigo:
string Dados; Dados= Pas: + SelecionaPais.SelectedItem.Value + \n+ Nome: + Nome.Text+ \n+ e-mail: + Email.Text ; Exibe.Text = Dados;

Figura 13.26: Completando a lista.

569

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


15. Agora s falta configurar a propriedade TextMode, do controle Exibe. Altere de SingleLine para MultiLine. O formulrio Form2.aspx deve estar conforme indicado na Figura 13.27.

Figura 13.27: Completando o formulrio.


16. Salve as alteraes: File -> Save All. 17. Vamos enviar as alteraes para o servidor: Build -> Build. 18. Agora vamos testar a pgina Form2.aspx, utilizando o endereo:
http://servidor/AppWebChap13/Form2.aspx

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

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET

Figura 13.28: Testando a pgina Form2.aspx.


Exemplo 3: Conectando com um Banco de Dados do Microsoft Access Neste exemplo vamos criar uma nova pgina ASP.NET, na aplicao AppWebChap13. Vamos chamar esta pgina de dados.aspx. Vamos utilizar um assistente do Visual Studio, assistente este que criar a pgina automaticamente. A pgina dados.aspx, que iremos construir, exibir dados da tabela Customers (Clientes) e da tabela Orders (Pedidos), do Banco de dados NorthWind, do SQL Server 2000. No equipamento que estou utilizando para este exemplo, tenho instalada a seguinte instncia do SQL Server 2000: SERVIDOR\INSTANCIA1. Se voc estiver utilizando uma instalao do SQL Server 2000, com um nome diferente, sempre que houver referncia a SERVIDOR\INSTANCIA1, substitua pelo nome que voc est utilizando. 1. Para criar a pgina dados.aspx, estando com a aplicao AppWebChap13 aberta, execute o seguinte comando:
File Add New Item.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 13.29: Utilizando um assistente do Visual Studio.

Figura 13.30: Criando um novo objeto do tipo DataSet.


8. 9. D um clique no boto Next, seguindo para a prxima etapa do assistente. Nesta etapa vamos definir a conexo com o banco de dados.

10. D um clique no boto New Connection. Ser exibida a janela Connection.

www.juliobattisti.com.br

572

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET


11. D um clique na guia Provider e certifique-se de que a opo Microsoft OLE DB Provider for SQL Server esteja selecionada, conforme indicado na Figura 13.31. 12. D um clique na guia Connection. 13. Na lista Select or enter a server name, selecione SERVIDOR\INSTANCIA1 (ou o nome do servidor que voc estiver utilizando).

Figura 13.31: Selecionando o OLE DB Provider para o SQL Server.


14. No item 2, da guia Connection, defina as informaes de conexo. No meu exemplo estou utilizando a opo Use a specific user name and password. Para usurio estou utilizando as, com senha em branco. Marquei as opes Blank Password e Allow saving password. No item 3, selecionamos o banco de dados com o qual queremos nos conectar. Para o nosso exemplo, selecione NorthWind. A guia Connection deve estar com as configuraes indicadas na Figura 13.32. 15. D um clique no boto OK. Voc estar de volta ao assistente Data Form Wizard. 16. D um clique no boto Next, seguindo para a prxima etapa do assistente. 17. Nesta etapa definimos de quais tabelas queremos acessar informaes. Clique na tabela Customers e d um clique no boto (>) para adicionar a tabela coluna da direita. Repita a operao para a tabela Orders. Sua tela deve estar conforme indicado na Figura 13.33. 18. D um clique no boto Next, seguindo para a prxima etapa do assistente.

573

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 13.32: Definindo as configuraes de conexo.


19. Nesta etapa, que s existe quando temos duas ou mais tabelas, podemos definir um relacionamento entre as tabelas. Para o nosso exemplo, vamos definir um relacionamento do tipo Um para Vrios, entre a tabela Customers (lado um) e a tabela Orders (lado vrios). O relacionamento ser estabelecido atravs do campo comum s duas tabelas: CustomerID. Na prtica este relacionamento est definindo que cada cliente cadastrado uma nica vez e pode fazer vrios pedidos. Para maiores informaes sobre relacionamentos e o modelo de dados relacionais, consulte o Anexo II. 20. No campo Name digite RelClientesPedidos. 21. Na lista Parent table, selecione Customers. 22. Na lista Child table, selecione Orders. 23. Na lista Keys, selecione CustomerID, para as duas listas da primeira linha. Depois d um clique no boto (>), para criar o relacionamento. Observe que o relacionamento RelClientesPedidos exibido na coluna Relations. Clique neste relacionamento e as propriedades definidas para o relacionamento RelClientesPedidos sero exibidas, conforme indicado na Figura 13.34.

www.juliobattisti.com.br

574

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET

Figura 13.33: Definindo as tabelas que sero acessadas.

Figura 13.34 Definindo um relacionamento entre as tabelas Customers e Orders.


24. D um clique no boto Next, seguindo para a prxima etapa do assistente.

575

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


25. Nesta etapa voc define quais campos de cada tabela devem ser exibidos na pgina. Deixe marcados apenas os seguintes campos:
Tabela Customer: Phone CompanyName

Tabela Orders: OrderID Freight ShipCity ShipCountry

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.

Figura 13.35: Pgina criada com o assistente Data Form Wizard.


28. Observe, na parte de baixo da pgina, que foram criados diversos objetos que do suporte a conexo:
DataSet OleDbConnection OleDbDataAdapter OleDbDataAdapter objListaDePedidos oleDbConnection1 oleDbDataAdapter1 oleDbDataAdapter2

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

CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET


32. Agora vamos testar a pgina dados.aspx, utilizando o endereo: http://servidor/AppWebChap13/data.aspx 33. Ser carregada a pgina data.aspx, onde exibido um boto Load. D um clique no boto Load. exibida uma lista com o nome e o telefone dos clientes, alm de um link Show Details. Ao clicar neste link, ser exibida, no final da pgina, uma lista com os pedidos para o respectivo cliente, conforme indicado na Figura 13.36.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Em seguida aprendemos a criar e utilizar um Web Service em uma pgina ASP.NET. Para isso, seguimos as seguintes etapas: 1. 2. 3. 4. 5. 6. 7. 8. Criao do cdigo-fonte em um arquivo .asmx. Testar a funcionalidade do arquivos .asmx. Criar um proxy para o Web Service, utilizando o utilitrio wsdl.exe. Compilar o proxy gerado no item 3, para gerar uma DLL. Se a pasta onde est a pgina ASP.NET que vai utilizar o Web Service ainda no for uma aplicao Web, utilizar o Gerenciador de servios de Internet, para transform-la em uma aplicao Web. Criar uma pasta bin dentro da pasta correspondente aplicao Web. Copiar a DLL para dentro da pasta bin. Criar uma ou mais pginas ASP.NET que utilizam o Web Service.

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

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Outro erro bastante comum achar que a questo de segurana responsabilidade somente da equipe de desenvolvimento ou somente do Administrador da Rede. Na verdade o item segurana bastante complexo e exige que o pessoal de desenvolvimento trabalhe em sintonia com a Administrao da rede e com todos na empresa. Conforme veremos neste captulo, existem aspectos de segurana que so de responsabilidade do desenvolvimento e outros que so de responsabilidade da Administrao de rede. Na verdade o que se faz criar vrias barreiras para que o hacker no tenha sucesso em sua tentativa de invaso. Algumas destas barreiras so criadas na prpria rede da empresa e outras em nvel de aplicao Web. Neste captulo estaremos tratando de questes como: Autenticao do usurio com o servidor Web. Aspectos de segurana em nvel de Windows 2000 Server. Aspectos de segurana no IIS 5.0. Implementando uma segurana em nvel de Banco de dados. Este aspectos tm a ver com o ambiente Sistema Operacional (Windows 2000, Windows XP, Windows 2002) mais Servidor Web (IIS 5.0), onde rodam as aplicaes Web criadas com ASP.NET. Estes aspectos so os mesmos, quer estejamos trabalhando com ASP ou ASP.NET. Na segunda parte do captulo, estudaremos alguns aspectos de segurana que so especficos do Framework .NET e do ASP.NET. Conforme veremos existe uma srie de classes que nos permitem fazer configuraes de segurana para aplicaes Web criadas com ASP.NET. De maneira alguma temos a pretenso de que este captulo seja um guia completo para a segurana na Internet e para o Comrcio Eletrnico. O objetivo fornecer as informaes bsicas para que o usurio possa tomar as medidas mnimas necessrias para garantir um nvel aceitvel de segurana para seu site e suas aplicaes Web. Quando trabalhamos com tecnologias da Microsoft como ADO>NET, IIS e Windows 2000 Server, o endereo a seguir de consulta obrigatria para assuntos relacionados segurana de tecnologias Microsoft: http://www.microsoft.com/security. Neste site so divulgados boletins de segurana sobre os produtos Microsoft. Sempre que algum novo problema descoberto, so divulgadas informaes sobre o problema, bem como a maneira de corrigi-los. Tambm so disponibilizados arquivos para Download. Estes arquivos normalmente contm correes (Hot-fix) que devem ser aplicadas para corrigir problemas de segurana.

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

Microsoft Management Console e de Snap-in.

Autenticao de Usurios com o IIS 5.0


Quando um usurio tenta acessar uma pgina, a primeira coisa que o servidor precisa determinar a identidade deste usurio, isto , o IIS precisa conhecer quem est

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

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


tentando acessar a pgina. Uma das maneiras de saber quem o usurio que est acessando o site atravs da utilizao de um Username e senha. Porm no seria nada simptico apresentar uma tela de logon para o usurio na primeira vez que ele est acessando o site. At mesmo nas prximas tentativas de acesso, a necessidade de logon pode acabar afastando o internauta. Atravs da autenticao do usurio, podem ser definidos os nveis de acesso a informao que o mesmo ter, bem como podem ser feitos registros das aes realizadas pelo usurio, mediante a gravao de logs de acesso. Existem diversos tipos de autenticao possveis com o IIS. Passaremos a estud-los individualmente. Os tipos de autenticao que estudaremos so os seguintes: Autenticao annima. Autenticao bsica. Autenticao avanada. Autenticao integrada ao Windows 2000. Autenticao com certificados.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Se existem vrios sites no seu servidor ou reas no seu site que exigem privilgios de acesso diferentes, voc pode criar vrias contas annimas, uma para cada rea do site, diretrio ou arquivo. Por exemplo, voc pode querer registrar o nvel de acesso a diferentes reas do seu site, utilizando para isso diferentes contas para o acesso annimo a cada uma destas reas. O IIS usa a conta IUSR_NOME_DO_COMPUTADOR da seguinte forma: 1. 2. A conta IUSR_NOME_DO_COMPUTADOR adicionada ao grupo Convidados no computador ou do Domnio, conforme descrito anteriormente. Quando uma solicitao recebida, o IIS representa a conta IUSR_NOME_DO_COMPUTADOR antes de executar qualquer cdigo ou acessar qualquer arquivo. O IIS pode representar a conta IUSR_NOME_DO_COMPUTADOR pois conhece o nome de usurio e a senha dessa conta. 3. Antes de retornar uma pgina ao cliente, o IIS verifica as permisses dos arquivos e diretrios do NTFS para ver se a conta IUSR_NOME_DO_COMPUTADOR tem permisso para acessar o arquivo. Neste ponto que podemos limitar as reas s quais o usurio que entra como annimo tem acesso. Basta configurar as permisses NTFS para que a conta associada ao Acesso annimo somente tenha acesso s reas pblicas do site. 4. 5. Se o acesso for permitido, a autenticao concluda e os recursos tornam-se disponveis para o usurio. Se o acesso no for permitido, o IIS tenta usar outro mtodo de autenticao. Se nenhum mtodo for selecionado, o IIS retorna uma mensagem de erro HTTP 403 Acesso negado ao navegador do cliente. Na Figura 14.1, temos uma representao desta seqncia para o Acesso annimo.

NOTA: Veremos sobre os outros mtodos de autenticao ainda neste captulo.

Figura 14.1: Acesso annimo no IIS.

www.juliobattisti.com.br

582

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET

IMPORTANTE:
Se a autenticao annima for ativada, o IIS tentar sempre a autenticao annima, usando-a primeiro,

mesmo se outros mtodos forem ativados.


Em alguns casos, o navegador solicitar ao usurio um nome de usurio e uma senha. Voc pode alterar a

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.

Como Definir a Conta Para Acesso Annimo no IIS 5.0


Para definir qual conta ser utilizada para o acesso annimo siga os seguintes passos: 1. 2. 3. 4. 5. 6. 7. Faa o logon no Windows 2000 Server, com permisses de administrador. Abra o Gerenciador do Internet Services: Iniciar -> Programas -> Ferramentas administrativas -> Gerenciador do Internet Services. Surge a janela indicada na Figura 14.2. Esta a janela do console de administrao do IIS 5.0. D um clique duplo no nome do computador. No nosso exemplo o nome servidor (na prtica aparece um asterisco ao lado do nome do servidor). Surgem as opes indicadas na Figura 14.3.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


dentro de uma mesma aplicao Web (que para o IIS representada por uma pasta virtual, com diferentes contas para acesso annimo).

Figura 14.2: O Gerenciador do Internet Services.

Figura 14.3: Opes de gerenciamento do IIS.


8. No nosso exemplo, iremos configurar uma nica conta para Acesso annimo para todo o servidor. O procedimento o mesmo quer seja para o site como um todo, para uma aplicao Web do site ou para uma pasta dentro da aplicao Web. 9. Clique com o boto direito do mouse sobre a opo Site da Web padro (ou na opo correspondente, caso voc tenha alterado este nome). No menu de opes que surge d um clique em Propriedades. 10. Ser exibida a janela Propriedades de Site Web padro, conforme indicado na Figura 14.4. 11. D um clique na guia Segurana de pasta. Sero exibidas as opes indicadas na Figura 14.5. 12. 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.6.

www.juliobattisti.com.br

584

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET

Figura 14.4: Propriedades do Site Web padro.

Figura 14.5: As opes da guia Segurana de pasta.

585

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 14.6: As opes para mtodos de autenticao.


13. A primeira opo desta janela Acesso annimo. Para que o acesso annimo seja permitido, esta opo deve estar marcada. 14. Para definir a conta que ser utilizada para o acesso annimo, d um clique no boto Editar, ao lado da opo Acesso annimo. 15. Ser exibida a janela Conta de usurio annimo, conforme indicado na Figura 14.7.

Figura 14.7: Definindo a conta para usurio annimo.


16. Nesta janela voc pode definir a conta que ser utilizada para o acesso annimo. Observe que por padro definida a conta IUSR_NOME_DO_COMPUTADOR. No exemplo da Figura 9.7, aparece IUSR_SERVIDOR, pois o computador que estou utilizando para escrever este livro tem o nome de SERVIDOR, conforme j descrito em outras oportunidades. 17. Caso voc queira utilizar outra conta e no lembre o nome da mesma, s clicar no boto Procurar, e ser exibida uma lista de usurios cadastrados no Windows 2000.

www.juliobattisti.com.br

586

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


18. Uma opo interessante a ser comentada a seguinte: Permitir que o IIS controle a senha: Esta opo, quando selecionada, permite ao IIS sincronizar automaticamente as configuraes de senha annima com aquelas definidas no Windows 2000. Se a senha fornecida conta annima e a senha do Windows para a conta forem diferentes, a autenticao annima no funcionar. Este um dos erros mais comuns e a causa mais freqente de indisponibilidade de um site IIS. Por algum motivo esta opo no est marcada; com isso preciso digitar a senha para a conta IUSR_NOME_DO_COMPUTADOR. O usurio digita a senha e OK. Porm mais adiante, por algum motivo ou por solicitao do Administrador do IIS, a senha para esta conta alterada no Windows 2000. Como a sincronizao no est ativada, o IIS continua tentando usar a senha antiga. Como as duas senhas esto diferentes, o acesso negado e o usurio recebe uma mensagem de acesso negado ao tentar acessar o site. 19. Aps ter configurado as informaes para a conta de acesso annimo, d um clique em OK. 20. Voc estar de volta janela Mtodos de autenticao; d um clique em OK para fech-la. 21. Voc estar de volta janela Propriedades do site da Web padro; d um clique em OK para fech-la. 22. Voc estar de volta ao Gerenciador do Internet Services. Feche-o.

Verificando as Configuraes da Conta Para Acesso Annimo no Windows 2000 Server


configuraes para esta conta esto corretas. Vamos verificar duas configuraes a respeito desta conta: A que grupos de usurios do Windows 2000 pertence esta conta. Se a conta possui a permisso Fazer logon localmente. Para verificar a que grupos pertence a conta IUSR_NOME_DO_COMPUTADOR: 1. 2. Faa o logon no Windows 2000 Server, com permisses de administrador. Abra o Console para Gerenciamento do computador: Iniciar -> Programas -> Ferramentas administrativas -> Gerenciador do Computador.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


3. Surge a janela indicada na Figura 14.8.

Figura 14.8: O console para Gerenciamento do computador.


4. 5. 6. D um clique no sinal de + ao lado da opo Ferramentas de sistema, para abri-la. Nas opes que surgem, abaixo de Ferramentas de sistema, d um clique no sinal de + ao lado da opo Usurios e grupos locais para abri-la. Surgem as opes indicadas na Figura 14.9.

Figura 14.9: Informaes sobre os usurios e grupos de usurios do Windows 2000.


7. D um clique na opo Usurios. Surge, no painel da direita, uma listagem com o nome de todos os usurios, conforme indicado na Figura 14.10.

www.juliobattisti.com.br

588

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET

Figura 14.10: Listagem dos usurios cadastrados.


8. Na lista de usurios, do painel da direita, localize o usurio IUSR_NOME_DO_COMPUTADOR e d um clique duplo sobre o mesmo para abrir a janela de propriedades do usurio, conforme indicado na Figura 14.11. No nosso exemplo o usurio IUSR_SERVIDOR, pois, conforme descrito anteriormente, o computador que estou utilizando chamado SERVIDOR.

Figura 14.11: Propriedades para o usurio IUSR_SERVIDOR.

589

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


9. Para saber a quais grupos o usurio pertence, d um clique na guia Participante de (ou Membro de, se for um Controlador de Domnio). Podemos conferir que o usurio IUSR_SERVIDOR somente pertence ao grupo Convidados. Se estivssemos em um Servidor que atua como Controlador de domnio, teramos o grupo Convidados do domnio. 10. Quando o IIS instalado, a conta IUSR_SERVIDOR criada e automaticamente adicionada ao grupo Convidados. 11. Muito cuidado ao adicionar a conta IUSR_SERVIDOR a outros grupos. Quando uma conta de usurio adicionada a um grupo, ele herda as permisses atribudas ao grupo e com isso passa a ter acesso aos recursos a que o grupo tem acesso. A maior insanidade que o administrador Web poderia cometer seria adicionar a conta IUSR_SERVIDOR ao grupo Administradores. Com isso estaria dando permisses mximas aos usurios que fazem acesso annimo. Seria caso de internao do seu administrador Web. 12. Clique no boto OK para fechar a janela com as propriedades da conta IUSR_SERVIDOR. 13. Voc estar de volta ao Gerenciador do computador; feche-o. Agora precisamos verificar se a conta IUSR_SERVIDOR tem a permisso para Efetuar logon local. Para verificar se a conta IUSR_SERVIDOR tem a permisso para Efetuar logon local, faa o seguinte: 1. 2. 3. Faa o logon no Windows 2000 Server, com permisses de administrador. Abra o Console Configuraes locais de segurana: Programas -> Ferramentas administrativas -> Diretivas de segurana local. Surge a janela indicada na Figura 14.12.

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.

Figura 14.12: Configuraes locais de segurana.


4. D um clique no sinal de + ao lado da opo Diretivas locais, para abri-la.

www.juliobattisti.com.br

590

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


5. 6. Nas opes que surgem, abaixo de Diretivas locais, d um clique no sinal de + ao lado da opo Atribuio de direitos de usurio, para abri-la. Surgem as opes indicadas na Figura 14.13.

Figura 14.13: Atribuies de direitos para contas e grupos de usurios.


7. 8. No painel da direita surgem as diversas permisses disponveis. Na listagem de permisses, localize Efetuar logon local, conforme indicado na Figura 14.14.

Figura 14.14: A permisso Efetuar logon local.


9. D um clique duplo sobre a permisso Efetuar logon local, para exibir a janela de configuraes para esta Diretiva de segurana local. Nesta janela surge uma lista dos usurios que possuem a permisso de Efetuar logon local, conforme indicado na Figura 14.15. O usurio IUSR_SERVIDOR deve fazer parte da lista.

591

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 14.15: Lista de usurios com direito a Efetuar logon local.


10. Caso o usurio IUSR_SERVIDOR no estivesse na lista, voc poderia adicion-lo utilizando o boto Adicionar. 11. A permisso Efetuar logon local autoriza o usurio a fazer o logon no console do Servidor, isto , localmente no servidor. A conta utilizada para acesso annimo precisa desta permisso, pois caso contrrio o Acesso annimo no ir funcionar. 12. D um clique no boto OK para voltar ao console Configuraes locais de segurana. 13. Feche-o. Com isso j sabemos que a conta para acesso annimo est configurada corretamente. No prximo item vamos retirar as permisses NTFS da conta de acesso annimo de uma das aplicaes Web do servidor. Vamos tentar acessar esta aplicao e observar os resultados obtidos.

Configurando Permisses NTFS em Pastas do Servidor Web


Uma das medidas bsicas de segurana a utilizao de drives formatados com o sistema de arquivos NTFS, ao invs de FAT e FAT32. O motivo bastante simples, pois, atravs da utilizao do sistema de arquivos NTFS, podemos ter um controle bastante refinado sobre o acesso s informaes, mediante a atribuio de permisses de pasta e de arquivos. Quando estamos tratando de permisses NTFS, j estamos em um nvel de segurana que gerenciado pelo Sistema Operacional. atravs da utilizao do Windows 2000 Server que definimos permisses NTFS. Isso refora o fato de que a segurana tanto responsabilidade do grupo de Desenvolvimento, quanto do Administrador da rede.

www.juliobattisti.com.br

592

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


No exemplo do Acesso annimo, o usurio identificado para o Windows 2000, como se fosse o usurio IUSR_NOME_DA_MAQUINA. Este usurio somente ter acesso s pastas e arquivos para os quais o usurio IUSR_NOME_DA_MAQUINA tiver permisses de acesso e com os nveis de permisses definidos. Antes de aprendermos a definir permisses NTFS vamos aprender um pouco mais sobre as mesmas.

Sistemas de Arquivos no Windows 2000 e Permisses NTFS


Agora vamos ver alguns detalhes sobre os sistemas de arquivos que o Windows 2000 Server reconhece e tambm sobre permisses NTFS. Um sistema de arquivos determina a maneira como o Windows 2000 Server organiza e recupera as informaes no disco rgido ou em outros tipos de mdia. O Windows 2000 Server reconhece os seguintes sistemas de arquivos: FAT FAT32 NTFS NTFS 5 O sistema FAT vem desde a poca do DOS e tem sido mantido por questes de compatibilidade. Alm disso, se voc tiver instalado mais de um Sistema Operacional no seu computador, alguns sistemas mais antigos (DOS, Windows 3.x e as primeiras verses do Windows 95) somente reconhecem o sistema FAT. Com o sistema de arquivos FAT, a nica maneira de restringir o acesso ao contedo de uma pasta compartilhada atravs das permisses de compartilhamento, as quais no tm efeito no caso de acessos pela Internet, atravs do IIS. Com a utilizao do sistema FAT, alguns recursos avanados, tais como compresso, criptografia e auditoria, no esto disponveis. O sistema FAT32 apresenta algumas melhoras em relao ao sistema FAT. Existe um melhor aproveitamento do espao em disco, e, com isso, um menor desperdcio. Um grande inconveniente do sistema FAT32 que ele no reconhecido pelo Windows NT Server 4.0. Com o sistema de arquivos FAT32, a nica maneira de restringir o acesso ao contedo de uma pasta compartilhada atravs das permisses de compartilhamento. Com a utilizao do sistema FAT32, alguns recursos avanados, tais como compresso, criptografia e auditoria, no esto disponveis. O sistema de arquivos NTFS utilizado no Windows NT Server 4.0 e foi mantido e melhorado no Windows 2000 Server, por questes de compatibilidade, j que uma nova verso do NTFS foi introduzida com o Windows 2000 NTFS 5. um sistema bem mais eficiente do que FAT e FAT32, alm de permitir uma srie de recursos avanados, tais como: Permisses em nvel de arquivos e pastas Compresso Auditoria de acesso Parties bem maiores do que as permitidas com FAT e FAT32 Desempenho bem superior do que com FAT e FAT32

593

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Uma das principais vantagens do NTFS que o mesmo permite que sejam definidas permisses de acesso em nvel de arquivo e de pastas, isto , posso ter arquivos em uma mesma pasta, com permisses diferentes para usurios diferentes. Alm disso, as permisses NTFS tm efeito localmente, isto , mesmo que o usurio faa o logon no computador onde um determinado arquivo est gravado, se o usurio no tiver as permisses NTFS necessrias, ele no poder acessar o arquivo. Isso confere um alto grau de segurana, desde que as permisses NTFS sejam configuradas corretamente. No Windows 2000 Server, conforme descrito anteriormente, temos tambm o NTFS 5, o qual apresenta diversas melhorias em relao ao NTFS, tais como: Criptografia de arquivos e pastas (A criptografia uma maneira de embaralhar a informao de tal forma que, mesmo que um arquivo seja copiado, o mesmo se torna ininteligvel, a no ser para a pessoa que possui a chave para descriptografar o arquivo). Cotas de usurio: faz com que seja possvel limitar o espao em disco que cada usurio pode utilizar. Gerenciamento e otimizao melhorados. Um inconveniente do NTFS 5 que ele no reconhecido pelas verses anteriores, tais como o Windows NT Server 4.0 (somente com Service Pack 4.0 ou superior). Caso voc possua uma rede na qual esto presentes servidores com o Windows 2000 Server e com o Windows NT Server 4.0, planeje com bastante cuidado a utilizao do NTFS 5. Conforme descrito anteriormente, podemos definir permisses de acesso em nvel da pasta ou arquivo, mas somente em unidades formatadas com o sistema de arquivos NTFS (seja na verso do NT Server 4.0 ou o NTFS 5 do Windows 2000 Server). Por isso que aconselhvel instalar o Windows 2000 Server sempre em unidades formatadas com NTFS, pois isso melhora a segurana. Com relao s permisses NTFS, temos um conjunto diferente de permisses quando tratamos de pastas ou arquivos. Nas Tabelas 14.1(para pastas) e 14.2 (para arquivos), so apresentadas as permisses e o nvel de acesso para cada uma delas.

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

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET

Permisso Modificar Controle total

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Agora que j conhecemos um pouco mais sobre permisses NTFS, podemos aprender como configurar estas permisses.

Definindo Permisses NTFS


Neste exemplo prtico vamos fazer o seguinte: Vamos retirar as permisses NTFS do usurio IUSR_SERVIDOR da pasta de um aplicativo Web. Vamos tentar acessar o aplicativo e observar a mensagem de erro que recebemos. Vamos restaurar as permisses originais e tentar acessar a pgina novamente. Para acessar as permisses NTFS de uma pasta e retirar as permisses do usurio IUSR_SERVIDOR, faa o seguinte: 1. 2. 3. Faa o logon com privilgios de Administrador. Utilizando o Windows Explorer, localize a pasta cujas permisses NTFS sero alteradas. D um clique com o boto direito do mouse na pasta. No menu de opes que surge d um clique em Propriedades. 4. Surge a janela indicada na Figura 14.16.

Figura 14.16: Janela com as propriedades da pasta.


5. D um clique na guia Segurana.

www.juliobattisti.com.br

596

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


6. Surge a janela indicada na Figura 14.17.

Figura 14.17: As configuraes de segurana para a pasta selecionada.


7. 8. Observe que a conta com a descrio Conta de convidado da Internet a conta para acesso annimo, que no nosso exemplo IUSR_SERVIDOR. Somente possuem permisso de acesso as contas que fazem parte desta lista. D um clique no boto Avanado. Surge a janela indicada na Figura 14.18.

Figura 14.18: A conta IUSR_SERVIDOR possui permisso somente para leitura.

597

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


9. Observe que a conta para acesso annimo possui permisso somente de leitura. clique sobre a conta para marc-la, e depois d um clique no boto Remover. 11. A conta IUSR_SERVIDOR no aparece mais na listagem. 12. Marque a opo Redefinir opes em todos os objetos filhos e permitir a propagao das permisses herdades. Esta opo deve ser marcada para que as alteraes que esto sendo feitas na pasta sejam propagadas para todas as subpastas e arquivos pertencentes a esta pasta. Esta modificao necessria para que a permisso para o usurio IUSR_SERVIDOR seja retirada de todos os arquivos pertencentes pasta que est sendo alterada. 13. D um clique no boto OK para voltar janela de propriedades da pasta. 14. Surge uma janela pedindo confirmao. D um clique em Sim para continuar. 15. Voc estar de volta janela de propriedades da pasta. 16. Na lista de usurios, remova os usurios IUSR_SERVIDOR e o grupo Todos. Para isso basta clicar no nome do usurio ou grupo e depois clicar no boto Remover. 17. A sua lista de permisses deve estar semelhante indicada na Figura 14.19.

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

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


Agora que retiramos as permisses do usurio annimo, se algum tentar acessar algum arquivo que est na pasta cujas permisses foram retiradas, ir receber uma mensagem de erro, conforme indicado na Figura 14.20. Veja que a mensagem informa que o acesso pgina solicitada foi negado. Isto acontece porque o usurio IUSR_SERVIDOR no possui as permisses NTFS necessrias.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


4. Surge a janela indicada na Figura 14.21.

Figura 14.21: As configuraes de segurana para a pasta selecionada.


5. Observe que a conta com a descrio Conta de convidado da Internet a conta para acesso annimo, que no nosso exemplo IUSR_SERVIDOR. e que esta conta no aparece na lista de usurios; portanto a mesma no possui permisses de acesso. 6. D um clique no boto Avanado. Observe que a janela em que surge a conta IUSR_SERVIDOR tambm no faz parte da listagem, conforme indicado na Figura 14.22.

Figura 14.22: A conta IUSR_SERVIDOR no aparece na lista de contas.

www.juliobattisti.com.br

600

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


7. D um clique no boto Adicionar. Surge uma janela com a listagem de usurios. Localize o usurio IUSR_SERVIDOR e d um clique sobre o mesmo para marc-lo, conforme indicado na Figura 14.23.

Figura 14.23: Adicionando novamente o usurio IUSR_SERVIDOR.


8. 9. D um clique no boto OK. Surge uma janela pedindo para que voc defina as permisses NTFS para o usurio IUSR_SERVIDOR. Defina as permisses conforme indicado na Figura 14.24 e d um clique no boto OK.

Figura 14.24: Restaurando as permisses para o usurio IUSR_SERVIDOR.

601

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


10. Voc estar de volta janela de opes avanadas. Certifique-se de que a opo Redefinir permisses em todos os objetos filho e permitir a propagao das permisses herdadas, esteja marcada. 11. D um clique no boto OK para voltar janela de propriedades da pasta. 12. Surge uma janela pedindo confirmao, conforme indicado na Figura 14.25. D um clique em Sim para continuar.

Figura 14.25: Confirmando as alteraes.


13. Voc estar de volta guia Segurana, da janela de propriedades da pasta. 14. Vamos adicionar o usurio IUSR_SERVIDOR para que ele tenha permisses de acesso pasta. 15. D um clique no boto Adicionar. Surge a janela Selecione Usurios, Computadores ou Grupos. Localize o usurio IUSR_SERVIDOR e d um clique sobre o mesmo para marc-lo. Depois d um clique no boto Adicionar, para incluir o usurio na parte inferior da janela, conforme indicado na Figura 14.26.

Figura 14.26: Adicionando o usurio IUSR_SERVIDOR na lista de usurios que tm permisso de acesso pasta selecionada.

www.juliobattisti.com.br

602

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


16. D um clique no boto OK. Observe que o usurio IUSR_SERVIDOR j consta na listagem de usurios. 17. Defina as permisses conforme indicado na Figura 14.27 e d um clique no boto OK.

Figura 14.27: Redefinindo as permisses de acesso pasta selecionada.


Feito isso foram reatribudas as permisses NTFS originais e qualquer usurio volta a ter acesso pasta (no nosso exemplo era a pasta Captulo 8) e a todo o seu contedo, porm com permisso somente para leitura. Agora o usurio j poder acessar a pgina, pois no ser mais retornada a mensagem de acesso negado. Com este exemplo, podemos constatar que o servidor IIS trabalha em sintonia com o Windows 2000, de tal forma que os recursos de segurana do Sistema Operacional podem ser utilizados pelo IIS. Ns detalhamos um pouco mais o primeiro tipo de acesso Acesso annimo, para explicar alguns conceitos importantes em detalhes. Agora passaremos a estudar outros tipos de autenticao possveis com o IIS. Lembrando que a autenticao com o IIS apenas um dos tantos nveis de segurana que podemos configurar.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Username e uma senha. O mtodo de autenticao bsica um padro de mercado amplamente usado para coletar informaes de nome de usurio e senha. A autenticao bsica funciona da seguinte forma: 1. O navegador exibe uma caixa de dilogo na qual o usurio pode digitar seu Username e senha de conta do Windows 2000, previamente cadastrada. Por isso, um pr-requisito da autenticao bsica, que o usurio j possua uma conta cadastrada no Windows 2000. 2. 3. O navegador tenta estabelecer uma conexo usando essas informaes. Se o servidor rejeitar as informaes, o navegador da Web exibe repetidamente a caixa de dilogo at que o usurio digite um nome de usurio e uma senha vlidos ou feche a caixa de dilogo. 4. Quando o servidor Web verifica que o nome de usurio e a senha correspondem a uma conta de usurio do Windows 2000 vlida, a conexo estabelecida e o acesso pgina solicitada liberado. A autenticao bsica apresenta, como principal requisito, o fato de que o usurio deve ter uma conta no Windows 2000. Para sites que so acessados por um grande nmero de usurios pode no ser uma boa opo. Alm disso, o fato de o usurio ter que digitar um username e senha no muito simptico. Uma das grandes desvantagens deste mtodo de autenticao o fato de que a senha no criptografada ao ser transmitida pela rede. A codificao que feita extremamente simples de ser quebrada; por isso este mtodo de autenticao no dos mais seguros. A vantagem da autenticao bsica que ela faz parte da especificao do HTTP e tem suporte da maioria dos navegadores. A desvantagem que, pelo fato de os navegadores que usam a autenticao bsica transmitirem senhas de forma descriptografada, ao monitorar as comunicaes na sua rede, algum pode interceptar e decifrar facilmente essas senhas usando ferramentas disponveis publicamente na Internet. Portanto, a autenticao bsica no recomendada a menos que voc tenha certeza de que a conexo entre o usurio e seu servidor Web segura, como uma conexo direta via cabo ou uma linha dedicada.

Autenticao Integrada do Windows


A autenticao integrada do Windows (chamada anteriormente NTLM ou autenticao de desafio/resposta do Windows NT) uma forma segura de autenticao pois o nome de usurio e a senha no so enviados pela rede criptografados. Quando voc ativa a autenticao integrada do Windows, o navegador do usurio verifica a validade da senha atravs de uma troca criptogrfica com o servidor Web. A autenticao integrada do Windows pode usar o protocolo de autenticao Kerberos verso 5 e o seu prprio protocolo de autenticao desafio/resposta. Se o Servio de diretrio Active Directory, estiver instalado no servidor e o navegador for compatvel com o protocolo de autenticao Kerberos verso 5, o protocolo Kerberos verso 5 e o

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

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


protocolo desafio/resposta sero usados; caso contrrio, somente o protocolo desafio/resposta ser usado. O protocolo de autenticao Kerberos verso 5 um recurso da arquitetura do Windows 2000 Distributed Services. Para que a autenticao do Kerberos verso 5 seja bem-sucedida, o cliente e o servidor devem ter uma conexo confivel com um Key Distribution Center (KDC) e devem ser compatveis com os Servios do Active Directory. A situao ideal onde o cliente utiliza o Windows 2000 Professional. A autenticao integrada do Windows funciona da seguinte forma: 1. Diferentemente da autenticao bsica, ela no solicita inicialmente um nome de usurio e uma senha. As informaes atuais de usurio logado e sobre o computador cliente so usadas para a autenticao integrada do Windows. 2. No entanto, se a troca da autenticao no consegue identificar o usurio, o navegador solicita ao usurio um nome de usurio e uma senha de conta de usurio do Windows, que ele processa usando a autenticao integrada do Windows. 3. O Internet Explorer continuar a solicitar o usurio at que ele digite um nome de usurio e uma senha vlidos ou feche a caixa de dilogo de solicitao. Embora a autenticao integrada do Windows seja segura, ela tem duas limitaes. 1. 2. Somente o Microsoft Internet Explorer, verso 2.0 ou posterior, oferece suporte a esse mtodo de autenticao. A autenticao integrada do Windows no funciona em conexes feitas atravs de um Servidor Proxy. Portanto, a autenticao integrada do Windows mais adequada para um ambiente de Intranet, no qual o usurio e o servidor Web esto no mesmo domnio e os administradores podem garantir que todos os usurios tenham o Microsoft Internet Explorer, verso 2.0 ou posterior.

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.

Autenticao Utilizando Certificados


Este um dos mtodos de autenticao que mais vm crescendo em termos de utilizao. Inicialmente os Certificados digitais foram projetados como um instrumento de autenticao segura para a Internet, porm o seu uso apresentou tantas vantagens que hoje bastante comum a utilizao de Certificados digitais em Intranets e Extranets. A tecnologia de certificados usa os recursos de segurana de Secure Sockets Layer (SSL, camada de soquetes de segurana) do servidor Web para dois tipos de autenticao. possvel usar um certificado de servidor para permitir que os usurios faam a autenticao do seu site da Web antes de transmitir informaes pessoais, como um nmero de carto de crdito. Alm disso, voc pode usar certificados de cliente para autenticar os usurios que solicitam informaes no seu site da Web. O SSL faz a autenticao verificando o contedo de uma identificao digital (O Certificado digital) criptografada submetida pelo navegador do usurio

605

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


durante o processo de logon (Os usurios obtm certificados de cliente de uma organizao independente mutuamente confivel Autoridade Certificadora.). Os certificados de servidor contm geralmente informaes sobre sua empresa e a organizao que emitiu o certificado. Os certificados de cliente contm normalmente informaes de identificao sobre o usurio e a organizao que emitiu o certificado.

Mapeamento do Certificado Cliente


Voc pode associar, ou mapear, certificados de cliente a contas de usurio do Windows no IIS. Depois que voc cria e ativa um mapa de certificado, sempre que um usurio faz logon com um certificado de cliente, seu servidor Web associa automaticamente esse usurio conta de usurio do Windows apropriada. Dessa forma, voc pode autenticar automaticamente os usurios que fazem logon com certificados de cliente, sem exigir o uso da autenticao bsica ou integrada do Windows. possvel mapear um certificado de cliente para uma conta de usurio do Windows ou muitos certificados de cliente para uma conta. Por exemplo, se voc tivesse vrios departamentos ou empresas diferentes no seu servidor, cada uma com seu prprio site da Web, seria possvel usar o mapeamento vrios-para-um para mapear todos os certificados de cliente de cada departamento ou empresa para o prprio site da Web. Dessa forma, cada site forneceria acesso somente aos prprios clientes. O tipo de autenticao apenas um dos aspectos que precisam ser definidos. Devem ser consideradas diversas questes. A seguir segue uma lista de questes que devem ser levadas em considerao na hora de decidir sobre o tipo de autenticao que iremos configurar no IIS, ou se devemos configurar mais do que um tipo de autenticao. Para um site pblico, ou reas de acesso pblico, a autenticao utilizando Acesso annimo a mais indicada, pois evita que o usurio tenha que fornecer um username e senha. Para acesso ao contedo de uma Intranet, uma das primeiras opes a serem pensadas a utilizao da autenticao integrada do Windows. Pois sendo uma Intranet um ambiente controlado, possvel garantir que todos os clientes satisfaam as condies exigidas pela autenticao Integrada. Para sites que trabalham com dados sensveis como servios bancrios pela Internet e Comercio Eletrnico, sem dvida que a utilizao de Certificados Digitais o mais indicado. Em Intranets tambm tm sido utilizados Certificados Digitais, pois, conforme descrevemos no incio do captulo, a maioria dos ataques parte de usurios da prpria Intranet da empresa. Muitas vezes nos preocupamos muito com os ataques externos e esquecemos as ameaas que vm de dentro da empresa.

Configurando o Tipo de Autenticao no IIS


Neste item veremos como configurar uma ou mais opes de autenticao no IIS, lembrando que podemos ter diferentes tipos de autenticao em diferentes partes de um site armazenado em um servidor IIS. Por exemplo, para uma rea de acesso pblico podemos utilizar autenticao annima, para uma rea mais restrita podemos utilizar somente autenticao integrada do Windows. Podemos inclusive configurar o nvel de autenticao para uma pgina HTML ou ASP, individualmente. Para configurar o tipo de autenticao faa o seguinte: 1. Faa o logon no Windows 2000 Server, com permisses de administrador.

www.juliobattisti.com.br

606

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


2. 3. 4. 5. Abra o Gerenciador do Internet Services: Iniciar -> Programas -> Ferramentas administrativas -> Gerenciador do Internet Services. aberto o console de gerenciamento do IIS. D um clique duplo no nome do computador. No nosso exemplo o nome Servidor. Surgem as opes indicadas na Figura 14.28.

Figura 14.28: Opes de gerenciamento do IIS.


6. 7. 8. 9. Neste momento podemos configurar o tipo de autenticao para todos os aplicativos Web contidos no Servidor ou para cada aplicativo individualmente. A ttulo de exemplo, vamos configurar o tipo de autenticao para o site Web padro. Clique com o boto direito do mouse sobre a opo Site da Web padro (ou na opo correspondente, caso voc tenha alterado este nome). No menu de opes que surge d um clique em Propriedades. Ser exibida a janela Propriedades de Site Web padro.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 14.29: As opes da guia Segurana de pasta.

Figura 14.30: As opes para mtodos de autenticao.

www.juliobattisti.com.br

608

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


14. Selecione as opes desejadas. Se voc clicar na opo Autenticao bsica, o IIS emite um aviso de que para esta opo as senhas sero transmitidas sem criptografia, conforme indicado na Figura 14.31.

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.

Figura 14.32: Estendendo as configuraes para as aplicaes e pastas virtuais.


19. Para estender as configuraes basta selecionar uma ou mais das opes mostradas e clicar no boto OK. Voc tambm pode utilizar o boto Selecionar tudo e depois clicar em OK.

609

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


20. Voc estar de volta ao Gerenciador do Internet Services. Feche-o. Para configurar as opes para uma pasta Virtual em particular, basta localiz-la abaixo da opo Site Web padro, clicar com o boto direito sobre a mesma e clicar na opo Propriedades. Depois s seguir os passos indicados anteriormente.

Mais Configuraes de Segurana do IIS


Podemos efetuar outras configuraes relacionadas com segurana, no servidor IIS. Existem algumas opes que limitam o tipo de ao que o usurio pode tomar em uma determinada pasta virtual ou em uma pgina especificamente. Neste item iremos estudar diversas destas opes. Dividiremos as mesmas em dois grupos: Opes gerais de segurana. Opes relacionadas com uma aplicao Web.

Configurando Opes Gerais de Segurana


Estas configuraes so definidas, normalmente, em nvel de pasta virtual. Para configurar estas opes faa o seguinte: 1. 2. 3. 4. Faa o logon no Windows 2000 Server, com permisses de administrador. Abra o Gerenciador do Internet Services: Iniciar -> Programas -> Ferramentas administrativas -> Gerenciador do Internet Services. aberto o console de gerenciamento do IIS. D um clique duplo no nome do computador. No nosso exemplo o nome Servidor.

Figura 14.33: Configurando opes gerais de segurana para Capitulo6.

www.juliobattisti.com.br

610

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


5. 6. 7. 8. 9. D um clique no sinal de + ao lado de Site Web padro. Sero exibidas as diversas pastas virtuais disponveis no servidor. A ttulo de exemplo, vamos configurar as opes gerais de segurana para a pasta Capitulo6, conforme indicado na Figura 14.33. Clique com o boto direito do mouse sobre a opo Capitulo6. No menu de opes que surge d um clique em Propriedades. Ser exibida a janela Propriedades de Capitulo6. Na guia Pasta (que j deve estar sendo exibida), existem diversas opes de configurao. Abaixo descrevemos cada uma destas opes. Acesso ao cdigo-fonte do Script: Selecione esta opo para permitir que os usurios acessem o cdigo-fonte se a permisso de leitura ou gravao estiver definida. O cdigo-fonte inclui scripts nos aplicativos ASP. Leitura: Selecione esta opo para permitir que os usurios leiam ou faam o download dos arquivos ou diretrios e de suas propriedades associadas. Gravao: Selecione esta opo para permitir que os usurios carreguem os arquivos e suas propriedades associadas no diretrio ativado no servidor ou alterem o contedo de um arquivo ativado para gravao. A gravao s poder ser feita com um navegador que d suporte ao recurso PUT do protocolo padro HTTP 1.1. Cuidado com esta permisso. Dificilmente voc precisar habilitar permisso de Gravao para reas em que permitida a autenticao com usurio annimo. Pesquisa em Pasta: Selecione esta opo para permitir que o usurio veja uma listagem em hipertexto dos arquivos e subdiretrios deste diretrio virtual. Os diretrios virtuais no aparecero nas listagens de diretrios; os usurios devem saber o alias do diretrio virtual. Caso o usurio digite o endereo para o caminho da pasta e no especifique um documento a ser carregado, ser exibida uma listagem semelhante indicada na Figura 14.34.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Caso esta opo no esteja marcada e o usurio digite o endereo para a pasta, sem especificar um arquivo a ser carregado, ser retornada a mensagem de erro indicada na Figura 14.35.

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

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET

Figura 14.36: Seqncia de verificao do IIS.

Configurando de Segurana Para Aplicativos Web no IIS


Estas configuraes so definidas, tambm utilizando a guia Pasta da janela de propriedades para a pasta virtual que representa a aplicao Web. Para configurar estas opes faa o seguinte: 1. 2. 3. 4. 5. 6. 7. 8. 9. Faa o logon no Windows 2000 Server, com permisses de administrador. Abra o Gerenciador do Internet Services: Iniciar -> Programas -> Ferramentas administrativas -> Gerenciador do Internet Services. aberto o console de gerenciamento do IIS. D um clique duplo no nome do computador. No nosso exemplo o nome Servidor. D um clique no sinal de + ao lado de Site Web padro. Sero exibidas as diversas pastas virtuais disponveis no servidor. A ttulo de exemplo, vamos configurar as opes de aplicao para a pasta Capitulo6. Clique com o boto direito do mouse sobre a opo Capitulo6. No menu de opes que surge d um clique em Propriedades. Ser exibida a janela Propriedades de Capitulo6. Certifique-se de que esto sendo exibidas as opes da guia Pasta. do aplicativo. Abaixo temos uma descrio de cada uma destas opes.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Conforme descrito anteriormente, uma Aplicao Web do IIS definida pela estrutura de diretrios em que est localizado (falaremos mais sobre Aplicaes Web, mais adiante). Para obter mais informaes, consulte o tpico Aplicaes Web, mais adiante. Nome do aplicativo: Normalmente utilizamos o mesmo nome da pasta virtual. Boto Remover: Se clicarmos neste boto removemos todas as opes de aplicativo, e transformamos o aplicativo Web em uma simples pasta virtual, para a qual no se aplicam os conceitos de Aplicao Web. No captulo sobre Web Services, tivemos que verificar se uma determinada pasta estava configurada como aplicao Web, para que pudssemos testar o Web Service CalculosLegais, que criamos no Captulo 13. Permisses de execuo: Esta opo determina o nvel de execuo de programa permitido para recursos de diretrios virtuais ou deste site. Temos as seguintes opes: Nenhum: Somente arquivos estticos, como os arquivos HTML (Hypertext Markup Language, linguagem de marcao de hipertexto) ou os arquivos de imagem, podem ser acessados. No permite que scripts ASP sejam executados. Somente scripts: Somente scripts, como os scripts ASP, podem ser executados. Este o padro normalmente definido. Scripts e executveis: Todos os tipos de arquivos podem ser acessados ou executados. Cuidado com esta configurao. Muitos dos ataques conhecidos consistem em enviar e executar arquivos executveis no servidor a ser atacado. Os executveis enviados normalmente abrem portas de segurana que estavam fechadas pelo Administrador. Proteo do aplicativo: Temos as seguintes opes: Baixa: Selecione esta opo para que os aplicativos sejam executados no mesmo processo que os servios da Web (opo baixo); neste caso, se um dos aplicativos apresentar problema e desativar o processo do servidor Web, todos os aplicativos ficaro indisponveis at que o servidor Web tenha sido normalizado. Mdia (em pool): Selecione esta opo para que a aplicao Web seja executada em um processo em pool isolado em que outros aplicativos tambm so executados. Alta (isolada): Neste caso a aplicao Web ser executada em seu prprio espao de endereamento e se a mesma apresentar problemas, as outras aplicaes Web, bem como o servidor IIS, continuam funcionando normalmente. A execuo isolada aumenta a disponibilidade do servidor Web, pois problemas em uma aplicao no iro afetar todo o servidor, porm consomem mais recursos, como memria, pois cada aplicao executada em seu prprio espao de memria.

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

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET

Figura 14.37: cones para uma pasta virtual e para uma aplicao Web.

Definindo Restries de Acesso em Nvel de Endereo IP


Podemos definir restries de acesso em nvel de endereo IP. Por exemplo, vamos supor que existe uma rea do site que est em desenvolvimento, de tal forma que a mesma no deva ser acessada, nem por usurios da Intranet da empresa, muito menos por usurios da Internet. Somente os participantes do grupo de desenvolvimento que devem ter acesso a esta parte do site. Podemos, sem maiores problemas, limitar o acesso, de tal maneira que somente as estaes de trabalho dos desenvolvedores tenham acesso rea de desenvolvimento do site. Neste item aprenderemos a configurar uma aplicao Web ou uma pasta virtual do IIS, para limitar o acesso com base no endereo IP do usurio. Para definir restries de acesso em nvel de endereo IP faa o seguinte: 1. 2. 3. 4. 5. Faa o logon no Windows 2000 Server, com permisses de administrador. Abra o Gerenciador do Internet Services: Iniciar -> Programas -> Ferramentas administrativas -> Gerenciador do Internet Services. aberto o console de gerenciamento do IIS. D um clique duplo no nome do computador. No nosso exemplo o nome Servidor. Nas opes que surgem d um clique com o boto direito do mouse sobre a opo Site da Web padro (ou na opo correspondente, caso voc tenha alterado este nome). No menu de opes que surge d um clique em Propriedades. 6. 7. Ser exibida a janela Propriedades de Site Web padro. D um clique na guia Segurana de pasta.

615

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


8. O segundo grupo de opes desta guia Restries de nome de domnio e endereo IP. D um clique no boto Editar, ao lado desta opo. Surge a janela, indicada na Figura 14.38.

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.

Figura 14.39: Definindo o alcance das restries impostas.

www.juliobattisti.com.br

616

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


Nesta janela temos trs opes a serem escolhidas, conforme explicado a seguir: Um computador: Neste caso estamos negando acesso para um computador especfico. Basta digitar o endereo IP do mesmo. No nosso exemplo, utilizaremos esta opo e iremos digitar o IP 10.204.123.1. Grupo de computadores: Se voc marcar esta opo, surge, na parte de baixo da janela, mais um campo: Mscara de sub-rede, conforme indicado na Figura 14.40. Podemos utilizar esta opo para negar acesso a uma rede ou segmento de rede inteiro. Por exemplo, podemos negar acesso a qualquer computador da rede 10.204.123; para isso preencheramos os campos da seguinte maneira:
Identificao da rede: 10.204.123.0 Mscara de sub-rede: 255.255.255.0

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

Figura 14.40: Negando acesso para um grupo de computadores.


Nome de domnio: Esta opo permite que neguemos acesso com base no nome DNS de um grupo de computadores. Por exemplo, podemos negar acesso para setor de contabilidade empresa, negando acesso para o domnio: contabilidade.abc.com.br. Ao tentar utilizar esta opo, o IIS emite uma mensagem avisando que o desempenho do servidor pode ser prejudicado pela ativao desta opo, e perguntando se voc realmente deseja ativ-la. 11. Vamos negar o acesso apenas para um computador 10.204.123.1. Certifique-se de que a opo Um computador esteja marcada e no campo Endereo IP, digite 10.204.123.1, conforme indicado na Figura 14.41.

617

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 14.41: Negando acesso para o computador 10.204.123.1.


12. D um clique no boto OK para incluir o computador com endereo IP 10.204.123.1, na lista dos computadores com acesso negado, conforme indicado na Figura 14.42. 13. D um clique no boto OK e voc estar de volta janela de propriedades do site Web padro. 14. D um clique no boto OK para fechar a janela de propriedades. 15. 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.

Figura 14.42: O computador com endereo IP 10.204.123.1 j aparece na lista.


16. Para estender as configuraes basta selecionar uma ou mais das opes mostradas e clicar no boto OK. Voc tambm pode utilizar o boto Selecionar tudo e depois clicar em OK. 17. Voc estar de volta ao Gerenciador do Internet Services. Feche-o. Agora vou tentar acessar uma pgina do servidor IIS para o qual o acesso foi negado para o IP do meu computador 10.204.123.1. Ao tentar fazer o acesso, recebo a mensagem indicada na Figura 14.43.

www.juliobattisti.com.br

618

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET

Figura 14.43: Mensagem de que o acesso foi negado.


Observe que a mensagem informa que o endereo IP foi rejeitado. Para que o endereo IP 10.204.123.1 volte a ter acesso ao site, s seguir os passos indicados anteriormente e remov-lo da lista de endereos IP com acesso negado.

Mecanismos de Segurana do Banco de Dados


Um outro nvel de segurana que pode ser configurado no nvel de banco de dados. Os Programas Gerenciadores de banco de dados, como o Microsoft SQL Server, Oracle, Microsoft Access, Sybase, etc., fornecem diversos mecanismos de segurana que, se adequadamente configurados, aumentam bastante o nvel de segurana das informaes. No Microsoft SQL Server podemos atribuir nveis de permisso para os usurios do Windows 2000 e at mesmo para o usurio utilizado para acesso annimo. Na Figura 14.44, temos um exemplo onde o usurio IUSR_SERVIDOR est recebendo permisso somente para leitura na tabela Orders do Banco de dados Northwind em um Servidor com o Microsoft SQL Server 2000.

619

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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.

O que uma Aplicao Web no IIS?


Antes de definirmos exatamente o que compe uma aplicao Web no IIS, vamos fazer uma comparao/explanao entre as aplicaes Cliente/Servidor tradicionais e as aplicaes Web, com nfase no conceito de conexo e estado.

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).

Uma Aplicao Cliente/Servidor Tradicional


Em uma aplicao Cliente/Servidor tradicional, temos o cliente instalado em cada uma das estaes da rede que faro acesso aplicao; podemos ter uma camada de lgica instalada no Servidor de

www.juliobattisti.com.br

620

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


Aplicaes, atravs da qual feito o acesso ao Banco de dados. Quando o usurio inicia a aplicao cliente, o mesmo se identifica, normalmente atravs da digitao de um nome de usurio (username ou login) e da digitao de uma senha. As informaes de identificao so utilizadas para estabelecer uma conexo com o Servidor. Esta conexo mantida enquanto a aplicao cliente estiver sendo utilizada. Atravs desta conexo, o lado Servidor da aplicao consegue identificar o usurio. Com a identificao do usurio podem ser aplicadas regras de segurana, como nveis de permisso de acesso aos dados, nveis de permisso para as funcionalidades da aplicao, log das aes realizadas pelo usurio, etc. Por exemplo, as opes de menu da aplicao Cliente podem ser montadas com base nas permisses de acesso que o usurio possui. Se o usurio no possui permisses para alterar os dados, o menu com as opes de alterao no ser exibido. Atravs da manuteno da conexo e da respectiva possibilidade de identificar unicamente cada um dos usurios conectados, podemos implementar a maioria das funcionalidades fundamentais nas aplicaes Cliente/Servidor tradicionais. Porm existem diversos problemas na atualizao e manuteno deste tipo de aplicao, dentre os quais podemos destacar: A atualizao dos sistemas problemtica, pois neste modelo cada vez que houver alterao na camada de apresentao (no modelo de n camadas) ou at mesmo na camada de Lgica do negcio (no modelo mais antigo de 2 camadas), a aplicao ter que ser atualizada em todas as estaes de trabalho que utilizam a aplicao. Controle de verso: Garantir que todas as estaes de trabalho estejam com a ltima verso da aplicao uma tarefa nada fcil, a qual, dependendo do nmero de estaes da rede da empresa, pode exigir uma equipe de Help Desk (suporte) praticamente dedicada a esta tarefa. Problemas de conflitos de DLL e padronizao de ambiente tornam a manuteno e o gerenciamento destas aplicaes uma tarefa difcil e de custo elevado.

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.

Aplicaes Web um Novo Paradigma


Para resolver os tradicionais problemas das aplicaes Cliente/Servidor que surge o conceito de aplicao Web. Para acessar uma aplicao Web, o nico programa de que o usurio precisa um Navegador instalado na sua estao. Existem inclusive aplicaes Web bem projetadas que no obrigam o usurio a utilizar um Navegador especfico, o que aumenta mais ainda a flexibilidade.

621

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Uma aplicao Web reside no servidor, no nosso caso no IIS. Toda e qualquer alterao que se fizer necessria na aplicao ser feita diretamente no servidor Web, sem que seja necessria nenhuma modificao nas estaes dos usurios. Na prxima vez que o usurio acessar a aplicao, utilizando o Navegador instalado na sua estao, j estaro disponveis as alteraes efetuadas. Com este modelo no necessria a atualizao (que muitas vezes significa uma reinstalao) da aplicao em todas as estaes da rede, cada vez que forem feitas alteraes na aplicao. Com isso, a equipe de suporte fica dispensada da tediosa tarefa de atualizao da aplicao em cada estao da rede. O modelo de aplicaes Web traz inmeras vantagens, dentre as quais podemos destacar: Atualizao das aplicaes centralizada no servidor Web, sem a necessidade de atualizar todas as estaes da rede que fazem acesso aplicao. Facilidade de manuteno e suporte, uma vez que o cliente somente precisa de um Navegador para acessar a aplicao. Reduo do chamado TCO Total Cost Ownership (Custo Total de Propriedade). O TCO uma medida de quanto custa, por ano, a manuteno de uma estao de rede em funcionamento. O Clculo do TCO leva em considerao diversos fatores. Para maiores informaes sobre o clculo do TCO acesse o site do Gardner Group na Internet. Porm nem tudo so vantagens. Pela natureza e implementao do modelo Web, o qual faz uso do protocolo HTTP, as aplicaes Web no tm como manter uma conexo permanente com o usurio. Por isso que o modelo Web, muitas vezes, conhecido como State Less, isto , Sem estado. Isso acontece porque, aps ter enviado a pgina solicitada pelo usurio, a conexo encerrada, no sendo possvel continuar trocando informaes com o usurio, a no ser que uma nova conexo seja estabelecida. Esta uma caracterstica intrnseca do protocolo HTTP. Para vencer as limitaes impostas por este modelo State Less, o ASP.NET deu passos importantes, como a possibilidade da manuteno do estado dos diversos controles de um formulrio Web, entre uma chamada e outra da pgina, conforme estudamos nos captulos anteriores. A possibilidade de diferenciar cada usurio que est acessando uma aplicao Web de fundamental importncia, para que possamos criar contedos personalizados e interativos, alm da possibilidade de aplicar conceitos como nveis de permisso de acesso aos dados e auditoria de acesso.

O que uma Aplicao Web no IIS?


Agora que j sabemos que o modelo de desenvolvimento baseado na Web o modelo dominante para o desenvolvimento de novas aplicaes, vamos aprender a identificar quais os elementos que compem uma aplicao Web no IIS. De uma maneira simples e didtica poderamos definir uma aplicao Web desenvolvida com ASP ou ASP.NET, como sendo: Uma pasta virtual e todas as suas subpastas, juntamente com um conjunto de pginas ASP ou ASP.NET, componentes COM ou COM+ e Web Services, projetados para executar uma ou mais tarefas especficas, como por exemplo um sistema para controle do departamento de Recursos Humanos. O nosso conjunto de pginas ASP pode fazer uso dos diversos componentes disponveis para a aplicao Web.

www.juliobattisti.com.br

622

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


No IIS, o primeiro passo para criar uma aplicao Web criar uma pasta, a qual ser o ponto de partida para a aplicao. O prximo passo transformar esta pasta em uma Pasta Virtual do servidor IIS. Vamos supor que voc tenha criado uma pasta chamada WebApl no drive C:\WebApl, de um servidor IIS chamado www.abc.com.br. Agora voc registrou esta pasta como uma pasta virtual chamada WebApl. Dentro deste diretrio voc criou uma pgina ASP.NET chamada index.aspx, a qual ser a pgina inicial da aplicao Web. Voc lembra como seria o endereo para acessar a pgina index.asp do diretrio virtual WebApl do servidor www.abc.com.br ? O endereo seria o seguinte: http://www.abc.com.br/WebApl/index.aspx Dentro da pasta WebApl poderamos criar outras pastas, conforme a necessidade da nossa aplicao Web. As pastas criadas dentro de uma pasta virtual j passam a ser acessveis para o servidor Web. Por exemplo, se dentro da pastas WebApl, criarmos uma pasta chamada Seguranca e dentro da pasta Seguranca colocarmos um arquivo chamado login.aspx. O endereo para acessar o arquivo login.asp seria o seguinte: http://www.abc.com.br/ WebApl/Seguranca/login.aspx Todos as subpastas da pasta WebApl tambm faro parte da aplicao Web. Com isso podemos concluir, em um primeiro momento, que uma aplicao Web do IIS est ligada criao de uma pasta virtual no servidor IIS. O prximo passo configurar as propriedades da aplicao Web. Para isso utilizamos o Gerenciador do Internet Services, conforme ilustrado nos passos a seguir. Para configurar as propriedades de uma aplicao Web faa o seguinte: 1. 2. 3. Faa o logon no Windows 2000 Server, com permisses de administrador. Abra o Gerenciador do Internet Services: Iniciar -> Programas -> Ferramentas administrativas -> Gerenciador do Internet Services. Surge a janela indicada na Figura 14.45.

NOTA: Para saber como transformar uma pasta em uma Pasta Virtual do IIS, consulte a Introduo e o Captulo 1 deste livro.

Figura 14.45: O Gerenciador do Internet Services.

623

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


4. 5. 6. Esta a janela do console de administrao do IIS 5.0. D um clique duplo no nome do computador. No nosso exemplo o nome Servidor. Surgem as opes indicadas na Figura 14.46.

Figura 14.46: Opes de gerenciamento do IIS.


7. 8. Todos os aplicativos Web esto disponveis atravs da opo Site da Web Padro. D um clique no sinal de + ao lado desta opo para abri-la. Sero exibidas todas as pastas virtuais disponveis no servidor IIS, conforme indicado na Figura 14.47.

Figura 14.47: Pastas virtuais do servidor IIS.


9. No nosso exemplo queremos configurar as propriedades da pasta virtual WebApl. Neste ponto o conceito de pasta virtual confunde-se com o de aplicao Web. Na verdade a nossa aplicao WebApl est contida na pasta Virtual WebApl.

www.juliobattisti.com.br

624

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


10. D um clique com o boto direito do mouse sobre WebApl. 11. No menu de opes que surge d um clique em Propriedades. 12. Ser exibida a janela Propriedades de WebApl, conforme indicado na Figura 8.4.

Figura 14.48: Propriedades da aplicao Web WebApl.


Observe que nesta janela temos diversas informaes, tais como: Caminho da pasta: C:\WebApl. Este o caminho fsico onde so gravados os elementos da aplicao Web. No nosso exemplo, a pasta WebApl do drive C: Permisses de acesso pasta virtual da aplicao: Observe que por padro somente so marcadas as opes Leitura, Criar log e Indexao. Nome do aplicativo: No nosso exemplo WebApl. A principal opo desta janela o boto Configurao. 13. D um clique no boto Configurao. 14. Surge a janela Configurao de aplicativo, indicada na Figura 14.49.

625

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 14.49: Configurando as propriedades da aplicao Web WebApl.


Na primeira guia Mapeamento de aplicativos, temos a indicao de qual componente do IIS ir processar cada requisio do usurio. Este mapeamento baseado na extenso do arquivo. Por exemplo, toda pgina com a extenso .aspx ser processada pela DLL aspnet_isapi.dll, conforme indicado pela Figura 14.50.

Figura 14.50: A DLL aspnet_isapi.dll responsvel pelo processamento das pginas .aspx.

www.juliobattisti.com.br

626

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


15. No iremos alterar nenhuma opo nesta guia. 16. D um clique na guia Opes de aplicativo. 17. Na segunda guia Opes de aplicativo, temos diversas configuraes importantes, conforme indicado na Figura 14.51. Estas opes afetam, principalmente, pginas ASP 3.0.

Figura 14.51: Opes da guia Opes de aplicativo.


Abaixo temos a descrio destas opes: Ativar o estado da seo: Esta caixa afeta as pginas ASP 3.0. Use essa caixa de seleo para ativar ou desativar o estado da sesso. Quando o estado da sesso ativado, o interpretador ASP cria uma sesso para cada usurio que acessa um aplicativo ASP, de modo que voc possa identificar o usurio atravs das pginas do aplicativo. Quando o estado da sesso desativado, o ASP no controla usurios e no permite que um script do ASP armazene informaes no objeto Session ou use os eventos Session.OnStart ou Session.OnEnd. Uma sesso finalizada automaticamente se o usurio no solicitou ou atualizou uma pgina em um aplicativo no fim do tempo limite TimeOut. Tempo limite da seo: No nosso exemplo est definido em 20 minutos. Uma sesso finalizada automaticamente se o usurio no solicitou ou atualizou uma pgina em um aplicativo por um tempo maior do que o tempo limite TimeOut. Ativar o Buffer: Esta opo afeta as pginas ASP 3.0. Por padro esta opo ativada no IIS 5.0. Nas verses anteriores esta propriedade era desativada por padro. Quando o Buffer est ativo, o resultado do processamento de uma pgina ASP somente enviado para o Navegador do cliente, quando toda a pgina tiver sido processada, a menos que seja utilizado o mtodo Flush do objeto Response.

627

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Ativar os caminhos Pai: Marque esta caixa de seleo para permitir que as pginas ASP usem os caminhos relativos do diretrio pai do diretrio atual (caminhos que usam a sintaxe ..), tambm conhecidos como endereos relativos. Linguagem ASP padro: Por padro definida como sendo VBScript. Caso

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.

Figura 14.52: Opes da guia Depurao de aplicativo.

www.juliobattisti.com.br

628

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


Abaixo temos a descrio destas opes, que afetam, principalmente, pginas ASP 3.0: Ativar a depurao de script ASP do lado do servidor: Marque esta opo para permitir que o servidor Web entre no Depurador de scripts da Microsoft durante o processamento de pginas ASP. Em seguida, voc pode usar o depurador para examinar seus scripts. Por questes de desempenho, a depurao do ASP no recomendada em um ambiente de produo. Ativar a depurao de script ASP do lado do cliente: Essa caixa de seleo est reservada para uso futuro e no tem efeito sobre a verso atual do ASP Esta a informao contida na prpria documentao do IIS 5.0. Enviar mensagens de erro do ASP detalhadas para o cliente: Selecione essa opo para enviar informaes especficas de depurao (incluindo o nome do arquivo, a mensagem de erro e o nmero da linha) para o navegador. Principalmente quando estamos desenvolvendo nossas aplicaes, importante que esta opo esteja selecionada, pois ao testarmos uma pgina, se a mesma contiver um erro, o Navegador informa o nmero da linha onde est o erro, o que facilita a correo do script. Enviar mensagem de erro de texto para o cliente: Selecione esta opo para enviar uma mensagem de erro padro ao navegador quando algum erro impedir o servidor Web de processar a pgina ASP. Uma mensagem de erro especfica gravada no log de erros. Voc pode alterar a mensagem de erro padro digitando uma nova mensagem na caixa de texto. No recomendada a utilizao desta opo no ambiente de desenvolvimento, pelos motivos descritos no pargrafo anterior. 21. No iremos alterar nenhuma opo nesta guia. 22. D um clique no boto OK para fechar a janela de configurao. 23. D um clique no boto OK para fechar a janela de propriedades da pasta virtual WebApl. 24. Voc estar de volta ao Gerenciador do Internet Services. 25. Feche-o. Com isso finalizamos os elementos de segurana ligados ao IIS e ao Windows 2000. Agora vamos estudar alguns aspectos de segurana, especficos das pginas ASP.NET.

Configuraes de Segurana com o Arquivo Web.Config


Podem existir reas de um site que no devam estar disponveis para o pblico em geral; em outras palavras, existem situaes em que pode ser necessrio restringir o acesso a determinadas reas de um site. Para definir tais restries temos vrios recursos, tanto do IIS, do Windows 2000 quanto do prprio ASP.NET. Neste tpico veremos algumas maneiras de restringir o acesso, utilizando um arquivo de configuraes, para aplicaes Web Web.Config. Este um arquivo que fica gravado na pasta raiz da aplicao Web e contm uma srie de diretivas. Algumas destas diretivas so utilizadas para configuraes de segurana. Vamos iniciar o nosso estudo por um importante conceito: Impersonation.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


autenticao, o IIS identifica o usurio que est fazendo a requisio. Para reas de acesso pblico utilizada a autenticao annima, onde todos os usurios so autenticados utilizando a mesma conta: IUSR_NOME_DO_COMPUTADOR. O mecanismo de Impersonation pode estar habilitado ou desabilitado. Por padro este mecanismo est desabilitado. O mecanismo de Impersonation define se a requisio do usurio ser executada utilizando a conta com a qual o usurio foi autenticado (IUSR_NOME_DO_COMPUTADOR para o caso de acesso annimo, ou uma conta do Windows 2000 para outros tipos de autenticao), ou a conta System, que uma conta local do servidor Windows 2000. Este mecanismo pode parecer sem sentido prtico, mas na verdade existe uma justificativa bastante plausvel. Como as pginas ASP.NET so compiladas e mantidas em cache, pode acontecer situaes onde o IIS precise gravar arquivos temporrios, em reas do disco nas quais a conta IUSR_NOME_DO_COMPUTADOR no tem permisses de acesso. Neste caso o IIS precisa fazer de conta que est executando como se fosse o usurio System, o qual tem permisses para as reas para criao de arquivos temporrios. Se o mecanismo de Impersonation estiver habilitado e a pgina fizer parte de uma rea do site, no qual o acesso annimo est habilitado, a requisio ser feita em nome do usurio configurado para o acesso annimo, normalmente a conta IUSR_NOME_DO_COMPUTADOR. Se o mecanismo de Impersonation estiver desabilitado (que o padro), ao invs da conta configurada para o acesso annimo, ser utilizada a conta System. Se o mecanismo de Impersonation estiver habilitado e a pgina fizer parte de uma rea na qual o acesso annimo no est habilitado, a requisio ser feita em nome do usurio que est logado no Windows. No caso de uma rede com servidores Windows 2000 e clientes Windows 9x ou Windows 2000, o usurio, provavelmente, estar logado com uma conta de um domnio do Windows 2000. O mesmo acontece para o caso de o mecanismo de Impersonation estar habilitado. Observe que a mudana de contexto (Impersonation) para a conta System somente ocorre quando o acesso for feito a reas nas quais o acesso annimo permitido. Em qualquer uma das situaes, aps assumir a identidade de um determinado usurio, quer seja a conta de acesso annimo, quer seja a conta System ou a conta com a qual o usurio est logado, ser feita uma verificao se o usurio tem permisso para os recursos que ele requisitou. Se tiver permisso a pgina compilada, executada e retornada para o cliente; caso contrrio uma mensagem de erro ser retornada. Quando falamos em permisses podem ser tanto permisses NTFS quanto as permisses configuradas no IIS, conforme descrevemos no incio do captulo.

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>

<!

DYNAMIC DEBUG COMPILATION Otherwise, setting

Set compilation debug=true to enable ASPX debugging. this value to

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 />

<!

CUSTOM ERROR MESSAGES

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


<! APPLICATION-LEVEL TRACE LOGGING

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 />

<!

SESSION STATE SETTINGS

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" />

<!

PREVENT SOURCE CODE DOWNLOAD

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

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


It is recommended that you use this section to prevent your sources being downloaded. > <httpHandlers> <add verb=* path=*.vb type=System.Web.HttpNotFoundHandler,System.Web /> <add verb=* path=*.cs type=System.Web.HttpNotFoundHandler,System.Web /> <add verb=* path=*.vbproj type=System.Web.HttpNotFoundHandler,System.Web /> <add verb=* path=*.csproj type=System.Web.HttpNotFoundHandler,System.Web /> <add verb=* path=*.webinfo type=System.Web.HttpNotFoundHandler,System.Web /> </httpHandlers>

<!

GLOBALIZATION This section sets the globalization settings of the application.

> <globalization requestEncoding=utf-8" responseEncoding=utf-8" />

</system.web> </configuration>

A estrutura bsica do arquivo Web.Config a seguinte:


<?xml version=1.0" encoding=utf-8" ?> <configuration>

<system.web> Configurao 1 Configurao 2 ... Configurao n

</system.web> </configuration>

633

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Onde temos diversos formatos para as clusulas Configurao 1, Configurao 2, ... , Configurao n. Neste tpico aprenderemos a utilizar clusulas referentes a configuraes de segurana.

Definindo o Tipo de Autenticao


Uma das configuraes que podemos definir como arquivo Web.Config o tipo de autenticao que ser utilizado pela aplicao Web. Podemos definir um dos seguintes tipos: Windows built-in authentication: ASP.NET utiliza este tipo de autenticao em conjunto com a autenticao do IIS. Primeiro a autenticao feita pelo IIS, utilizando um dos seguintes tipos: autenticao bsica, digest, ou autenticao Integrada do Windows (NTLM). Quando a autenticao do IIS finalizada ASP.NET utiliza a identidade do usurio autenticado para autorizar ou negar acesso s pginas e demais recursos da aplicao Web. Passport-based authentication: Este tipo de autenticao utiliza um servio pago, disponibilizado pela Microsoft. Com este tipo de autenticao, o usurio se identifica uma nica vez e, automaticamente, estar autenticado para todos os sites e aplicaes que utilizam a autenticao Passport-based. O inconveniente que o servio pago; maiores informaes em www.passport.com/business. Forms authentication: Quando uma requisio recebida e ainda no foi autenticada, isto , o IIS no conhece o usurio que fez a requisio, esta redirecionada para um formulrio HTML, atravs da utilizao de redireo HTTP client-side. Neste formulrio o usurio fornece um username e senha para login e envia o formulrio para o servidor, normalmente clicando em um boto Login. Se a aplicao autentica a requisio, o sistema cria um cookie que contm as credenciais necessrias autenticao do usurio. O navegador do cliente envia o cookie em todas as futuras requisies; desta forma o usurio pode continuar acessando a aplicao, sem digitar um username e senha, enquanto o cookie estiver gravado no seu computador. Para definir o tipo de autenticao, no arquivo Web.Config, utilizamos a seguinte sintaxe:
<authentication mode=[Windows/Forms/Passport/None]> outras opes de autenticao utilizadas para a aplicao </authentication>

No exemplo da Listagem 14.1, observe que foi definido o tipo None:


<authentication mode=None />

Alm disso foi utilizada a sintaxe alternativa, ou seja, ao invs do fechamento </authentication>, utilizamos simplesmente />.

Definindo os Usurios e Grupos que Tm Permisso de Acesso Aplicao


Para definir uma lista de usurios e grupos com permisso de acesso aos recursos da aplicao, utilizamos uma clusula <authorization> </authorization>, para definir uma lista de usurios ou grupos, com permisso de acesso. A sintaxe para esta clusula a seguinte:

www.juliobattisti.com.br

634

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


<authorization> <allow users=[lista de usurios, separados por vrgula] roles=[lista de grupos, separados por vrgula] verb=[GET/POST/HEAD]

/> <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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Podemos utilizar alguns caracteres especiais na lista de usurios ou grupos: * : Significa todos os usurios ou todos os grupos. ? : Significa acesso annimo. Para o caso de estarmos utilizando Windows authentication, ser interpretada como a conta configurada para o acesso annimo normalmente a conta IUSR_NOME_DO_COMPUTADOR. Somente pode ser utilizada na lista de usurios user. Vamos considerar um exemplo simples, onde permitido o acesso para trs usurios do domnio GROZA e negado o acesso para todos os demais usurios:
<authorization> <allow users=GROZA\Usurio1,GROZA\Usurio2 /> <deny users=*/>

</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

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


e negada para todos:
<deny users=*/>

Figura 14.53: Vrios arquivos Web.Config no caminho de uma aplicao.


Aqui precisamos fazer alguns comentrios para que no haja confuso entre a maneira como as permisses so aplicadas com as clusulas <allow> e <deny>, no arquivo Web.Config e a maneira como o Windows 2000 aplica permisses NTFS em pastas e arquivos. Com as permisses NTFS, negar tem precedncia sobre qualquer outra permisso. Ento, se negarmos a permisso de acesso a uma pasta ou arquivo, para o grupo Todos (Everyone no Windows 2000 em ingls), ningum ter acesso a pasta ou arquivo, independente de quantos usurios tenham permisses explcitas de acesso. Em resumo, nas permisses NTFS, negar tem precedncia sobre permitir e as permisses so cumulativas; por exemplo, se um usurio tem permisso de acesso e o grupo ao qual ele pertence tem negada a permisso de acesso, o usurio herda o negar do grupo e, como negar tem precedncia sobre permitir, o acesso ser negado. J para as configuraes do arquivo Web.Config, o comportamento um pouco diferente. Ser aplicada a permisso mais especfica, ou seja, aquela que estiver mais especificamente definida. Vamos novamente nos reportar ao exemplo anterior. Os usurios:

637

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


GROZA\Usurio1 GROZA\Usurio2

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

CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET


Observe que negamos o verbo GET para todos os usurios, de tal maneira que somente os usurios user1 e user2 tenham a permisso para utilizar GET. Para os demais usurios demos a permisso para utilizar POST. Podem existir situaes onde precisamos definir diferentes configuraes de acesso, para uma pgina ou pasta da aplicao Web. Neste caso podemos utilizar a clusula <location> </location> para especificar a qual arquivo ou pasta as configuraes devem ser aplicadas. No exemplo a seguir, aplicamos as configuraes de acesso que se aplicam somente pgina dados.aspx.
<location path=dados.aspx> <system.web> <authorization> <allow roles=GROZA\gerentes <deny </authorization> </system.web> </location> />

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Obviamente que o investimento em segurana de acesso lgico aos dados necessrio, porm o aspecto da segurana no acesso fsico igualmente importante. Pontos como estes devem ser definidos na poltica de segurana da empresa, a qual deve ser continuamente revisada para se adaptar s freqentes mudanas no mundo da tecnologia. Na parte final do captulo aprendemos a utilizar o arquivo Web.Config para definir permisses de acesso a aplicaes Web ou partes especficas da aplicao.

www.juliobattisti.com.br

640

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Para os exemplos apresentados, utilizarei diversos conceitos e tcnicas que foram apresentados nos captulos anteriores, de tal forma que no irei explic-los novamente. Caso voc tenha alguma dvida em relao aos comandos ou tcnicas utilizados consulte os captulos iniciais do livro, principalmente os Captulos 10, 11 e 12 quando tratamos do acesso a bancos de dados, utilizando as classes do ADO.NET.

Criao de Listas Dinmicas


Neste exemplo iremos construir um formulrio com trs controles do tipo DropDownList, conforme indicado a seguir: LIstaPaises: Este controle ir exibir uma lista dos pases para os quais existem pedidos, a partir da tabela Pedidos do banco de dados NorthWind.mdb. LIstaCidades: Este controle ir exibir uma lista das cidades para as quais existem pedidos, a partir da tabela Pedidos do banco de dados NorthWind.mdb. Quando a pgina carregada pela primeira vez, esta lista est vazia. Quando o usurio seleciona um pas na lista de pases, a pgina recarregada e so exibidas as cidades para o pas selecionado. LIstaPedidos: Este controle ir exibir uma lista dos pedidos para a cidade selecionada na lista de cidades. Quando a pgina carregada pela primeira vez, esta lista est vazia. Quando o usurio seleciona um pas, a pgina recarregada e so exibidas as cidades para o pas selecionado. A lista de pedidos continua vazia. Quando o usurio seleciona uma cidade, na lista de cidades, a pgina recarregada e so exibidos os pedidos para a cidade selecionada. Quando o usurio seleciona um pedido na lista, so exibidas informaes sobre o pedido. Para exibir as informaes sobre o pedido, utilizamos diversos controles do tipo TextBox. Na Listagem 15.1 temos o cdigo para o exemplo proposto. Aps a listagem apresentaremos mais alguns comentrios sobre o exemplo.

Listagem 15.1 Estrutura bsica para a criao de um Web Service.


<%@ Page Language=C# Debug=true %> <%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>

<html> <script language=C# runat=server>

// Declaro variveis que sero globais para a pgina.

OleDbDataAdapter MeuComando; String auxSQL1; String auxSQL2; String comandoSQL;

www.juliobattisti.com.br

642

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


DataSet ds = new DataSet(); OleDbConnection MinhaConexo; String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

protected void Page_Load(Object Src, EventArgs E ) { if (!Page.IsPostBack) {

OcultaControles(); String auxSQL1; String auxSQL2; String comandoSQL;

auxSQL1 = Select PasDeDestino From Pedidos; auxSQL2 = Group By PasDeDestino Order By PasDeDestino;

comandoSQL = auxSQL1+auxSQL2; MinhaConexo = new OleDbConnection(DefineConexo);

MeuComando = new OleDbDataAdapter(comandoSQL, MinhaConexo); MeuComando.Fill(ds);

DataView source = new DataView(ds.Tables[0]);

ListaPaises.DataSource = source ; ListaPaises.DataBind(); ListaPaises.Items.Insert(0,);

} }

void OcultaControles() { txtNmeroDoPedido.Visible=false;

643

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


txtCdigoDoCliente.Visible=false; txtDataDoPedido.Visible=false; txtFrete.Visible=false; txtNomeDoDestinatrio.Visible=false; txtPasDeDestino.Visible=false; txtCidadeDeDestino.Visible=false; }

void PasSelecionado(Object sender, EventArgs e) {

if (ListaPaises.SelectedItem.Value!=) { OcultaControles(); auxSQL1 = Select CidadeDeDestino From Pedidos Order By CidadeDeDestino; Where PasDeDestino=;

auxSQL2 = ListaPaises.SelectedItem.Value + Group By CidadeDeDestino

comandoSQL = auxSQL1+auxSQL2;

MinhaConexo = new OleDbConnection(DefineConexo); MeuComando = new OleDbDataAdapter(comandoSQL, MinhaConexo);

MeuComando.Fill(ds);

DataView source = new DataView(ds.Tables[0]); ListaCidades.DataSource=source; ListaCidades.DataBind(); ListaCidades.Items.Insert(0,); ListaPedidos.SelectedIndex=0; } }

void CidadeSelecionada(Object sender, EventArgs e)

www.juliobattisti.com.br

644

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


{

if (ListaCidades.SelectedItem.Value!=) { OcultaControles(); auxSQL1 = Select * From Pedidos Where CidadeDeDestino=;

auxSQL2 = ListaCidades.SelectedItem.Value + Order By NmeroDoPedido;

comandoSQL = auxSQL1+auxSQL2;

MinhaConexo = new OleDbConnection(DefineConexo); MeuComando = new OleDbDataAdapter(comandoSQL, MinhaConexo);

MeuComando.Fill(ds); DataView source = new DataView(ds.Tables[0]);

ListaPedidos.DataSource=source; ListaPedidos.DataBind(); ListaPedidos.Items.Insert(0,); }

void PedidoSelecionado(Object sender, EventArgs e) {

if (ListaCidades.SelectedItem.Value!=) { auxSQL1 = Select * From Pedidos Where NmeroDoPedido=;

auxSQL2 = ListaPedidos.SelectedItem.Value + Order By NmeroDoPedido;

comandoSQL = auxSQL1+auxSQL2;

MinhaConexo = new OleDbConnection(DefineConexo); MeuComando = new OleDbDataAdapter(comandoSQL, MinhaConexo);

MeuComando.Fill(ds);

645

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

DataView source = new DataView(ds.Tables[0]); DataTable Pedidos = ds.Tables[0];

DataRow Linha = Pedidos.Rows[0];

txtNmeroDoPedido.Visible=true; txtCdigoDoCliente.Visible=true; txtDataDoPedido.Visible=true; txtFrete.Visible=true; txtNomeDoDestinatrio.Visible=true; txtPasDeDestino.Visible=true; txtCidadeDeDestino.Visible=true;

txtNmeroDoPedido.Text txtCdigoDoCliente.Text txtDataDoPedido.Text txtFrete.Text

= Linha[NmeroDoPedido].ToString(); = Linha[CdigoDoCliente].ToString(); = Linha[DataDoPedido].ToString(); = Linha[Frete].ToString(); = Linha[NomeDoDestinatrio].ToString(); = Linha[PasDeDestino].ToString(); = Linha[CidadeDeDestino].ToString();

txtNomeDoDestinatrio.Text txtPasDeDestino.Text txtCidadeDeDestino.Text } }

</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

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


<HR>

<form runat=server>

<div align=left> <table border=0">

<tr> <td> <p align=right> <B>Selecione um Pas ->></B> </td>

<td> <asp:DropDownList id=ListaPaises runat=server BackColor=#c0c0c0" Font-Bold=True DataTextField = PasDeDestino

DataValueField = PasDeDestino AutoPostBack = True onSelectedIndexChanged = PasSelecionado > </asp:DropDownList> </td> </tr> <tr> <td> <p align=right> <B>Selecione uma Cidade ->></B> </td>

<td> <asp:DropDownList id=ListaCidades runat=server

647

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


BackColor=#c0c0c0" Font-Bold=True DataTextField = CidadeDeDestino

DataValueField = CidadeDeDestino AutoPostBack = True onSelectedIndexChanged = CidadeSelecionada > </asp:DropDownList> </td> </tr> <tr> <td> <p align=right> <B>Selecione um Pedido ->></B> </td>

<td> <asp:DropDownList id=ListaPedidos runat=server BackColor=#c0c0c0" Font-Bold=True DataTextField = NmeroDoPedido

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

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


runat=server id=txtNmeroDoPedido Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" Height=20" Width=200" Enabled=False /> </td> </tr> <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" Height=20" Width=200" Enabled=False /> </td> </tr>

<tr> <td> <p align=right> <B>Data do Pedido:</B> </td> <td> <asp:TextBox

649

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


runat=server id=txtDataDoPedido Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" Height=20" Width=200" Enabled=False /> </td> </tr>

<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

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


runat=server id=txtNomeDoDestinatrio Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" Height=20" Width=200" Enabled=False /> </td> </tr> <tr> <td> <p align=right> <B>Pas de Destino:</B> </td> <td> <asp:TextBox runat=server id=txtPasDeDestino Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" Height=20" Width=200" Enabled=False /> </td> </tr> <tr> <td> <p align=right> <B>Cidade de Destino:</B> </td> <td> <asp:TextBox runat=server

651

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


id=txtCidadeDeDestino Text= TextMode=SingleLine Font_Face=Arial Font_Size=3" Height=20" Width=200" Enabled=False /> </td> </tr>

</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

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET

Figura 15.1: Lista de pases j preenchida.

Figura 15.2: Selecionando uma cidade.

653

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Ao selecionar uma cidade na lista de cidades, ser disparado o evento onSelectedIndexChanged, do controle ListaCidades. Em resposta a este evento, configuramos o procedimento CidadeSelecionada:
onSelectedIndexChanged = CidadeSelecionada

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.

Figura 15.3: Exibindo os dados do pedido selecionado.

www.juliobattisti.com.br

654

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET

Edio de Dados com o Controle DataGrid


Nos exemplos dos captulos anteriores, utilizamos o controle DataGrid para exibir dados em uma pgina ASP.NET. Tambm podemos utilizar o controle DataGrid para fazer a edio dos dados. No exemplo que apresentaremos neste tpico, utilizaremos um controle DataGrid que acessa dados da tabela authors, do banco de dados pubs do SQL Server 2000. Veremos como permitir que os dados sejam editados e que estas edies sejam enviadas de volta para o banco de dados. Na Listagem 15.2 temos o cdigo para o exemplo proposto. Aps a listagem apresentaremos mais alguns comentrios.

Listagem 15.2 Edio de dados como DataGrid.


<%@ Page Language=C# Debug=true %> <%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.SqlClient %>

<html> <script language=C# runat=server>

void BuscaDados() {

// Crio uma conexo com o banco de dados pubs localizado no servidor local. // Vamos acessar a instncia SERVIDOR\NETSDK.

SqlConnection myConnection = new SqlConnection(server=SERVIDOR\\NETSDK; + uid=sa;pwd=;database=pubs);

// 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);

// Criamos e preenchemos um objeto DataSet.

DataSet ds = new DataSet(); myCommand.Fill(ds);

655

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


// 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.

DataView source = new DataView(ds.Tables[0]); MinhaGrade.DataSource = source ; MinhaGrade.DataBind();

} 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

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


SqlConnection myConnection = new SqlConnection(server=SERVIDOR\\NETSDK; + uid=sa;pwd=;database=pubs);

// 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);

// Criamos e preenchemos um objeto DataSet.

DataSet ds = new DataSet(); MeuDataAdapter.Fill(ds,authors);

DataView source = new DataView(ds.Tables[0]);

DataTable authors = ds.Tables[0];

// Vamos definir o campo au_id como sendo a chave // primria da tabela Autores.

authors.PrimaryKey = new DataColumn[] {authors.Columns[au_id]};

// Atribuo o valor dos campos da linha que est sendo editada, // a variveis do tipo String, pois todos os campos so do tipo String.

string txtCodAutor string txtNome

= ((TextBox)e.Item.Cells[0].Controls[0]).Text; = ((TextBox)e.Item.Cells[1].Controls[0]).Text;

string txtSobreNome = ((TextBox)e.Item.Cells[2].Controls[0]).Text; string txtTelefone = ((TextBox)e.Item.Cells[3].Controls[0]).Text;

DataRow Linha = authors.Rows.Find(txtCodAutor);

// Agora vamos editar o valor da linha.

657

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Linha.BeginEdit(); Linha[au_id] = Linha[au_fname] Linha[au_lname] Linha[phone] Linha.EndEdit(); txtCodAutor; = = = txtNome; txtSobreNome; txtTelefone;

// Agora crio os comandos necessrios para enviar // as alteraes/incluses/excluses para o banco // de dados pubs, no servidor SQL Server 2000.

// Em primeiro lugar crio um objeto do tipo SqlCommandBuilder

SqlCommandBuilder CriaComando = new SqlCommandBuilder(MeuDataAdapter);

// Agora defino a propriedade UpdateCommand do objeto MeuDataAdapter.

MeuDataAdapter.UpdateCommand= CriaComando.GetUpdateCommand();

// Chamo o mtodo Update do objeto DataAdapter.

MeuDataAdapter.Update(ds,authors);

MinhaGrade.DataSource = source ; MinhaGrade.DataBind(); }

</script>

<body>

<form runat=server>

<h3><font face=Verdana>DataGrid para edio de dados.</font></h3> <HR>

<asp:Label

www.juliobattisti.com.br

658

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


id=txtTitulo Font-Bold=True runat=server > </asp:Label>

<BR>

<asp:Label id=txtTitulo2" Font-Bold=True runat=server > </asp:Label>

<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 >

<HeaderStyle BackColor=#00aaaa Font-Bold=True Font-Name=Courier New ForeColor=White >

659

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


</HeaderStyle>

<Columns>

<asp:BoundColumn HeaderText=Cdigo DataField=au_id ItemStyle-BackColor=#c0c0c0" >

</asp:BoundColumn>

<asp:BoundColumn HeaderText=Nome DataField=au_fname ItemStyle-Font-Italic=True ItemStyle-Font-Name=Courier New >

</asp:BoundColumn>

<asp:BoundColumn HeaderText=Sobrenome DataField=au_lname ItemStyle-Font-Italic=True ItemStyle-Font-Name=Courier New >

</asp:BoundColumn>

<asp:BoundColumn HeaderText=Telefone DataField=phone ItemStyle-BackColor=#c0ffff ItemStyle-Font-Bold=True >

www.juliobattisti.com.br

660

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET

</asp:BoundColumn>

<asp:EditCommandColumn EditText=Editar CancelText=Cancelar UpdateText=Atualizar /> </Columns>

</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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 15.4: Link para colocar o DataGrid no modo de edio.

Figura 15.5: Editando dados com o controle DataGrid.

www.juliobattisti.com.br

662

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET

Figura 15.6: DataGrid no modo de visualizao.


Comentrios sobre o cdigo do exemplo. Criamos um DataGrid, onde as colunas foram definidas manualmente, utilizando as tags <columns> </columns>. Para cada campo a ser exibido criamos uma coluna do tipo BoundColumn. O nome do campo associado com a coluna definido pela propriedade DataField, como para a primeira coluna, que ir exibir dados do campo au_id:
<asp:BoundColumn HeaderText=Cdigo DataField=au_id ItemStyle-BackColor=#c0c0c0" >

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Poderamos definir uma srie de propriedades desta coluna, porm definimos apenas o texto para o link de cada um dos comandos: Editar, Cancelar e Atualizar. Na def inio do DataGrid def inimos que as colunas no sero geradas automaticamente AutoGenerateColumns=false. A parte mais importante da definio do DataGrid a especificao dos procedimentos que sero executados quando o usurio clicar nos links Editar, Atualizar e Cancelar. Isto feito atravs da definio das propriedades OnEditCommand (executado quando o usurio clica no link Editar), OnUpdateCommand (executado quando o usurio clica no link Atualizar) e OnCancelCommand (executado quando o usurio clica no link Cancelar). A seguir temos a definio do DataGrid:
<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 >

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

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


O ndice da linha onde o usurio clicou retornado pela propriedade ItemIndex do argumento e (do tipo DataGridCommandEventArgs), passado como parmetro para o procedimento. Este ndice atribudo propriedade EditItemIndex do DataGrid. O efeito prtico colocar a respectiva linha no modo de edio. Quando o usurio clica no link Cancelar, as alteraes so abandonadas, o texto dos labels atualizado e o DataGrid retirado do modo de edio e o procedimento BuscaDados chamado para reexibir os dados no DataGrid:
void CancelaAlteracoes(Object sender, DataGridCommandEventArgs e) { txtTitulo.Text=Clique em Editar para alterar os dados de uma linha!; txtTitulo2.Text=; MinhaGrade.EditItemIndex = -1; BuscaDados(); }

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;

string txtSobreNome = ((TextBox)e.Item.Cells[2].Controls[0]).Text; string txtTelefone = ((TextBox)e.Item.Cells[3].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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


e.Item.Cells[1].Controls[0] uma referncia ao segundo controle da segunda coluna da linha que est sendo editada e assim por diante. Cada controle, no nosso exemplo, um objeto do tipo TextBox. Para acessar o valor contido neste controle, utilizamos a sua propriedade Text. Finalmente chegamos seguinte concluso: e.Item.Cells[0].Controls[0].Text retorna o valor contido no primeiro (e nico) controle da primeira coluna da linha que est sendo editada. e.Item.Cells[1].Controls[0].Text retorna o valor contido no primeiro (e nico) controle da segunda coluna da linha que est sendo editada. e.Item.Cells[2].Controls[0].Text retorna o valor contido no primeiro (e nico) controle da terceira coluna da linha que est sendo editada. e.Item.Cells[3].Controls[0].Text retorna o valor contido no primeiro (e nico) controle da quarta coluna da linha que est sendo editada. Alm disso, tivemos que fazer uma converso explcita, para o tipo TextBox. Isto feito colocando-se o tipo TextBox entre parnteses na frente de cada um dos comandos. De posse destes valores, utilizamos os passos aprendidos no Captulo 12, para enviar as atualizaes para o banco de dados. Em resumo: 1. 2. 3. 4. 5. Criamos um objeto DataTable. Definimos uma chave primria para este objeto. Localizamos a linha correspondente ao cdigo do autor que est sendo editado. Atualizamos a linha no objeto DataTable. Enviamos as atualizaes para o banco de dados.

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

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET

Acessando Dados de uma Planilha do Excel


Vamos apresentar um exemplo, onde utilizaremos um controle DataGrid, para exibir dados de uma planilha do Excel: C:\Meus documentos\Clientes.xls. Esta planilha contm dados que foram importados da tabela Clientes, do banco de dados NorthWind.mdb. No importamos todas as colunas. Para simplificar o exemplo, foram importadas apenas as seguintes colunas: CdigoDoCliente NomeDaEmpresa Endereo Cidade Pas Telefone Na Listagem 15.3 temos o cdigo para o exemplo proposto. Aps a listagem apresentaremos mais alguns comentrios sobre o exemplo.

Listagem 15.3 Acessando dados de uma planilha do Microsoft Excel.


<html>

<%@ 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

OleDbDataAdapter myCommand = new OleDbDataAdapter(SELECT * FROM [Plan1$], strConn);

DataSet myDataSet = new DataSet();

667

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


myCommand.Fill(myDataSet, Clientes);

MinhaGrade.DataSource = myDataSet.Tables[0].DefaultView; MinhaGrade.DataBind(); }

</script>

<body> <B> <asp:Label id=Label1 runat=server > <HR> Dados da planilha C:\Clientes.xls <HR>

</asp:Label> </B>

<asp:DataGrid id=MinhaGrade HeaderStyle-BackColor=#c0c0c0" HeaderStyle-Font-Bold=True runat=server />

</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

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET

Figura 15.7: Acessando dados de uma planilha do Excel.


Comentrios sobre o cdigo do exemplo: Para fazer a conexo com uma planilha do Excel, utilizamos um objeto OleDbConnection; porm na definio da String de Conexo, utilizamos um atributo a mais:
string strConn; strConn = Provider=Microsoft.Jet.OLEDB.4.0; + Data Source=C:\\Meus documentos\\Clientes.xls; + Extended Properties=Excel 8.0;;

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Com este comando obteramos o resultado indicado na Figura 15.8.

Figura 15.8: Acessando apenas algumas colunas.


O restante do cdigo no tem maiores novidades. O nico detalhe diferente dos exemplos anteriores que, ao invs de criar explicitamente um objeto do tipo DataView, utilizamos a propriedade DefaultView, da primeira (e nica) tabela, da coleo de tabelas do objeto DataSet, para definir a propriedade DataSource do objeto DataGrid:
MinhaGrade.DataSource = myDataSet.Tables[0].DefaultView; MinhaGrade.DataBind();

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.

Um Conceito Importante: Code Behind


A idia bsica do conceito de Code Behind fazer a separao entre o cdigo responsvel pela lgica de processamento da pgina ASP.NET e o cdigo responsvel pela apresentao da pgina. A apresentao o que o usurio recebe de

www.juliobattisti.com.br

670

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


volta no seu navegador. Para que os resultados estejam corretos, necessrio que a lgica da pgina tenha sido implementada corretamente. Esta lgica pode ser implementada na prpria pgina, na seo de cdigo ou em um arquivo separado, quando ento estamos utilizando o conceito de Code Behind. Para ter acesso ao cdigo gravado em um arquivo separado, fazemos uma referncia ao arquivo, nas pginas onde iremos utiliz-lo. O arquivo com o cdigo responsvel pela lgica pode ser criado com qualquer linguagem habilitada ao .NET. Por exemplo, pode ser um arquivo com a extenso .vb, criado com o VB.NET ou um arquivo com a extenso .cs, criado com o C#. Na pgina, onde o arquivo .vb ou .cs deve ser utilizado, devemos incluir uma referncia ao mesmo, utilizando as clusulas Inherits e Src, na diretiva @Page, conforme exemplo a seguir:
<% @Page Language=C# Inherits=NomeDaClasse Src=Caminho para o arquivo %>

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.

Listagem 15.4 Arquivo com o cdigo de conexo.


using System; using System.Data; using System.Data.OleDb; using System.Web.UI; using System.Web.UI.WebControls;

public class Conecta : Page

// Varivel pblica que faz referncia ao controle DataGrid.

public DataGrid MinhaGrade1;

public void Page_Load(Object Src, EventArgs E )

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +

671

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


DATA SOURCE=c:\\meus documentos\\NorthWind.mdb; OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

String auxSQL1; String auxSQL2; String auxSQL3; String ComandoSQL;

auxSQL1= SELECT CdigoDoCliente,NomeDaEmpresa,Endereo,Telefone,Pas; auxSQL2= FROM Clientes Where Pas=Brasil; auxSQL3= Order By NomeDaEmpresa;

ComandoSQL= auxSQL1+auxSQL2+auxSQL3;

OleDbDataAdapter MeuComando = new OleDbDataAdapter(ComandoSQL, MinhaConexo);

DataSet ds = new DataSet(); MeuComando.Fill(ds,Clientes);

DataView source = new DataView(ds.Tables[0]);

MinhaGrade1.DataSource = source ; MinhaGrade1.DataBind();

} }

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

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


Em seguida declaramos uma varivel pblica do tipo DataGrid. A declarao desta varivel necessria para que possamos fazer a ligao dos dados do objeto DataView, criado no procedimento Page_Load, com o controle DataGrid, da pgina que ir utilizar o cdigo da classe Conecta.
public DataGrid MinhaGrade1;

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.

Listagem 15.5 Utilizando a classe Conecta.


<%@ Page Language=C# Inherits=Conecta Src=conecta.cs %>

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Digite o cdigo da Listagem 15.5 e salve o mesmo em um arquivo chamado chap15ex4.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/chap15ex4.aspx Ao carregar a pgina voc obtm o resultado indicado na Figura 15.9. Para acessarmos a classe Conecta, utilizamos a diretiva @Page, conforme indicado a seguir:
<%@ Page Language=C# Inherits=Conecta Src=conecta.cs %>

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 %>

Figura 15.9: Utilizando Code Behind.


A utilizao de Code Behind traz inmeras vantagens, dentre as quais podemos destacar: Separao entre a lgica e a apresentao da pgina.

www.juliobattisti.com.br

674

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


Reaproveitamento de cdigo, atravs do mecanismo de herana. Facilidade de manuteno. Podemos codificar uma funcionalidade, que ser utilizada por diversas pginas, em um arquivo de cdigo separado, como no nosso exemplo criamos a classe Conecta, definida no arquivo conecta.cs. Quando uma pgina ASP.NET precisa utilizar a lgica contida na classe Conecta, basta fazer referncia ao arquivo conecta.cs, utilizando a diretiva @Page, conforme exemplificado anteriormente. Quando forem necessrias alteraes na lgica da classe Conecta, basta que faamos as alteraes no arquivo conecta.cs, e todas as pginas que utilizam a classe Conecta passaro a acessar a verso modificada. Se tivssemos colocado o cdigo da classe Conecta, na seo de cdigo de cada pgina, no momento de fazer alteraes teramos que faz-las em cada uma das pginas, o que tornaria o processo de manuteno e atualizao bem mais complexo e oneroso. O mecanismo de Code Behind demonstra, mais uma vez, o fato de os conceitos de Orientao a Objetos estarem presentes em todos os aspectos do Framework .NET. A possibilidade de codificar a lgica em uma classe separada e poder utilizar esta lgica em uma ou mais pginas ASP.NET nada mais do que a implementao prtica do conceito de reaproveitamento de cdigo em aplicaes Web.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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.

Listagem 15.6 A propriedade Browser do objeto HttpRequest.


<html> <script language=C# runat=server> protected void Page_Load(Object Src, EventArgs E ) {

// Utilizo a propriedade Browser para exibir as capacidades // do navegador do cliente.

HttpBrowserCapabilities bc = Request.Browser; Response.Write(<HR>);

www.juliobattisti.com.br

676

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


Response.Write(<B>Propriedades do seu navegador.</B>); Response.Write(<HR>); Response.Write(Tipo = + bc.Type + <br>); Response.Write(Nome = + bc.Browser + <br>); Response.Write(Verso = + bc.Version + <br>); Response.Write(Maior Verso = + bc.MajorVersion + <br>); Response.Write(Menor Verso = + bc.MinorVersion + <br>); Response.Write(Plataforma = + bc.Platform + <br>); Response.Write( verso Beta ? + bc.Beta + <br>); Response.Write( Crawler = + bc.Crawler + <br>); Response.Write( AOL = + bc.AOL + <br>); Response.Write( Win16 = + bc.Win16 + <br>); Response.Write( Win32 = + bc.Win32 + <br>); Response.Write(Suporta Frames = + bc.Frames + <br>); Response.Write(Suporta Tabelas = + bc.Tables + <br>); Response.Write(Suporta Cookies = + bc.Cookies + <br>); Response.Write(Suporta VB Script = + bc.VBScript + <br>); Response.Write(Suporta JavaScript = + bc.JavaScript + <br>); Response.Write(Suporta Applets Java = + bc.JavaApplets + <br>); Response.Write(Suporta ActiveX Controls = + bc.ActiveXControls + <br>); Response.Write(CDF = + bc.CDF + <br>); Response.Write(<HR>);

</script> <body> </body> </html>

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura 15.10: A propriedade Browser do objeto HttpRequest.


Utilizamos o evento PageLoad da pgina, onde criamos um objeto do tipo HttpBrowserCapabilities. Para criar este objeto utilizamos a propriedade Browser do objeto Request:
HttpBrowserCapabilities bc = Request.Browser;

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.

Listagem 15.7 Outras propriedades do objeto HttpRequest.


<html> <script language=C# runat=server> protected void Page_Load(Object Src, EventArgs E ) {

www.juliobattisti.com.br

678

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


// Utilizo a propriedade Browser para exibir as capacidades // do navegador do cliente.

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 Caminho; Caminho = Request.Path; Response.Write(<HR>); Response.Write(Propriedade Path = + Caminho + <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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


FisicalCaminho = Request.PhysicalPath; Response.Write(<HR>); Response.Write(Propriedade PhysicalPath = + FisicalCaminho + <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.

Figura 15.11: Outras propriedades do objeto HttpRequest.


Utilizamos o evento PageLoad da pgina, onde exibimos informaes sobre o certificado de segurana do cliente e informaes sobre as diversas variveis Path do objeto HttpRequest.

www.juliobattisti.com.br

680

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


Tambm exibimos informaes sobre o endereo IP do cliente. Como estou utilizando o endereo http://localhost, observe que est sendo retornado o IP 127.0.0.1, que o IP associado com o nome local localhost.

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

Cache Cookies Write

681

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


Language: Utilizada para definir a linguagem que ser utilizada na pgina. Na prtica define qual o compilador que deve ser utilizado para compilar a pgina. Se no utilizarmos esta diretiva, ser utilizada a linguagem VB.NET. <%@ Page Language=C# %> Src: Informa o caminho para o arquivo contendo o cdigo da classe especificada no atributo Inherits. Para maiores detalhes consulte o tpico Um conceito importante: Code Behind, neste captulo.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


work .NET no seguinte tpico: .NET Framework Reference -> ASP.NET Syntax -> Web Forms Syntax -> Directive Syntax.

Configuraes de Segurana Atravs de Programao


Em determinadas situaes pode ser necessrio detectar, no prprio cdigo da pgina ASP.NET, qual o nome do usurio autenticado e a quais grupos ele pertence. Uma vez sabendo o nome do usurio podemos liberar ou negar o acesso a determinados recursos. Outra aplicao prtica seria a criao de contedos personalizados para diferentes grupos de usurios. Neste tpico apresentaremos um exemplo de contedo personalizado, onde diferentes colunas da tabela Clientes sero exibidas, dependendo do grupo ao qual pertence o usurio que estiver acessando a pgina. Os objetos e mtodos que veremos neste tpico so utilizados com a autenticao do tipo Windows, a qual normalmente utilizada em ambientes de Intranet ou Extranet. Neste caso cada usurio cadastrado e faz o logon com a sua conta de usurio. O usurio pode pertencer a um ou mais grupos. Para o exemplo que apresentaremos neste captulo utilizaremos os seguintes usurios: GROZA\suers1 GROZA\suers2 GROZA\suers2 Observe que estamos trabalhando em um domnio chamado GROZA. Substitua GROZA pelo nome do domnio que voc est utilizando. Tambm iremos considerar dois grupos: Gerentes GROZA\suser1 GROZA\suser2 Funcionarios GROZA\user2 GROZA\user3 Podemos notar que o usurio suser2 pertence aos dois grupos.

NOTA: Para maiores informaes sobre a criao de usurios, criao de grupos e adio de usurios a grupos, consulte o Anexo I.

Acessando Informaes Sobre o Usurio Autenticado


Quando utilizamos autenticao do tipo Windows (descrita no Captulo 14), temos acesso a um objeto chamado User, o qual acessado atravs da propriedade User, do objeto HttpContext. A classe HttpContext contm todas as informaes sobre a requisio feita pelo navegador do cliente. Uma das informaes contidas na requisio o nome do usurio, senha e domnio, para o caso da autenticao Windows. Informaes estas que podem ser acessadas no cdigo de uma pgina ASP.NET. A classe HttpContext pertence ao namespace System.Web. A propriedade User, da classe HttpContext, retorna diversas informaes de segurana sobre a requisio enviada pelo navegador do cliente.

www.juliobattisti.com.br

684

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


A propriedade User retorna um objeto do tipo IPrincipal, derivado da classe IPrincipal, do namespace System.Security.Principal. A principal propriedade da classe IPrincipal a propriedade IDentity, a qual uma instncia da classe IDentity, do namespace System.Security.Principal. Atravs das propriedades da classe IDentity que temos acesso s informaes do usurio que fez a requisio. Esta classe fornece uma srie de propriedades, conforme indicado na Tabela 15.3. Na Tabela 15.3, temos uma descrio das principais propriedades da classe IDentity.

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:

Listagem 15.8 Configurando o tipo de autenticao Web.Config.


<?xml version=1.0" encoding=utf-8" ?> <configuration> <system.web> <authentication mode=Windows />

<authorization> <allow roles=GROZA\Gerentes,GROZA\Funcionrios users=GROZA\suser1,GROZA\suser2,GROZA\suser3"/> <deny users=* /> </authorization>

</system.web> </configuration>

685

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Ao tentar acessar uma pgina da aplicao Web Chap15, o usurio receber uma tela de logon conforme indicado na Figura 15.12.

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.

Figura 15.13: Trs tentativas de logon sem sucesso.

www.juliobattisti.com.br

686

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


Se voc clicar no boto Cancelar, na tela de logon, tambm ser emitida a mensagem da Figura 15.1. Conforme configurado no nosso arquivo Web.Config, somente os usurios suser1, suser2 e suser3,do domnio GROZA e os participantes dos grupos Gerentes ou os participantes do grupo Funcionrios tm permisso para acessar as pginas da aplicao Web Chap15. Agora vamos tentar fazer o logon como um dos usurios que tm permisso de acesso. Vou utilizar o usurio suser1, o qual cadastrei com a senha: abc12345. Vou tentar acessar a pgina Chap15ex7.aspx, criada anteriormente. Ao acessar esta pgina ser exibida a tela de logon. Digite as informaes de logon indicadas na Figura 15.14 (senha=abc12345).

Figura 15.14: Usurio com permisses de acesso.


Neste caso o acesso pgina ser liberado sem maiores problemas. Exemplo: Agora vamos a um exemplo mais completo. Criaremos um exemplo chamado Chap15ex8.aspx. Neste exemplo utilizaremos o objeto Identity e o mtodo IsInRole, para determinar se o usurio pertence ao grupo Gerentes ou ao grupo Funcionrios. Dependendo do grupo ao qual pertencer o usurio sero exibidas diferentes verses da pgina.

Listagem 15.9 Configuraes de segurana com o cdigo ASP.NET.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.OleDb %>

<html>

<script language=C# runat=server>

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


tring NomeDoUsuario = User.Identity.Name; = User.Identity.AuthenticationType;

tring TipoDeAutenticacao

/ Verifico se o usurio pertence ao grupo Gerentes.

f (User.IsInRole(GROZA\\Gerentes)) { MostraNome.Text vindo!; MostraTipo.Text = Voc est autenticado usando: + TipoDeAutenticacao; = Sr. Gerente: + NomeDoUsuario + , seja bem

Mensagem.Text = INFORMAES SOBRE CLIENTES!;

String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; + DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;

OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);

OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT CdigoDoCliente, + NomeDaEmpresa,Pas,Cidade FROM Clientes, MinhaConexo);

DataSet ds = new DataSet(); MeuComando.Fill(ds); DataView source = new DataView(ds.Tables[0]);

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

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


<asp:Label id=MostraNome Text= Font-Bold=True BackColor=#c0c0c0" runat=server />

<BR>

<asp:Label id=MostraTipo Text= Font-Bold=True BackColor=#000000" ForeColor=#ffffff runat=server />

<BR>

<asp:Label id=Mensagem Text= Font-Bold=True BackColor=#c0c0c0" runat=server />

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Font-Size=8pt HeaderStyle-BackColor=#aaaadd MaintainState=false />

</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.

Figura 15.15: Usurio suser2, pertencente ao grupo Gerentes.

www.juliobattisti.com.br

690

CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET


Para garantir que a pgina de logon seja solicitada novamente, feche o navegador, faa o logoff do sistema operacional (Iniciar -> Desligar -> Efetuar o logoff de...). Faa o logon como administrador e acesse a pgina Chap15ex8.aspx. Na tela de logon digite as seguintes informaes:
Nome do usurio: Senha: abc12345 suser3

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))

O restante do cdigo dispensa maiores comentrios.

Figura 15.16: Usurio suser3 no pertence ao grupo 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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Iniciamos o captulo com os seguintes exemplos prticos: Como limitar o controle de uma lista, com base no valor selecionado em outra lista. Utilizando o controle DataGrid para editar dados. Um exemplo prtico, no qual estaremos exibindo em uma pgina ASP.NET, dados de uma planilha do Excel. Em seguida apresentamos 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. Com o uso de Code Behind podemos colocar os mecanismos de herana e reaproveitamento de cdigo em prtica. Seguindo na apresentao da nossa Caixa de Ferramentas, falamos 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. Depois tratamos 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. A assunto final foi sobre as configuraes de segurana atravs da utilizao de cdigo. Com este captulo encerramos a nossa longa jornada, em busca do aprendizado do ASP.NET. A seguir coloco alguns Anexos que apresentam conceitos bsicos, utilizados nos captulos do livro. Recomendo que voc leia os anexos sobre assuntos nos quais no se sente confiante. Para referncia segue o contedo de cada anexo: Anexo I Tags bsicas do HTML, utilizadas nos exemplos do livro. Criao de contas de usurios e grupos de usurios no Windows 2000. Anexo II O Modelo Relacional de Dados. Anexo III A linguagem SQL. Anexo IV Fontes adicionais de informao sobre ASP.NET, na Internet.

www.juliobattisti.com.br

692

CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


funcionamento o tratamento de erros em pginas ASP.NET. Apresentaremos exemplos onde so tratadas excees genricas e tambm excees especficas, tais como uma tentativa de conexo com um servidor SQL Server 2000 que no existe. Para o desenvolvimento de Sites e Aplicaes Web profissionais, baseadas no Framework .NET, mais especificamente na tecnologia de pginas ASP.NET, o correto tratamento de erros e excees um tpico fundamental. Muitas vezes, devido a prazos esgotados e presses pela entrega de um aplicativo, o tratamento de erros negligenciado, o que resulta em programas, no mnimo, deselegantes e instveis, os quais no atendem as necessidades dos usurios.

Tratamento de Erros no Framework .NET


O to sonhado Aplicativo Livre de Erros ainda um sonho distante. Aplicaes so projetadas, concebidas, implementadas, testadas, distribudas e utilizadas por seres humanos. Seres humanos no so perfeitos, cometem erros, de forma que mais do que natural que, por maiores que sejam os cuidados, os aplicativos contenham erros. Determinados erros so possveis de serem tratados. Tratar um erro significa fazer com que um aplicativo ou pgina ASP.NET comporte-se de uma maneira elegante quando o erro ocorrer. O exemplo clssico o erro que gerado quando mandamos o aplicativo ler um arquivo no disquete, porm no colocamos um disquete no drive. Uma maneira deselegante do programa comportar-se seria simplesmente emitir uma mensagem de erro e encerrar o aplicativo. Uma maneira mais elegante seria detectar que ocorreu um erro e, pelo cdigo do erro, informar que deve ser inserido um drive no disquete. O usurio coloca o disquete no drive e clica em um boto OK e pronto, o erro foi contornado sem maiores traumas. Com ASP.NET tivemos muitas melhorias no tratamento de erros, em relao s verses

NOTA: Para maiores informaes sobre as estruturas Try...Catch...Finally, consulte o Captulo 5.

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.

Excees e a Classe Exception


Quando uma exceo gerada devido a um erro em um programa ou em uma pgina ASP.NET, um objeto derivado da classe Exception criado. Atravs das propriedades da classe Exception, podemos acessar uma srie de informaes sobre a origem do erro que gerou a exceo.

www.juliobattisti.com.br

694

CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO


A classe Exception faz parte do namespace System System.Exception. Esta classe a classe base, da qual so derivadas todas as outras classes que fazem o tratamento de excees. Uma exceo uma resposta do sistema a ocorrncias de condies anormais geradas devido a erros, durante o processamento de um programa ou pgina ASP.NET. O CLR (Common Language Runtime) nos fornece um modelo para o tratamento de excees. Este modelo baseado na criao de objetos de exceo baseados na classe Exception ou nas classes derivadas de Exception. Outro princpio bsico do modelo de tratamento de excees do CLR a separao entre o cdigo que contm a lgica do programa e o cdigo para o tratamento de excees, atravs da utilizao das estruturas try...catch...finally, descritas e exemplificadas no Captulo 5. Quando uma exceo ocorre em um bloco try, o controle de execuo passado para o bloco catch correspondente, para que seja feito o tratamento da exceo. Se o caminho de execuo possui vrios mtodos, cada um chamando o outro em seqncia, a exceo ser repassada at que o CLR encontre um tratamento para a exceo. Se nenhum dos mtodos chamados contiver um tratamento para a exceo, o tratador default ser chamado pelo CLR para exibir o nome da exceo, uma mensagem de erro e informaes sobre o mtodo onde a exceo foi gerada. Temos duas categorias de excees baseadas na classe Exception: SystemException: So classes de excees predefinidas, baseadas na classe SystemException. ApplicationException: So excees em nvel de aplicao, que so definidas pelos usurios, sendo baseadas na classe ApplicationException. Diversas informaes sobre uma exceo podem ser obtidas a partir das propriedades da classe na qual se baseia o objeto de exceo que foi criado. Normalmente este objeto baseado na classe Exception. Na Tabela 16.1 temos a descrio das principais propriedades da classe Exception.

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.

MessageProperty TargetSite ToString

695

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

NOTA: Veremos exemplos dos usos destas propriedades nos exemplos prticos, mais adiante neste captulo.

Revisando as Estruturas Try...Catch...Finally


A seguir coloco, resumidamente, o funcionamento e exemplos dos comandos Try...Catch...Finally, utilizados para o tratamento estruturado 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 este 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. 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#.

Utilizando try e catch


Para definir o tratamento de excees em nossos programas precisamos organizar os cdigos em um bloco try e um bloco catch. Dentro do bloco try colocamos o cdigo que pode gerar uma exceo por exemplo os comandos que faro a leitura de um arquivo no disquete pois, se o disquete no estiver no drive, ser gerada uma exceo. O cdigo para o tratamento da exceo colocado dentro do bloco catch. Vamos apresentar um exemplo onde utilizamos try e catch para fazer o tratamento de excees. O nosso programa solicita que o usurio digite dois nmeros. Depois o programa faz a diviso dos nmeros e exibe o resultado. Para forar uma exceo vamos fornecer um valor zero para o segundo nmero, de tal forma que o programa, ao tentar fazer uma diviso por zero, ir gerar uma exceo. Considere o exemplo da Listagem 16.1.

Listagem 16.1 Tratamento de excees com try e catch ex1cap16.cs


using System;

class ex1cap16

www.juliobattisti.com.br

696

CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO


{ // Exemplo 1 - Captulo 16. // Tratamento de excees com try e catch. // Por: Jlio Battisti // MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA

public static void Main() {

// Incio do bloco try. // Contm o cdigo que pode gerar a exceo. try

{ // Declarao das variveis.

int divisao;

// Entrada dos valores de x e y

Console.Write(Digite o NUMERADOR ->); String Aux1=Console.ReadLine();

Console.Write(Digite o DENOMINADOR ->); String Aux2=Console.ReadLine();

// Clculo da diviso. divisao = Convert.ToInt32(Aux1) / Convert.ToInt32(Aux2);

// 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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


catch (Exception e)

{ Console.WriteLine(FOI GERADA A SEGUINTE EXCEO: + e.Message); }

// Final do bloco catch. } }

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.

Figura 16.1 Executando, sem excees, o programa ex1cap16.exe.


Observe que o programa executa normalmente. Agora vamos forar uma exceo, e para isso digitaremos 0 para o segundo valor, forando uma diviso por zero. Vamos executar novamente o programa. Digite 10 para o primeiro valor e 0 para o segundo. Voc obter os resultados indicados na Figura 16.2. Neste segundo caso, ao tentar fazer uma diviso por zero, uma exceo ser gerada. Ao ser gerada a execuo o cdigo do bloco catch ser executado. O bloco catch recebe um parmetro do tipo Exception. Exception uma classe do namespace System System.Exception, conforme descrito anteriormente. Uma das propriedades desta classe Message, a qual contm a mensagem associada com a exceo, conforme descrito na Tabela 16.1. No nosso exemplo a mensagem : Attempted to divide by zero, o que confirma a nossa tentativa de fazer uma diviso por zero.

www.juliobattisti.com.br

698

CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO

Figura 16.2 Executando, forando uma exceo, o programa ex1cap16.exe.


Existem classes que tratam excees mais especficas, como por exemplo:
System.OutOfMemoryException System.OverFlowException System.NullReferenceException System.NotSupportedException System.NotImplementedException System.NotFiniteNumberException System.MissingMethodException System.MissingMemberException System.MissingFieldException System.MethodAccessException System.MemberAccessException System.InvalidProgramException System.InvalidOperationException System.InvalidCastException System.IndexOutOfRangeException System.FormatException System.FieldAccessException System.ExecutionEngineException System.EntryPointNotFoundException System.DuplicateWaitObjectException System.DllNotFoundException System.DivideByZeroException

699

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Utilizando try e finally


Em algumas situaes podemos querer que um determinado bloco de cdigo seja executado, mesmo que no tenha sido gerada nenhuma exceo. Para que isso seja possvel podemos utilizar finally ao invs de catch ou em conjunto com catch; desta forma se ocorrer a exceo, o bloco catch ser executado e o bloco finally ser sempre executado, quer tenha ocorrido ou no uma exceo. O cdigo dentro do bloco finally sempre executado, mesmo que no tenha sido gerada nenhuma exceo. Vamos modificar um pouco o exemplo anterior. Considere o exemplo da Listagem 16.2

Listagem 16.2 Tratamento de excees com try e finally ex2cap16.cs


using System;

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

// Declarao das variveis.

int divisao;

// Entrada dos valores de x e y

Console.Write(Digite o NUMERADOR ->); String Aux1=Console.ReadLine();

Console.Write(Digite o DENOMINADOR ->); String Aux2=Console.ReadLine();

www.juliobattisti.com.br

700

CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO


// Clculo da diviso.

divisao = Convert.ToInt32(Aux1) / Convert.ToInt32(Aux2);

// Exibio dos resultados.

Console.WriteLine(O valor da DIVISO } // Final do bloco try. // Incio do bloco finally.

-> {0},divisao);

// Cdigo que ser executado mesmo que nenhuma exceo // seja gerada no bloco try.

finally

{ Console.WriteLine(CDIGO EXECUTADO TENHA OU NO SIDO GERADA UMA EXCEO); }

// Final do bloco 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.

Figura 16.3 Executando, sem excees, o programa ex2cap16.exe.

701

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Agora vamos forar uma exceo; para isso digitaremos 0 para o segundo valor, forando uma diviso por zero. Vamos executar novamente o programa. Digite 10 para o primeiro valor e 0 para o segundo. Na Figura 16.4 aberta uma janela indicando que ocorreu uma exceo no programa. Esta janela aberta porque no temos um bloco catch para fazer o tratamento da exceo.

Figura 16.4 Aviso de que uma exceo foi gerada.


Neste caso, como no havia um bloco catch, a exceo no foi tratada. Por isso que surgiu a janela indicada na Figura 16.4. D um clique em OK para fechar a janela de aviso e observe que o cdigo do bloco finally foi executado, mesmo tendo sido gerada uma exceo, conforme indicado pela Figura 16.5:

Figura 16.5 O cdigo do bloco finally sempre executado.


Com essa breve reviso (os comandos Try...Catch...Finally foram detalhadamente explicados no Captulo 5), podemos apresentar alguns exemplos de tratamento de excees em pginas ASP.NET.

www.juliobattisti.com.br

702

CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO

Mltiplos Blocos Catch e Tratamento de Excees Especficas


Para um bloco Try, podemos ter mltiplos blocos Catch. Por exemplo, se em uma pgina ASP.NET prevemos a possibilidade de serem gerados trs diferentes tipos de excees, podemos criar um bloco Try, com trs blocos Catch, um para tratar cada um dos tipos de excees previstos. Por exemplo, podemos criar um bloco Catch para tratar uma exceo do tipo System.OutOfMemoryException, um para tratar uma exceo do tipo System.OverFlowException e uma Terceira para tratar uma exceo do tipo System.NullReferenceException. Alm dos blocos para tratar excees especficas, podemos e devemos colocar um bloco Catch, bem no final, para tratar exceo genrica System.Exception. Desta forma no corremos o risco de termos uma exceo no tratada, a qual far com que a pgina deixe de ser carregada ou que o programa termine de maneira inesperada. Considere o exemplo genrico da Listagem 16.3:

Listagem 16.3 Mltiplos blocos Catch.


try Comando 1 Comando 2 ... Comando n

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 uma exceo do tipo OutOfMemoryException.

catch Exceo1 As OutOfMemoryException Comando 1 Comando 2 ... Comando n

// Bloco Catch para tratar uma exceo do tipo FileNotFoundException.

catch Exceo2 As FileNotFoundException Comando 1 Comando 2 ... Comando n

// Bloco Catch para tratar qualquer tipo de exceo, ou seja, uma exceo Genrica.

703

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


// Este bloco tratar qualquer exceo que ocorra neste programa, com exceo das // Excees dos tipos: OutOfMemoryException e FileNotFoundException, j tratadas // nos blocos Catch anteriormente.

catch ExceoGenrica As Exception Comando 1 Comando 2 ... Comando n

Um Exemplo de Tratamento de Exceo do Tipo SqlException


Vamos apresentar uma pgina ASP.NET onde tentamos fazer uma conexo com um servidor SQL Server 2000 que no existe. Esta tentativa ir gerar uma exceo do tipo SqlException, derivada da classe System.Data.SqlClient.SqlException. Iremos criar um bloco Try com dois blocos Catch: Um para tratar a exceo especfica, do tipo SqlException, e outro para tratar uma exceo genrica, do tipo Exception. O exemplo proposto est demonstrado na Listagem 16.4.

Listagem 16.4 Usando Try...Catch...Finally em um pgina ASP.NET.


<%@ Import Namespace=System.Data %> <%@ Import Namespace=System.Data.SqlClient %>

<html>

<script language=C# runat=server>

protected void Page_Load(Object Src, EventArgs E ) {

//Incio do bloco Try.

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

CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO


// a qual ser tratada em um bloco Catch especfico para o tratamento desta exceo.

String strCon = server=SERVIDORXYZ\\NETSDK;uid=sa;pwd=;database=pubs; SqlConnection MinhaConexo = new SqlConnection(strCon); MinhaConexo.Open();

// Declaro uma varivel do tipo String: auxPropriedades. // A varivel auxPropriedades ir conter o valor das propriedades // da conexo minhaConexo.

String auxPropriedades; auxPropriedades = Propriedades da conexo:;

auxPropriedades = auxPropriedades + \n\n + ConnectionString: + MinhaConexo.ConnectionString.ToString();

auxPropriedades = auxPropriedades + \n\n + Database: + MinhaConexo.Database.ToString();

auxPropriedades = auxPropriedades + \n\n + DataSource: + MinhaConexo.DataSource.ToString();

auxPropriedades = auxPropriedades + \n\n + State: + MinhaConexo.State.ToString();

ExibePropriedades.Font.Bold=true; ExibePropriedades.Text=auxPropriedades;

// Final do Bloco Try. }

// Incio do bloco Catch para tratamento da exceo do tipo SqlException.

catch (SqlException SqlEx) {

705

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Response.Write(<b> Iniciando o tratamento da exceo do tipo SqlException</ B><br>); Response.Write(SqlEx.ToString() + <p>);

// Corrijo o nome do Servidor SQL Server e estabeleo a conexo corretamente.

String strCon = server=SERVIDOR\\NETSDK;uid=sa;pwd=;database=pubs; SqlConnection MinhaConexo = new SqlConnection(strCon);

MinhaConexo.Open();

// Declaro uma varivel do tipo String: auxPropriedades. // A varivel auxPropriedades ir conter o valor das propriedades // da conexo minhaConexo.

String auxPropriedades; auxPropriedades = Propriedades da conexo:;

auxPropriedades = auxPropriedades + \n\n + ConnectionString: + MinhaConexo.ConnectionString.ToString();

auxPropriedades = auxPropriedades + \n\n + Database: + MinhaConexo.Database.ToString();

auxPropriedades = auxPropriedades + \n\n + DataSource: + MinhaConexo.DataSource.ToString();

auxPropriedades = auxPropriedades + \n\n + State: + MinhaConexo.State.ToString();

ExibePropriedades.Font.Bold=true; ExibePropriedades.Text=auxPropriedades;

// Final do Bloco Catch para tratamento da exceo do tipo SqlException. }

// Incio do bloco Catch para tratamento da exceo do tipo Exception.

www.juliobattisti.com.br

706

CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO


catch (Exception ex) {

Response.Write(Tratando uma exceo genrica<p>); }

// Bloco Finally. sempre executado, mesmo que nenhuma exceo tenha sido gerada.

finally {

Response.Write(<b>Cdigo do bloco Finally sendo executado !!!</b><p>);

</script>

<body> <h3><font face=Verdana>Classe SqlConnection!!!</font></h3>

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Digite o cdigo da Listagem 16.4 e salve-o em um arquivo chamado chap16ex1.aspx, na pasta chap16, 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/chap16/chap16ex1.aspx

Ao carregar a pgina voc ir obter uma pgina semelhante pgina indicada na Figura 16.6.

Figura 16.6 Tratamento de Excees em uma pgina ASP.NET.


Comentrios sobre o cdigo do exemplo Chap16Ex1.aspx. No bloco Try tentamos fazer a conexo com um servidor SQL Server 2000 que no existe:
String strCon = server=SERVIDORXYZ\\NETSDK;uid=sa;pwd=;database=pubs; SqlConnection MinhaConexo = new SqlConnection(strCon);

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

CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO


No primeiro bloco Catch retornamos as seguintes mensagens: 1. 2. Iniciando o tratamento da exceo do tipo SqlException. System.Data.SqlClient.SqlException: SQL Server does not exist or access denied. at System.Data.SqlClient. SqlConnection.Open( ) at ASP.chap16ex1_aspx.Page_Load(Object Src, EventArgs E). A primeira mensagem simplesmente um texto retornado por um comando Response.Write. A segunda mensagem retornada a partir do mtodo ToString do objeto SqlEx (que do tipo SqlException). O mtodo ToString simplesmente retorna um texto descritivo da exceo. A seguir temos o comando que retorna esta mensagem:
Response.Write(SqlEx.ToString() + <p>);

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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

Um Passeio Pelo HTML


Conforme vimos neste livro, o ASP.NET fornece um conjunto bastante completo de controles. Os chamados Server Controls possuem uma rica funcionalidade. Porm, mesmo com todo o poder do ASP.NET, importante conhecermos as principais tags HTML. Neste anexo veremos a sintaxe para as tags que utilizamos nos exemplos deste livro. Nas Listagem I.1a e I.1b temos a estrutura bsica de uma pgina ASP.NET.

1
Principais Tags do HTML e Criao de Contas e Grupos no Windows 2000

Listagem I.1a A estrutura bsica de uma pgina ASP.NET com VB.NET.


<html> <script language=VB runat=server> comando1 comando2 ... comandon </script>

<body> controles e demais elementos da interface - Server controls - Web Forms - etc </body> </html>

Listagem I.1b A estrutura bsica de uma pgina ASP.NET com C#.


<html> <script language=C# runat=server>

www.juliobattisti.com.br

710

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000


comando1 comando2 ... comandon </script>

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Neste Anexo iremos apresentar e exemplificar as tags mais utilizadas. Para uma referncia completa da linguagem HTML, voc pode consultar o site: www.w3.org. Outros endereos teis: www.wdvl.com www.internet.com www.htmlgoodies.com

Criao de Contas de Usurios e Grupos no Windows 2000


Quando falamos sobre segurana nos Captulos 14 e 15, aprendemos a configurar as permisses de acesso em nvel de usurio. Cada usurio, no Windows 2000, identificado com base na conta que ele utiliza para fazer o logon. Na segunda parte deste anexo falaremos um pouco mais sobre o conceito de contas de usurios, como criar contas. Tambm falaremos sobre o conceito de grupos, como criar grupos e incluir usurios em um ou mais grupos.

A Estrutura Bsica de uma Pgina HTML


Toda pgina HTML possui uma estrutura bsica, bem definida, conforme indicado na Listagem I.2:

Listagem I.2 A estrutura bsica de uma pgina HTML.


<HTML> <HEAD> <TITLE>Ttulo que aparece na Barra de Ttulos do navegador do Cliente !!</TITLE> </HEAD> <BODY> tag HTML tag HTML ... tag HTML </BODY> </HTML>

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

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000


<BODY>...</BODY>: Estas tags definem o corpo da pgina, onde so colocados os elementos que o navegador interpreta e exibe para o usurio. Nesta seo fica o contedo principal do documento. Podemos definir uma cor de segundo plano para a pgina, utilizando o atributo bgcolor, para a tag body, conforme o exemplo a seguir:
<body bgcolor=#808000">

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>

Relao das Principais Tags do HTML Utilizadas nos Exemplos do Livro


Neste tpico apresentaremos uma relao das tags mais utilizadas. So tags para pequenos ajustes na pgina, tais como inserir uma quebra de linha, colocar um texto em negrito, criar uma tabela, etc.

As Tags Para Criao de Ttulos


Existe uma srie de tags para a criao de ttulos. Estas tags possuem tamanhos e formataes variados. A seguir temos o exemplo de uma destas tags:
<H3> Texto do ttulo </H3>

Na Listagem I.3 temos um exemplo onde so utilizadas as diversas tags de ttulos disponvies.

Listagem I.3 Inserindo ttulos na pgina.


<html> <head> <title>Exemplo de ttulos !!</title> </head> <body>

<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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Na Figura I.1 temos o resultado desta pgina.

Figura I.1: Diferentes formatos para o ttulo da pgina.

Tags Para a Criao de Tabelas


Em diversos exemplos deste livro utilizamos tabelas para facilitar o alinhamento dos controles de um formulrio. Para entender facilmente as tags para a criao de tabela, basta pensarmos na tabela como uma coleo de linhas e em cada linha como uma coleo de clulas. Para criar uma tabela utilizamos a tag:
<table> </table>

Para criarmos uma linha, utilizamos as tags <hr></hr>:


<table> <tr> </tr>

<tr> </tr> <tr> </tr> </table>

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

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000


e duas colunas. Para adicionar clulas a uma linha, utilizamos as tags <td>/<td>. Entre estas duas tags colocamos o contedo da clula. Observe o exemplo da Listagem I.4.

Listagem I.4 Criando uma tabela simples.


<html>

<head> <title>Exemplo de criao de tabela.</title> </head>

<body> <table border=1"> <tr> <td>Linha 1, Coluna 1</td> <td>Linha 1, Coluna 2</td> </tr>

<tr> <td>Linha 2, Coluna 1</td> <td>Linha 2, 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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura I.2: Tabela criada com HTML.


Mesmo que o usurio maximize, restaure ou redimensione a janela, o navegador ir manter as propores especificadas nesta tag. Para definir uma cor de fundo para a tabela, utilizamos o atributo bgcolor, conforme exemplo a seguir:
<table border=1" bgcolor=#c0c0c0">

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>

Podemos mesclar clulas utilizando os atributos:


colspan=nmero de colunas a ser mescladas

rowspan=nmero de linhas a ser mescladas

Observe o exemplo da Listagem I.5.

Listagem I.5 Mesclando linhas e colunas.


<html>

<head> <title>Mesclando linhas e colunas!</title> </head>

<body>

<table border=1"> <tr> <td colspan=2">Mesclando duas colunas</td> </tr>

<tr>

www.juliobattisti.com.br

716

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000


<td>Linha 2, Coluna 1</td> <td rowspan=2">Meslando duas linhas</td> </tr>

<tr> <td>Linha 3, Coluna 1</td> </tr>

</table> </body> </html>

Na Figura I.3 temos o resultado desta pgina.

Figura I.3: Mesclando linhas e colunas.

Inserindo uma Linha Horizontal


Tambm utilizamos, em diversos exemplos, a tag <HR>. Esta tag insere uma linha horizontal na pgina. Existem alguns atributos que podem ser utilizados para definir o formato da linha:
<hr align=left size=5" color=#FF0000">

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.

Tags Para Formatao Bsica do Texto


Existe um conjunto de tags que permite a definio de efeitos como negrito, itlico e sublinhado. No exemplo da Listagem I.6 utilizamos diversas tags para formatao de texto.

Listagem I.6 Formatao de texto com o HTML.


<html>

<head>

717

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


<title>Tags para formatao de texto</title> </head>

<body>

<h2>Formatao de texto:</h2>

<p><B>Este texto em negrito</strong></B>

<p><I>Este texto em itlico</I></p>

<p><U>Este texo sublinhado</U></p>

<p><B><I>Este texto em negrito e itlico</B></I></p>

</body> </html>

Na Figura I.4 temos o resultado desta pgina.

Figura I.4: Formatao bsica de texto.


Utilizamos as seguintes tags: <B></B>: Negrito <I></I>: Itlico <U></U>: Sublinhado

www.juliobattisti.com.br

718

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000


Observe que possvel combinar duas ou mais tags para aplicar mltiplas formataes. A tag <P> utilizada para a definio de pargrafo. Ao fecharmos a tag (</p>) ser feita uma quebra automtica de linha.

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.

Listagem I.7 Formatao de texto com a tag <font></font>.


<html>

<head> <title>Tags para formatao de fonte!</title> </head>

<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>

<p> <font face=Arial size=3" color=#00FF00">

719

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Fonte arial, cor vermelha e tamanho 3 </font> </p>

<p> <font face=Arial size=2" color=#FF8000"> Fonte arial, cor laranha e tamanho 2 </font> </p>

</body> </html>

Na Figura I.5 temos o resultado desta pgina.

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>

<head> <title>Criao de links!</title> </head>

www.juliobattisti.com.br

720

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000


<body>

<h2>Livros do autor Jlio Battisti:</h2>

<ul> <li> <a href=http://www.juliobattisti.com/livros/windows2000.htm> Windows 2000 Server </a> </li>

<li> <a href=http://www.juliobattisti.com/livros/asp3.htm> ASP 3.0 </a> </li>

<li> <a href=http://www.juliobattisti.com/livros/sql2000.htm> SQL Server 2000 </a> </li> </ul>

</body> </html>

Na Figura I.6 temos o resultado desta pgina.

Figura I.6: Criao de links.

721

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

O Conceito de Contas de Usurios no Windows 2000


Quando trabalhamos com uma rede de computadores, segurana um dos itens de maior importncia. O Administrador deve ser capaz de permitir que cada usurio somente tenha acesso aos recursos sejam eles arquivos, impressoras, pginas ou aplicaes Web e servios , os quais sejam necessrios para a realizao do seu trabalho. Por exemplo, um usurio que trabalha no departamento de embalagem no deve ser capaz de acessar informaes sobre salrios, contidas nos arquivos de um computador do departamento de Recursos Humanos.

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

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000


Quando formos criar nomes de logon para os usurios, devemos levar em considerao os seguintes fatos: Nomes de Usurios do Domnio devem ser nicos dentro da Unidade Organizacional onde o usurio for cadastrado. Podem ter no mximo 20 caracteres. Os seguintes caracteres no podem ser utilizados: / \ : ; [ ] | = , + * ? < > Sempre que voc for cadastrar um usurio tambm deve ser cadastrada uma senha para o mesmo; alm disso podemos especificar um nmero mnimo de caracteres aceito para a senha, conforme veremos mais adiante nesta lio. O nmero mximo de caracteres da senha 128. Vamos praticar um pouco. Vamos criar algumas contas de usurios (lembrando que as telas de exemplo mostram a criao de contas em um Controlador de Domnio), e depois vamos alterar algumas propriedades destas contas. Exemplo: Criar as seguintes contas de usurios com as respectivas senhas:

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

senha123 Jos da Silva maria123 Maria do Socorro paulo123 Paulo Pereira

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura I.7: O Snap-in para Gerenciamento do Diretrio.


5. 6. D um clique na opo Users (ou Usurios se voc estiver utilizando o Windows 2000 Server em Portugus). No painel da direita exibida uma listagem com o nome de todos os usurios, conforme indicado na Figura I.8. D um clique, com o boto direito do mouse, sobre a opo Users (ou Usurios se for o caso).

Figura I.8: Listagem com todos os usurios j cadastrados.


7. No menu que surge, aponte para a opo New (Novo) e no menu que surge d um clique em Usurio. Surge um assistente para ajud-lo a criar um novo usurio. Digite as informaes para criar o usurio jsilva, conforme indicado na Figura I.9.

www.juliobattisti.com.br

724

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000

Figura I.9: Criando o usurio jsilva.


8. 9. D um clique no boto Avanar para ir para a prxima etapa. Na prxima tela voc deve digitar a senha do usurio duas vezes, para confirmao, conforme indicado na Figura I.10. Digite senha123 nos campos Senha e Confirmar senha. Observe que medida que voc digita a senha, o Windows 2000 Server exibe apenas asteriscos (*) nos campos Senha e Confirmar senha.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Outras opes que podem ser configuradas nesta tela: O usurio deve alterar a senha no prximo logon: Se esta opo estiver marcada, na primeira vez que o usurio fizer o logon, ser solicitado que o mesmo altere a sua senha. Esta opo utilizada para que o usurio possa colocar uma senha que somente ele conhece, pois na primeira vez que o usurio cadastrado, a senha digitada pelo Administrador, o qual fica sabendo a senha do usurio. No prximo logon o usurio altera a senha de tal maneira que somente ele saiba qual a senha para a sua conta. O usurio no pode alterar a senha: A senha somente pode ser alterada pelo Administrador. Normalmente utilizada para empregados temporrios e para estagirios. A senha nunca expira: Independente das polticas de segurana do domnio, se esta opo estiver marcada, o usurio nunca precisa trocar a sua senha. Caso contrrio, de tempos em tempos (conforme configurado nas polticas de segurana do domnio), o usurio deve trocar a senha. A conta est desativada: O Administrador marca esta opo para bloquear a conta de um usurio. Usurios com a conta bloqueada no podem mais efetuar logon e, conseqentemente, no podem mais acessar recursos da rede. Esta opo normalmente utilizada para desativar, temporariamente, a conta de empregados que esto em frias. Quando o empregado retorna ao servio, o Administrador libera a sua conta, simplesmente desmarcando esta opo. 10. Certifique-se de que as 4 opes acima descritas esto desmarcadas e d um clique no boto Avanar. 11. Surge uma tela informando que um novo objeto ser criado. Lembre-se de que todos os elementos do Active Directory so chamados de objetos. D um clique no boto Concluir. Feito isso, o usurio Jos da. Silva j aparece na listagem de usurios, conforme indicado na Figura I.11.

Figura I.11: Usurio Jos da. Silva j cadastrado.

www.juliobattisti.com.br

726

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000


Feche a janela indicada na Figura I.11. Agora vamos efetuar o logoff do usurio Administrador e fazer o logon com a conta jsilva, para verificar se a mesma est funcionando corretamente. Para efetuar o logoff do usurio Administrador e se logar como jsilva: 1. 2. 3. 4. 5. 6. 7. 8. 9. Feche todos os aplicativos que voc tiver aberto. D um clique no boto Iniciar e depois na opo Desligar. Surge a janela Desligar o Windows. Na lista escolha Efetuar logoff de Administrador e d um clique em OK. Em poucos instantes o logoff efetuado e o Windows 2000 Server volta a mostrar a tela inicial de logon. Pressione Ctrl+Alt+Del. Na tela que surge, no campo Nome do usurio, digite jsilva. No campo Senha digite senha123. Caso o campo Efetuar logon em: no esteja sendo exibido, d um clique no boto Opes. O campo Efetuar logon em: mostra o nome do domnio no qual voc est se logando. D um clique em OK e, pronto, voc ter se logado com a conta de usurio jsilva, recm-criada. Faa o logoff do usurio jsilva.

Alterando Propriedades Importantes das Contas de Usurios


Vamos aprender a alterar uma conta de usurio, e tambm veremos algumas propriedades importantes que podem ser alteradas depois que a conta criada. Veremos como renomear uma conta de usurio e como definir as polticas de segurana relativas s senhas dos usurios, tais como tamanho mnimo da senha, perodo para expirao das senhas, etc. Exemplo: Neste primeiro exemplo, vamos ver como alterar a conta do usurio jsilva. Para alterar a conta do usurio jsilva. 1. 2. 3. 4. 5. Efetue o logon como Administrador.

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).

Abaixo de caruncho.com surgem diversas opes.

727

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


6. 7. D um clique na opo Users (ou Usurios se voc estiver utilizando o Windows 2000 em Portugus). 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. 9. Digite as informaes para os campos Descrio, Escritrio, Telefone e Correio eletrnico, conforme indicado na Figura I.12. D um clique no boto OK para fechar a janela de propriedades e salvar as alteraes.

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.

Figura I.12: Alterando as propriedades da conta do usurio Jos da Silva.


Exemplo: Agora vamos aprender o significado e como alterar algumas propriedades mais avanadas das contas de usurios. Vamos aprender a limitar as horas em que o usurio pode efetuar o logon, bem como limitar os computadores nos quais o usurio pode efetuar o logon.

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

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000


Para alterar propriedades importantes do usurio jsilva: 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. 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.

Figura I.13: Preenchendo os campos da guia Endereo.


9. D um clique na guia Conta. Nesta guia voc pode alterar as informaes bsicas sobre a conta do usurio, conforme indicado pela Figura I.14. Um administrador pode utilizar essa guia, por exemplo, para desativar a conta de um empregado em frias. Para isso basta marcar a opo A conta est desativada.

729

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


10. Na guia Conta voc tambm pode estipular em que horrio do dia o usurio pode fazer o logon. Por padro o logon permitido durante as 24 horas do dia, quando a conta criada. Podem existir situaes em que determinados usurios somente devem ter permisses para se logar durante um certo perodo. 11. Para definir o perodo em que o usurio pode se logar, na guia Conta, d um clique no boto Horrio de logon..., que ser exibida a janela indicada na Figura I.15. 12. Observe que por padro o logon permitido durante as 24 horas de todos os dias. Vamos alterar essa configurao de tal forma que o usurio jsilva somente possa se logar das 8 da manh s 18 horas da tarde de segunda sexta-feira. 13. Quadradinho azul indica horrio permitido e quadradinho branco, horrio no permitido.

Figura I.14: Alterando as propriedades bsicas da conta do usurio.


Para alterar a cor de um quadradinho, basta pressionar o mouse sobre o mesmo, segurar o mouse pressionado e ir arrastando para marcar um ou mais quadradinhos. medida que voc vai arrastando, os quadradinhos vo sendo selecionados. Depois de selecionados basta dar um clique na opo desejada: Logon permitido ou Logon negado, e o Windows 2000 Server altera a cor do quadradinho, conforme a opo escolhida. 14. Utilize a tcnica de arrastar, para configurar os horrios permitidos conforme indicado na Figura I.16, e depois d um clique no boto OK. Voc estar de volta guia Conta.

www.juliobattisti.com.br

730

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000

Figura I.15: Configurando os horrios de logon permitidos.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


16. Ainda na guia Conta, d um clique no boto Efetuar logon em... . 17. Surge a janela indicada na Figura I.17. Observe que, por padro, o usurio pode efetuar o logon em qualquer computador do domnio. 18. Para limitar o logon a um nmero restrito de computadores, d um clique na opo Os seguintes computadores. 19. No campo Nome do computador digite o nome de um computador onde o usurio pode efetuar o logon e clique no boto Adicionar. 20. Repita a operao do passo anterior para cada computador que voc quiser adicionar. Observe na Figura I.18, que estamos dando permisses para o usurio jsilva se logar somente em dois computadores: server1 e server2. Para remover um computador da lista, d um clique no nome do computador para marc-lo, e depois d um clique no boto Remover. 21. Aps ter adicionado os computadores desejados, d um clique no boto OK. 22. Voc estar de volta guia Conta.

Figura I.17: Logon permitido em todos os computadores do domnio por padro.


23. D um clique no boto OK para fechar as propriedades da conta jsilva. 24. Feche o Console Usurios e computadores do Active Directory. 25. Com as modificaes que acabamos de fazer, o usurio jsilva somente poder se logar no perodo das 8:00 s 18:00 hs, e somente nos computadores server1 e server2.

www.juliobattisti.com.br

732

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000

Figura I.18: Adicionando computadores lista.


Exemplo: Vamos aprender a renomear uma conta de usurio. Para renomear uma conta de usurio: 1. 2. 3. 4. 5. 6. 7. 8. 9. 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. 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 (ou Usurios se for o caso). 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. D um clique na guia Conta. Altere os campos Nome de logon do usurio e Nome de logon do usurio (anterior ao Windows 2000), de jsilva para jsilva2, conforme indicado pela Figura I.19.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


10. D um clique em OK para fechar a janela com as propriedades do usurio e depois feche o console Usurios e computadores do Active Directory. 11. Efetue o logoff do usurio Administrador. Faa o logon como jsilva2 e para a senha digite senha123, para testar que o usurio jsilva foi renomeado com sucesso para jsilva2.

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.

Figura I.19: Alterando o nome de logon de jsilva para jsilva2.

Definindo as Polticas de Senhas


O Windows 2000 Server permite que sejam definidos alguns parmetros para as senhas a serem utilizadas pelos usurios. Por exemplo, voc pode definir que as senhas devem ter um tamanho mnimo de 8 caracteres, ou que as mesmas devem ser trocadas de 40 em 40 dias e que no pode ser utilizada uma senha igual s trs anteriores. Estes so apenas alguns exemplos do que chamamos de Account Policies, que nada mais so do que algumas regras que as senhas devem obedecer.

www.juliobattisti.com.br

734

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000


Podemos definir as Account Policies atravs do console Diretivas de segurana de domnio, o qual acessvel atravs do menu Ferramentas administrativas do menu Programas. Exemplo: Vamos definir alguns parmetros, utilizando o console Diretivas de segurana do domnio. Para definir algumas regras para as senhas: 1. 2. 3. 4. 5. 6. 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: Diretivas de segurana do domnio. Ser inicializado o MMC e carregado o Snap-In que permite que sejam configurados vrios aspectos de segurana para o domnio. D um clique no sinal de + ao lado da opo Windows Settings (Configuraes do Windows), para abri-la. Nas opes que surgem abaixo de Windows Settings, d um clique no sinal de + ao lado da opo Security Settings (Configuraes de Segurana); sero exibidas diversas opes, conforme mostrado na Figura I.20.

Figura I.20: Configuraes de segurana para o domnio.


7. 8. 9. D um clique no sinal de + ao lado da opo Accounts Policies para abri-la. Nas opes que aparecem, abaixo de Accounts Policies, d um clique na opo Diretivas de senha. No painel da direita do MMC so exibidas as diversas diretivas que podem ser alteradas. Localize a opo Comprimento mnimo de senha e d um clique duplo sobre a mesma. Ser aberta a janela Configurao da diretiva de segurana. Observe que por padro o comprimento mnimo definido em zero, o que permite que o usurio deixe a senha em branco.

735

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


10. Permitir que o usurio deixe a senha em branco no uma boa poltica de segurana. Clicando na setinha para cima, altere o valor de zero para 8 caracteres, conforme indicado na Figura I.21.

Figura I.21: Exigindo que as senhas tenham pelo menos 8 caracteres.


11. D um clique no boto OK para fechar a janela Configurao da diretiva de segurana. Voc estar de volta ao console Diretiva de segurana do domnio. 12. Localize a opo Enforce password history (Forar histrico de senhas), e d um clique duplo sobre a mesma. Ser aberta a janela indicada na Figura I.22.

Figura I.22: Alterando o histrico de senhas.


13. Nesta janela voc define o histrico de senhas. Altere o campo Manter histrico de senha: de 1 para 3 e d um clique no boto OK para fechar a janela. Isso significa que, quando o usurio for alterar a senha, o mesmo no pode utilizar uma senha igual s ltimas trs utilizadas. 14. Voc estar de volta ao console Diretiva de segurana do domnio. 15. Localize a opo Tempo de vida mximo da senha, e d um clique duplo sobre a mesma. Ser aberta a janela indicada na Figura I.23.

www.juliobattisti.com.br

736

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000

Figura I.23: Alterando o tempo mximo de vida da senha.


16. Nesta janela voc define durante quantos dias uma senha vlida. Depois de passado este prazo, ao efetuar o logon o usurio ser avisado de que a senha expirou e que a mesma deve ser alterada. Observe que por padro o tempo de vida da senha 42 dias. 17. Altere o tempo mximo de vida da senha para 30 dias e d um clique no boto OK. 18. Voc estar de volta ao console Diretiva de segurana do domnio. 19. Observe que os novos valores para as diretivas Comprimento mnimo de senha, Enforce password history e Tempo de vida mximo de senha j apresentam os novos valores configurados. 20. Feche o console Diretiva de segurana do domnio.

Grupos de Usurios e Tipos de Grupos Existentes no Windows 2000 Server


Neste tpico vamos ver um pouco de teoria sobre grupos de usurios. Em seguida vamos praticar criando alguns grupos e adicionando alguns membros aos grupos criados. Um grupo de usurios uma coleo de contas de usurios. Por exemplo, podemos criar um grupo chamado Contabilidade, do qual faro parte todos os usurios do departamento de Contabilidade. A principal funo dos grupos de usurios facilitar a administrao e a atribuio de permisses para acesso a recursos, tais como: pastas compartilhadas, impressoras remotas, servios diversos, pginas e aplicaes Web etc. Ao invs de darmos permisses individualmente, para cada um dos usurios que necessitam acessar um determinado recurso, podemos criar um grupo e atribuir permisses para o grupo. Para que um usurio tenha permisso ao recurso, basta incluir o usurio no grupo, pois todos os usurios de um determinado grupo herdam as permisses do grupo.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Quando um usurio troca de seo, por exemplo, basta trocar o usurio de grupo. Vamos supor que o usurio jsilva trabalhe na seo de contabilidade e pertena ao grupo Contabilidade. Ao ser transferido para a seo de marketing, basta retirarmos o usurio do grupo Contabilidade e adicion-lo ao grupo Marketing. Com isso o jsilva deixa de ter as permisses atribudas ao grupo Contabilidade e passa a ter as mesmas permisses que tem o grupo Marketing. Veja o quanto a utilizao de grupos pode facilitar a atribuio de permisses. Podemos inclusive ter situaes mais especficas. Vamos supor que exista um sistema chamado SEAT.NET, para o qual somente um nmero restrito de usurios deva ter acesso, sendo que so usurios de diferentes sees. A maneira mais simples de solucionar isso criar um grupo chamado Seat.Net e dar permisses de acesso para esse grupo. Assim, cada usurio que precisar acessar o sistema SEAT.NET deve ser includo no grupo Seat.Net. Quando o usurio no deve mais ter acesso ao sistema SEAT.NET, basta remov-lo do grupo Seat.Net. Na Figura I.24 vemos uma ilustrao para o conceito de Grupo de usurios. O Grupo Contabilidade possui direito para um recurso compartilhado, o qual pode ser acessado atravs da rede. Todos os usurios que pertencem ao grupo contabilidade tambm possuem permisso para o recurso compartilhado, uma vez que os usurios de um grupo herdam as permisses do grupo.

Figura I.24: O usurio herda as permisses do grupo.


Quando estiver trabalhando com grupos de usurios, considere o seguinte: Grupos so uma coleo de contas de usurios. Os membros de um grupo herdam as permisses atribudas ao grupo. Os usurios podem ser membros de vrios grupos. Grupos podem ser membros de outros grupos. Agora vamos dar uma olhada nos tipos de grupos existentes no Windows 2000 Server.

www.juliobattisti.com.br

738

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000


Podemos ter dois tipos de grupos no Windows 2000 Server: Grupos de segurana (Security Groups): Normalmente utilizado para atribuir permisses a recursos da rede. O Windows 2000 Server somente utiliza Grupos de segurana. Um grupo de segurana tambm pode ser utilizado como um grupo de distribuio, embora essa no seja uma situao muito comum. Esses grupos, assim como as contas de usurios, so armazenados no Banco de dados do diretrio. Grupos de distribuio (Distribution Groups): So utilizados para funes no relacionadas com segurana. Uma das utilizaes tpicas para um Grupo de distribuio o envio de mensagens de e-mail para um grupo de usurios de uma s vez. Somente programas que foram programados para trabalhar com o Active Directory podero utilizar Grupos de distribuio. Provavelmente as novas verses dos principais sistemas de correio eletrnico estaro habilitadas para trabalhar com o Active Directory. O Exchange Server da Microsoft integrado com o Active Directory. No podemos utilizar grupos de distribuio para funes relacionadas com segurana. Escopo de grupos de usurios: Quando criamos um grupo de usurios, devemos selecionar um tipo e um escopo. O Escopo permite que o grupo seja utilizado de diferentes maneiras para a atribuio de permisses. O escopo de um grupo determina em que partes da rede poderemos usar o grupo para atribuir permisses para o grupo. Existem trs escopos para grupos de usurios, conforme descrito a seguir: Grupos globais (Global group): Somente podem conter membros do domnio no qual o grupo criado. Podem receber permisses para recursos localizados em qualquer domnio. Grupos locais do domnio (Domain local group): Podem conter membros de qualquer domnio. Somente podem receber permisses para o domnio no qual o grupo criado. Grupos universais (Universal group): Podem conter membros de qualquer domnio. Podem receber permisses para recursos localizados em qualquer domnio. O Escopo de um grupo tambm determina quem pode ser membro do grupo. Tanto usurios como outros grupos podem ser membros de um determinado grupo. Considere as seguintes regras para membros de grupos: Grupo global: Pode conter: Contas de usurios e grupos globais do mesmo domnio. Pode ser membro de: Grupos universais e grupos locais do domnio em qualquer domnio. Grupos globais no mesmo domnio.

739

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Grupo local do domnio: Pode conter: Contas de usurios, grupos universais e grupos globais de qualquer domnio. Grupos locais do domnio do mesmo domnio. Pode ser membro de: Grupos locais do domnio do mesmo domnio. Grupo universal: Pode conter: Contas de usurios, grupos universais, e grupos globais de qualquer domnio. Pode ser membro de: Grupos locais do domnio ou grupos universais de qualquer domnio.

Criando Grupos de Usurios e Adicionando Usurios aos Grupos


Neste tpico vamos praticar um pouco. Primeiro vamos criar um grupo, e depois vamos adicionar alguns usurios ao grupo recm-criado. Exemplo: Para criar um grupo Global chamado Grupo1, faa o seguinte: 1. 2. 3. 4. 5. 6. 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 esquerda localize caruncho.com (ou o nome do domnio que voc estiver utilizando, caso esteja utilizando um nome diferente), e d um clique com o boto direito do mouse sobre o nome do domnio. No menu de opes que surge, aponte para Novo e, dentro do menu Novo, d um clique em Grupo. Surge a janela Novo objeto Grupo. Preencha as informaes conforme indicado na Figura I.25.

Figura I.25: Criando um grupo de segurana com escopo global.

www.juliobattisti.com.br

740

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000


7. 8. 9. D um clique no boto OK para criar o grupo. Voc estar de volta ao console Usurios e computadores do Active Directory. Observe no painel da esquerda que j aparece o grupo chamado Grupo1. Feche essa janela.

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.

Figura I.26: Alterando as propriedades do Grupo1.

741

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura I.27: Ainda no adicionamos nenhum membro ao grupo Grupo1.


8. Surge a janela Selecione Usurios, Contatos ou Computadores, conforme indicado na Figura I.28. Nesta janela exibida uma listagem com todos os usurios cadastrados no domnio caruncho.com (ou o nome de domnio que voc estiver utilizando).

Figura I.28: Lista de Usurios, Contatos e Computadores do domnio caruncho.com.

www.juliobattisti.com.br

742

ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000


9. Para adicionar o usurio jsilva (Jos da Silva) localize-o na listagem, d um clique sobre ele para marc-lo e depois d um clique no boto Adicionar. Voc tambm pode dar um clique duplo sobre o nome do usurio, que o mesmo ser adicionado. 10. Repita a operao do passo anterior, para os usurios Maria do Socorro e Paulo Pereira. 11. D um clique no boto OK para fechar essa janela e voltar guia Membros. 12. Sua janela deve estar conforme indicado na Figura I.29, a qual indica que os usurios Jos da Silva (jsilva2), Maria do Socorro (maria) e Paulo Pereira (paulo) foram adicionados como membros do grupo Grupo1. 13. D um clique em OK para fechar a janela de propriedades do grupo Grupo1. 14. Feche o console Usurios e Computadores do Active Directory. A partir deste momento, qualquer permisso que for atribuda ao grupo Grupo1, ser herdada por todos os seus membros, no nosso exemplo, pelos usurios jsilva2, maria e paulo.

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.

Figura I.29: Trs usurios adicionados como membros do grupo Grupo1.


Outra conta criada quando da instalao do Windows 2000 Server a conta de usurio Convidado (Guest). Esta conta normalmente utilizada para acesso de usurios que no possuem uma conta cadastrada no domnio. Por padro esta conta est desabilitada. O Administrador pode habilitar a conta Convidado. Porm isso deve ser feito com cuidado.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Sempre que um usurio precise acessar algum recurso, o ideal cadastrar o usurio e incluir o mesmo no grupo (ou grupos), que tm permisso para acessar o recurso desejado. Existem tambm alguns grupos criados quando da instalao do Windows 2000 Server, so os chamados Built-in Groups. O mais importante de todos o grupo Administradores. Todo membro deste grupo tem plenos poderes no domnio. No console Usurios e Computadores do Active Directory (Iniciar Programas Ferramentas administrativas Usurios e computadores do Active Directory), existe uma opo chamada Built-in. Ao clicar nessa opo ser exibida uma listagem com diversos grupos criados durante a instalao do Windows 2000 Server. Observe, na coluna tipo, que o tipo destes grupos Grupo de segurana local interno e na coluna descrio podemos ver um resumo das permisses de cada um dos grupos. Para maiores informaes sobre o Windows 2000 voc pode consultar um dos seguintes endereos: www.microsoft.com/technet www.microsoft.com/windows2000 www.labmice.net www.2000tutor.com

www.juliobattisti.com.br

744

ANEXO 2: O MODELO DE DADOS RELACIONAL

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Server 2000, pelo Microsoft Access, pelo ORACLE, pelo DB2 da IBM e por a vai, conforme indicado pela listagem a seguir: Microsoft Access para aplicaes de menor porte Oracle DB2 da IBM Sybase MySQL para Linux Paradox Dbase Ingress O modelo relacional tambm possui suas limitaes, porm bastante adequado para a grande maioria das aplicaes comerciais atualmente em uso ou sendo desenvolvidas. Algumas aplicaes especiais que necessitam utilizar dados mais complexos, como por exemplo arquivos multimdia, dados espaciais e sries temporais, podem se beneficiar mais das caractersticas dos chamados Bancos de dados orientados a Objetos. Este tipo de Banco de dados ainda no amplamente utilizado, a no ser em situaes especficas. Um exemplo de Banco de dados orientado a Objetos o Jasmine da CA. Devido grande aceitao e utilizao dos Bancos de dados Relacionais que estaremos estudando os princpios bsicos deste tipo de banco de dados, ao longo deste Anexo. Caso voc queira maiores detalhes sobre este tipo de banco de dados, existe uma farta Bibliografia, bem como inmeros sites na Internet com informaes sobre o assunto.

Conceitos Bsicos de Bancos de Dados Relacionais


Neste item iremos revisar alguns conceitos bsicos sobre Bancos de dados relacionais. Estes conceitos so importantes para a correta utilizao dos bancos de dados, bem como para o projeto e criao dos mesmos. Em muitas situaes teremos que conectar nossas aplicaes Web e pginas ASP.NET com bancos de dados j existentes; neste caso precisamos conhecer os conceitos aqui apresentados, para podermos utilizar o banco de dados de uma maneira otimizada. Em outras situaes teremos que criar o banco de dados a ser utilizado pela aplicao que est sendo desenvolvida. Neste caso, os conceitos apresentados neste captulo auxiliam na criao de um banco de dados melhor estruturado e otimizado, tanto em termos de espao de armazenamento, quanto da qualidade, confiabilidade e disponibilidade das informaes nele contidas. Veremos os seguintes conceitos:

www.juliobattisti.com.br

746

ANEXO 2: O MODELO DE DADOS RELACIONAL


Entidades e Atributos, a base de um banco de dados Chave Primria Relacionamentos entre Entidades (Tabelas) Integridade Referencial Normalizao de Tabelas Anlise de um banco de dados relacional

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura II.1: A entidade (tabela) Clientes e seus diversos atributos (campos).


Um dos grandes desafios em se projetar um banco de dados com sucesso a correta determinao das entidades que existiro no banco de dados, bem como dos atributos de cada entidade. Mais adiante veremos algumas dicas e tcnicas para determinar as tabelas necessrias, bem como os campos necessrios em cada tabela. importante lembrar que o que determina quais as tabelas e campos necessrios o escopo do problema que est sendo abordado. Por exemplo, se estamos desenvolvendo um sistema para acompanhamento do desempenho individual de cada funcionrio, com certeza no teremos necessidade de uma tabela de Clientes. Por outro lado, se o desempenho de cada funcionrio a ser acompanhado estiver ligado ao nmero de clientes atendidos pelo funcionrio ou ao volume de vendas, a tabela Clientes passa a ter importncia para o problema em questo. Com isso podemos dizer que o que determina as tabelas e campos necessrios o problema real que o sistema a ser desenvolvido dever solucionar. Outro fato importante, e que iremos repetir ao longo deste ANEXO, que cada tabela deve conter dados de SOMENTE um determinado assunto. No devemos misturar dados de diversos assuntos em uma mesma tabela. Observe o exemplo da tabela indicada na Figura II.2:

Figura II.2: Uma tabela problemtica, na qual estamos misturando assuntos.

www.juliobattisti.com.br

748

ANEXO 2: O MODELO DE DADOS RELACIONAL


Observe que, nesta tabela, cometemos o erro de misturar dois assuntos: Dados sobre os Clientes Dados sobre os Pedidos dos Clientes Quando este tipo de situao acontece, temos uma srie de problemas que iro se refletir em todo o sistema que est sendo desenvolvido. Dentre os principais problemas podemos citar: Informao repetida: Observe que para cada pedido de um determinado cliente, precisamos informar novamente os campos: Nome, Endereo e Fone. Informao inconsistente: Observe que por um erro de digitao, o nome do cliente Jos da Silva est digitado incorretamente (sem o acento) no segundo registro, e o seu endereo est digitado incorretamente, no terceiro registro. Isso causa inconsistncias no banco de dados, gerando resultados errados quando forem feitas pesquisas pelo nome do cliente ou pelo endereo. Para evitar este tipo de problema, deveramos separar as informaes dos Clientes e dos seus Pedidos em duas tabelas distintas. Veremos como fazer isso mais adiante neste Anexo.

O Conceito de Chave Primria


O Conceito de Chave Primria fundamental para entender o funcionamento de um Banco de dados relacional. Vamos procurar entender o que significa um campo ser a Chave Primria de uma tabela. Ao definirmos um campo como sendo uma Chave Primria, estamos informando ao banco de dados que no podem existir dois registros com o mesmo valor no campo Chave Primria, ou seja, os valores no campo Chave Primria precisam ser nicos. Por exemplo, se defino um campo Nmero da Identidade da tabela Clientes como sendo uma Chave Primria, estou dizendo ao banco de dados que no podem existir dois clientes com o mesmo valor no campo Nmero da Identidade. Na prtica estou garantindo que no podem ser cadastrados dois clientes com o mesmo Nmero de Identidade. Em outras palavras poderamos dizer que o Campo Chave Primria identifica de maneira nica cada registro da tabela, isto , de posse do valor da Chave Primria somente localizaremos um registro com aquele valor no campo Chave Primria. Este um conceito muito importante, pois conforme veremos mais adiante os conceitos de Integridade Referencial e Normalizao esto diretamente ligados ao conceito de Chave Primria. Alguns exemplos de campos que podem ser definidos como Chave Primria em suas respectivas tabelas: O campo Nmero do Pedido, em uma tabela de Pedidos. O campo Nmero da Identidade ou CPF em uma tabela de Clientes Pessoa Fsica. O campo Nmero do CNPJ em uma tabela de Clientes Pessoa Jurdica.

749

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


O campo Cdigo do Produto em uma tabela de Produtos. O campo ISBN em uma tabela de Livros. O campo Cdigo do Autor em uma tabela de autores. Na Figura I.3 vemos um exemplo da tabela Cliente onde o campo Cdigo do Cliente definido como uma Chave Primria. Observe que no existem dois clientes com o mesmo cdigo. Um detalhe importante que a Chave Primria pode ser formada pela combinao de Mais do que um campo. Podem existir casos em que um nico campo no capaz de atuar como Chave Primria, pelo fato de este campo apresentar valores repetidos. Nestes casos podemos definir uma combinao de dois ou mais campos para ser a nossa Chave Primria. Alm disso, uma tabela somente pode ter uma Chave Primria, seja ela simples ou composta. Um cuidado especial que devemos ter quanto ao desempenho das consultas em tabelas que possuem Chave Primria composta por mais do que um campo. Em muitas situaes, o desempenho das consultas inversamente proporcional ao tamanho da Chave Primria. Com isso quanto maior o tamanho da Chave Primria, menor o desempenho das consultas, isto , mais demoradas se tornam as consultas. Na prtica dificilmente teremos uma Chave Primria composta por mais do que 3 campos. Se voc se deparar com uma situao em que precise de uma Chave Primria composta de quatro ou mais campos, revise o projeto do banco de dados, porque devem existir alguns problemas.

Figura II.3: O campo Cdigo do Cliente uma Chave Primria.

Relacionamentos Entre Tabelas


Na prtica, em um Banco de dados relacional, podem existir diversas tabelas, como por exemplo: Clientes Produtos

www.juliobattisti.com.br

750

ANEXO 2: O MODELO DE DADOS RELACIONAL


Pedidos Detalhes do Pedido Fornecedores Categorias Funcionrios, etc. Embora as informaes estejam separadas em cada uma das Tabelas, devemos ter algum mecanismo que nos permita reunir dados de duas ou mais tabelas em um relatrio ou consulta. Por exemplo, para fazer um relatrio do total de vendas por funcionrio, precisarei de informaes das seguintes tabelas: Funcionrios Pedidos Detalhes do pedido O mecanismo que nos permite acessar, de maneira consolidada, dados de diversas tabelas chamado de Relacionamento entre tabelas. Por exemplo: Um Pedido feito por um Cliente e neste Pedido podem existir diversos Itens, os quais so armazenados na tabela Detalhes do Pedido. Alm disso cada Pedido possui um nmero nico, mas um mesmo Cliente pode fazer diversos pedidos. Veja que o pargrafo acima descreve relaes do mundo real. Estas relaes do mundo real so o nosso guia, para definir as relaes entre as diversas tabelas do banco de dados. Em um banco de dados precisamos de um mecanismo para representar estes relacionamentos da vida Real, em termos das tabelas e seus atributos. Isto possvel com a utilizao dos Relacionamentos, os quais podem ser de trs tipos: Um para Um Um para Vrios Vrios para Vrios Vamos analisar cada um desses tipos, individualmente.

Relacionamento do Tipo Um Para Um


Esta relao existe quando os campos que se relacionam so ambos Chaves Primrias em suas respectivas tabelas. Cada um dos campos no apresenta valores repetidos. Na prtica existem poucas situaes onde utilizaremos um relacionamento deste tipo. Vamos imaginar o seguinte exemplo: Imagine uma escola com um cadastro de Alunos na tabela Alunos; destes apenas uma pequena parte participa da Banda da Escola. Por questes de projeto do banco de dados, podemos optar por criar uma segunda tabela Alunos da Banda, a qual pode se relacionar com a tabela Alunos atravs de um relacionamento

751

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Um para Um. Cada aluno somente cadastrado uma vez na tabela Alunos e uma nica vez na tabela Alunos da Banda. Poderamos utilizar o campo Matrcula do Aluno como o Campo que relaciona as duas tabelas. Na tabela Alunos da Banda poderamos colocar apenas o Nmero da Matrcula do aluno, alm das informaes a respeito do Instrumento que ele toca, tempo em que est na banda, etc. Quando fosse necessrio buscar as informaes tais como nome, endereo, etc., as mesmas podem ser recuperadas atravs do relacionamento existente entre as duas tabelas, evitando, com isso, que a mesma informao (Nome, Endereo, etc.) tenha que ser duplicada nas duas tabelas, o que diminui a probabilidade de erros de digitao. Na Figura II.4 vemos o exemplo de um relacionamento do tipo Um para Um entre as tabelas Alunos e Alunos da Banda.

Figura II.4: Um relacionamento do tipo Um para Um.

Relacionamento do Tipo Um Para Vrios


Este, com certeza, o tipo de relacionamento mais comum entre duas tabelas. Uma das tabelas (o lado um do relacionamento) possui um campo que a Chave Primria e a outra tabela (o lado vrios) se relaciona atravs de um campo cujos valores podem se repetir este campo conhecido como Chave Estrangeira. Considere o exemplo entre a tabela Clientes e a tabela Pedidos. Cada Cliente somente cadastrado uma nica vez (por isso o campo Cdigo do Cliente uma Chave Primria, indicando que no podem existir dois clientes com o mesmo cdigo), portanto a tabela Clientes ser o lado um do relacionamento. Porm cada cliente pode fazer diversos pedidos; por isso que o campo Cdigo do Cliente poder aparecer vrias vezes na tabela Pedidos, tantas vezes quantos forem os pedidos que o Cliente tenha feito. Por isso que temos um relacionamento do tipo Um para Vrios entre a tabela Clientes e Pedidos, atravs do campo Cdigo do Cliente, indicando que um mesmo Cliente pode fazer diversos pedidos. Na Figura II.5 vemos um exemplo de um relacionamento Um para Vrios entre as Tabelas Clientes e Pedidos, atravs do campo cdigo do cliente. No lado Um do relacionamento o campo definido como uma Chave Primria (campo CdigoDoCliente na tabela Clientes) e no lado Vrios no (campo CdigoDoCliente na tabela Pedidos), indicando que no lado vrios o Cdigo do Cliente pode se repetir, o que faz sentido, uma vez que um mesmo cliente pode fazer diversos pedidos.

www.juliobattisti.com.br

752

ANEXO 2: O MODELO DE DADOS RELACIONAL

Figura II.5: Um relacionamento do tipo Um para Vrios.


Podemos citar outro exemplo clssico de relacionamentos do tipo Um para Vrios: Entre as tabelas Pedidos e Detalhes do Pedido, atravs do campo NmeroDoPedido. Na tabela Pedidos o campo NmeroDoPedido Chave Primria. Na tabela Detalhes do Pedido, o campo NmeroDoPedido no Chave Primria. Na tabela Detalhes do Pedido temos as informaes sobre os itens de cada pedido. Este relacionamento indica que um mesmo pedido pode ter diversos itens, o que faz sentido. Na Figura II.6 vemos um exemplo de um relacionamento Um para Vrios entre as Tabelas Pedidos e Detalhes do Pedido, atravs do campo NmeroDoPedido.

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.

Figura II.6: Mais um exemplo de relacionamento do tipo Um para Vrios.

Relacionamento do Tipo Vrios Para Vrios


Este tipo de relacionamento ocorre em uma situao onde, nos dois lados do relacionamento, os valores podem se repetir. Vamos considerar o caso entre as tabelas Produtos e a tabela Pedidos. Posso ter vrios Pedidos nos quais aparece um determinado produto; alm disso vrios Produtos podem aparecer no mesmo Pedido. Esta uma situao em que temos um relacionamento do tipo Vrios para Vrios: Vrios produtos podem aparecer em Vrios pedidos e Vrios pedidos podem conter Vrios produtos.

753

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Na prtica no temos como implementar um relacionamento deste tipo, devido a uma srie de problemas que este tipo de relacionamento implicaria. Para evitar este problema bastante comum quebrarmos um relacionamento do tipo Vrios para Vrios em dois relacionamentos do tipo Um para Vrios. Isso feito atravs da criao de uma nova tabela, a qual fica com o lado Vrios dos relacionamentos. No nosso exemplo poderamos criar a tabela Detalhes do Pedido, onde ficam armazenadas as informaes sobre os diversos itens de cada pedido. Desta forma, ao invs de termos um relacionamento do tipo Vrios para Vrios, teremos dois relacionamentos do tipo um para vrios, conforme indicado na Figura II.7. Esta situao em que um relacionamento Vrios para Vrios quebrado em dois relacionamentos do tipo Um para Vrios bastante comum. Diversas vezes utilizamos esta tcnica para eliminar problemas no banco de dados, tais como informao repetida e inconsistncia de dados. Agora que j conhecemos os tipos de relacionamentos existentes, no prximo item veremos o conceito de Integridade Referencial. O mecanismo da Integridade Referencial utilizado para garantir a consistncia dos dados.

Figura II.7: Quebrando um relacionamento Vrios para Vrios.

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

ANEXO 2: O MODELO DE DADOS RELACIONAL


excluso dos registros relacionados ou Propagar excluses em cascata, e pode ser habilitada ou no, dependendo do projeto do banco de dados. Caso seja necessrio manter todo o histrico de compras do cliente, por exemplo, esta opo no deve ser habilitada. Com isso, quando o cliente for eliminado da tabela Clientes, os seus pedidos continuaro gravados na tabela Pedidos. Essas opes so definidas no momento da criao do banco de dados, quando so criadas as tabelas e definidos os relacionamentos entre as tabelas. A opo de Propagar atualizao dos campos relacionados utilizada na maioria das situaes; j a opo de Propagar excluso dos registros relacionados deve ser estudada caso a caso.

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.

Primeira Forma Normal


Regra: Uma tabela est na Primeira Forma Normal quando seus atributos no contm Grupos de Repetio. Por isso dissemos que uma tabela que possui Grupos de Repetio no est na Primeira Forma Normal. Considere a tabela Indicada na Figura II.8: Podemos notar que uma tabela com esta estrutura apresenta diversos problemas. Por exemplo, se um casal tiver mais do que um filho, teramos que digitar o Nome do Pai e da Me diversas vezes, tantas quantos forem os filhos. Isso forma um Grupo de Repetio. Alm do mais pode ser que, por erro de digitao, o nome dos pais no seja digitado

755

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


exatamente igual todas as vezes, o que pode acarretar problemas na hora de fazer pesquisas ou emitir relatrios. Este problema ocorre porque Misturamos Assuntos em uma mesma tabela. Colocamos as informaes dos Pais e dos Filhos em uma mesma tabela.

Figura II.8: Uma tabela que no est na Primeira Forma Normal.


A Resoluo para este problema simples: Criamos uma tabela separada para a Informao dos Pais e relacionamos a tabela Pais com a tabela Filhos atravs de um relacionamento do tipo Um para Vrios, ou seja, Um casal pode ter Vrios filhos. Esta soluo indicada na Figura II.9.

Figura II.9: As tabelas Pais e Filhos esto na primeira forma normal.


As duas tabelas resultantes da aplicao da primeira forma normal: Pais e Filhos esto na primeira forma normal; a tabela original, a qual misturava informaes de Pais e Filhos, no estava na primeira forma normal.

Segunda Forma Normal


Podemos aplicar a segunda forma normal quando tivermos uma chave primria composta por mais de um campo, isto , uma chave primria composta. Neste caso, devemos observar se todos os campos que no fazem parte da chave dependem de todos os campos que compem a Chave Primria. Se algum campo depender somente de parte da chave composta, ento este campo deve pertencer a outra tabela. Observe o exemplo indicado na tabela da Figura II.10.

www.juliobattisti.com.br

756

ANEXO 2: O MODELO DE DADOS RELACIONAL

Figura II.10: Uma tabela que no est na Segunda Forma Normal.


A Chave Primria composta formada pela combinao dos campos NmeroDaMatrcula e CdigoDoCurso. O campo Avaliao depende tanto do CdigoDoCurso quanto do NmeroDaMatrcula, porm o campo DescrioDoCurso depende apenas do CdigoDoCurso. Com isso temos um campo que no faz parte da Chave Primria e depende apenas de um dos campos que compem a Chave Primria. Com isso dizemos que esta tabela no est na segunda forma normal. A resoluo para este problema tambm simples: Dividimos a tabela, que no est na segunda forma normal, em duas outras tabelas, conforme indicado pela Figura II.11, sendo que as duas tabelas resultantes esto na segunda forma normal.

Figura II.11: Duas tabelas que esto na Segunda Forma Normal.

Terceira Forma Normal


Na definio dos campos de uma entidade podem ocorrer casos em que um campo no seja dependente diretamente da Chave Primria, ou de parte dela, mas sim dependente de um outro atributo constante na tabela, atributo este que no a Chave Primria. Quando isto ocorre, dizemos que a tabela no est na terceira forma normal, conforme indicado pela tabela da Figura II.12. Observe que o campo DescrioDoCurso depende apenas do campo CdigoDoCurso, o qual no faz parte da Chave Primria. Por isso dizemos que esta tabela no est na terceira forma normal.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura II.12: Uma tabela que no est na terceira forma normal.


A soluo para este caso tambm simples. Novamente basta dividir a tabela em duas outras, conforme indicado pela Figura II.13. As duas tabelas resultantes esto na terceira forma normal.

Figura II.13: Duas tabelas que esto na terceira forma normal.

Passos Para Projetar um Banco de Dados


Neste item iremos apresentar os passos bsicos para projetar um banco de dados. Aplicaremos os conhecimentos sobre Entidades, Atributos, Relacionamentos, Chave Primria e Normalizao. Um banco de dados bem projetado fornece um acesso conveniente s informaes desejadas. Com uma boa estrutura, gasta-se menos tempo na construo de um banco de dados e, ao mesmo tempo, asseguram-se resultados mais rpidos e precisos. Etapas na estruturao de um banco de dados: Determinar qual o objetivo do banco de dados. Isto ajuda na determinao de quais dados devem ser armazenados. Determinar as tabelas necessrias. Aps definirmos o objetivo do banco de dados, as informaes devem ser definidas e separadas em assuntos diferentes, tais como Clientes, Empregados, Pedidos, pois cada um ir compor uma tabela no banco de dados. Determinar os campos necessrios em cada tabela. Definir quais informaes devem ser mantidas em cada tabela. Por exemplo, a tabela Clientes poderia ter um campo para o Cdigo Do Cliente; outro para o Nome Do Cliente e assim por diante.

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

ANEXO 2: O MODELO DE DADOS RELACIONAL


Determinar quais campos sero as chaves primrias. Determinar, em cada tabela, qual ou quais campos sero utilizados como Chave Primria. Esta uma etapa importante para a definio dos Relacionamentos que vm a seguir. Determinar os relacionamentos. Decidir como os dados de uma tabela se relacionam com os dados de outras tabelas. Por exemplo, Clientes podem fazer Vrios Pedidos. Fornecedores podem fornecer Vrios Produtos, etc. Refinar a estrutura do banco de dados. Antes de inserir muitos dados, ou at mesmo antes de inserir qualquer dado, verificar se a estrutura contm erros, isto , verificar se os resultados obtidos so os desejados. Isto, normalmente, pode ser obtido atravs do processo de Normalizao. Com uma boa estrutura, gasta-se menos tempo na construo e manuteno do banco de dados e, ao mesmo tempo, asseguram-se resultados mais rpidos e precisos. Dicas para determinao dos campos em uma tabela: Relacionar diretamente cada campo ao assunto da tabela. Se um campo descreve o assunto de uma tabela diferente, este campo deve pertencer a outra tabela. O mesmo acontece quando uma informao se repete em diversas tabelas. Este um indcio de que existem campos desnecessrios em algumas tabelas. No incluir dados derivados ou calculados. No recomendado armazenar o resultado de clculos nas tabelas. O correto que o clculo seja executado quando necessitarmos do resultado. Incluir todas as informaes necessrias. Como fcil esquecer informaes importantes, deve-se ter em mente todas as informaes coletadas desde o incio do processo e perguntar se com elas possvel obter todos os resultados esperados. Armazenar todas as informaes separadamente. Existe uma tendncia em armazenar informaes em um nico campo. Por exemplo, o nome do curso e o tempo de durao em um mesmo campo. Como as duas informaes foram combinadas em um nico campo, ficar difcil conseguir um relatrio classificado pelo tempo de durao dos cursos, por exemplo. Como escolher o campo que ser a Chave Primria? Um bom Sistema Gerenciador de Banco de Dados Relacionais (SGBDR) aquele que encontra e nos fornece, rapidamente, todas as informaes necessrias que nele estejam armazenadas, mesmo em diferentes tabelas. Para que isto seja possvel necessrio incluir um campo ou conjunto de campos que identifiquem de um modo nico cada registro de uma tabela. Esta informao chamada Chave Primria, conforme descrito anteriormente. Deve-se ter certeza de que este campo (ou conjunto de campos) seja sempre diferente para cada registro, por no serem permitidos valores duplicados em um campo de Chave Primria. Ao escolher campos de Chave Primria, considere os seguintes detalhes:

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


No permitido duplicidade de valores ou nulos (informaes desconhecidas). Caso no exista um identificador nico para uma determinada tabela, pode-se usar um campo que numere os registros seqencialmente. Pode-se utilizar o valor deste campo para encontrar registros. O tamanho da Chave Primria afeta a velocidade das operaes; portanto, para um melhor desempenho, devemos utilizar o menor tamanho que acomode os valores necessrios para armazenar no campo. Na Figura II.14 temos um exemplo de um Diagrama Entidade x Relacionamentos. Este diagrama mostra a estrutura do Banco de dados NorthWind.mdb, o qual fornecido juntamente com o Microsoft Access e tambm como exemplo na instalao do Microsoft SQL Server 2000. Os campos que so Chave Primria esto indicados em negrito.

Figura II.14: Um diagrama Entidade x Relacionamentos.

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

ANEXO 3: A LINGUAGEM SQL

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.

Noes Bsicas da Linguagem SQL Structured Query Language


Como o prprio nome sugere Microsoft SQL Server a linguagem utilizada pelo Microsoft SQL Server 2000 o SQL Structured Query Language. O SQL utilizado para uma srie de operaes, conforme descrito na Introduo deste anexo. Neste tpico teremos uma noo bsica da linguagem SQL. Aprenderemos os comandos para manipulao de dados consultar, inserir, alterar e excluir.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


software. Ao usar SQL, voc no precisa saber a respeito do software de banco de dados ou do hardware envolvido em uma operao. Tudo o que voc precisa conhecer o mtodo (instruo) SQL padro para solicitar informaes, que obrigatoriamente o mesmo (no sejamos to otimistas, digamos que quase o mesmo), em todos os sistemas que utilizam o SQL. Obs.: Existem pequenas diferenas nas implementaes do SQL de diferentes fabricantes. Desta forma algumas rotinas escritas utilizando o SQL Plus do Oracle podem no rodar, sem alteraes no Microsoft SQL ou do Microsoft Access e vice-versa. Na listagem a seguir temos um exemplo de uma instruo SQL. Embora a mesma parea complexa, neste primeiro momento, veremos que a Linguagem SQL bastante simples e de fcil aprendizado. Exemplo de um comando SQL:
SELECT Orders.OrderID, Orders.OrderDate, Orders.ShipCountry, Orders.ShipCity FROM Orders WHERE Orders.ShipCountry Like [A-M]% AND Orders.OrderDate > 01/01/1997 ORDER BY Orders.OrderDate

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

ANEXO 3: A LINGUAGEM SQL


A sintaxe simplificada da instruo conforme indicado abaixo:
SELECT campo1, campo2, campo3 FROM nome_da_tabela [WHERE condio ] [GROUP BY nome_do_campo ] [HAVING ... ] [ORDER BY... ]

Na Tabela III.1 temos uma descrio destes elementos:

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Por exemplo, imagine que estejamos escrevendo uma instruo SQL para criar uma listagem com o Cdigo e o Nome do Cliente, bem como todos os pedidos efetuados pelo Cliente. Acontece que o cdigo do Cliente, no nosso exemplo, existe nas duas tabelas: Clientes e Pedidos. Neste caso devemos especificar o nome da tabela, antes do nome do campo. Exemplo 2: Alterar a instruo SQL anterior para que os registros sejam classificados em ordem crescente pelo valor do Frete.
SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos ORDER BY Frete

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

ANEXO 3: A LINGUAGEM SQL


SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos WHERE NmeroDoPedido>10500 ORDER BY NmeroDoPedido

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


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 Pedidos.NmeroDoPedido

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

ANEXO 3: A LINGUAGEM SQL


At agora estivemos trabalhando com Instrues que selecionam registros de uma nica tabela. Porm bastante comum criarmos instrues SQL baseadas em duas ou mais tabelas. Quando criamos instrues SQL que buscam dados em duas ou mais tabelas, dizemos que est sendo feito um Join entre as duas tabelas. Normalmente este Join (ou ligao) feito atravs de um campo comum s duas tabelas. Por exemplo, NmeroDoPedido na tabela Pedidos e NmeroDoPedido na tabela Detalhes do Pedido. Outro exemplo, CdigoDoCliente na tabela Pedidos e CdigoDoCliente na tabela Clientes. Pode acontecer de termos consultas que trabalham com trs ou mais Tabelas; neste caso teremos diversos Joins. O nmero de Joins sempre igual ao nmero de tabelas menos um. Por exemplo, se a nossa consulta acessar dados de quatro tabelas, teremos trs joins. Agora passaremos e explorar na Prtica, atravs de exemplos, a construo de Instrues SQL que trabalham com duas ou mais tabelas. Exemplo 10: Criar uma instruo SQL que selecione os seguintes campos: NmeroDoPedido da tabela Pedidos DataDoPedido da tabela Pedidos PasDeDestino da tabela Pedidos Frete da tabela Pedidos CdigoDoProduto da tabela DetalhesdoPedido PreoUnitrio da tabela DetalhesdoPedido Quantidade da tabela DetalhesdoPedido Alm disso, as tabelas Pedidos e Detalhes do Pedido esto relacionadas pelo campo NmeroDoPedido, atravs de um relacionamento do tipo Um para Vrios. Classificar a listagem em ordem crescente do Nmero do Pedido. Para resolver este exemplo podemos utilizar a seguinte instruo SQL:
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete, DetalhesdoPedido.CdigoDoProduto, DetalhesdoPedido.PreoUnitrio, DetalhesdoPedido.Quantidade FROM Pedidos INNER JOIN DetalhesdoPedido ON Pedidos.NmeroDoPedido = DetalhesdoPedido.NmeroDoPedido ORDER BY Pedidos.NmeroDoPedido

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Primeiro devemos observar que, pelo fato de estarmos tratando com dados de duas tabelas, estamos utilizando a nomenclatura completa, isto , Nome_da_tabela.Nome_do_campo. Observe a utilizao da clusula INNER JOIN, ligando as tabelas Pedidos e DetalhesdoPedido, atravs do campo NmeroDoPedido, conforme especificado na clusula ON, onde temos o seguinte:
ON Pedidos.NmeroDoPedido = DetalhesdoPedido.NmeroDoPedido

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

ANEXO 3: A LINGUAGEM SQL


SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete, Produtos.NomeDoProduto, DetalhesdoPedido.PreoUnitrio, DetalhesdoPedido.Quantidade FROM Pedidos INNER JOIN (Produtos INNER JOIN DetalhesdoPedido ON Produtos.CdigoDoProduto=DetalhesdoPedido.CdigoDoProduto) ON Pedidos.NmeroDoPedido = DetalhesdoPedido.NmeroDoPedido WHERE (Produtos.NomeDoProduto Like [A-J]%) ORDER BY Produtos.NomeDoProduto

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


UPDATE DetalhesdoPedido SET PreoUnitrio = PreoUnitrio*1.2 WHERE PreoUnitrio>=20

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

ANEXO 3: A LINGUAGEM SQL


atualizao. Segundo, temos a utilizao da funo Year para extrair apenas o ano do campo DataDoPedido e compar-lo com o critrio 1995. Novamente cabe ressaltar que a utilizao de Operadores e Funes nos fornece uma grande flexibilidade em termos de construo de nossas consultas.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


DELETE Pedidos.PasDeDestino FROM Pedidos WHERE Pedidos.PasDeDestino=Alemanha

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.

Comandos Avanados da Linguagem T-SQL


Neste tpico vamos tratar de alguns comandos e tcnicas avanadas da Linguagem T-SQL. Falaremos sobre os seguintes itens: Pesquisando mltiplas tabelas detalhes e exemplos. Utilizando subconsultas.

Pesquisando Dados em Mltiplas Tabelas Detalhes e Exemplos


comum a situao em que, para construir uma consulta, temos que acessar dados de duas ou mais tabelas. Por exemplo se quisermos uma listagem com o nome do funcionrio, o nmero do pedido, a data do pedido e o pas de destino, teremos que utilizar acessar dados das seguintes tabelas do Banco de dados Northwind: Clientes Pedidos Detalhes do Pedido Para que possamos acessar dados de duas ou mais tabelas, em uma consulta, utilizamos uma clusula JOIN. Um JOIN uma operao que nos permite acessar dados de duas ou mais tabelas. O JOIN efetuado com base em uma coluna que seja comum a duas ou mais tabelas. Por exemplo, se fizermos um JOIN entre as tabelas Pedidos e Detalhes do Pedido, o JOIN ser efetuado atravs da coluna NmeroDoPedido, que a coluna que relaciona as duas tabelas. Na tabela Detalhes do Pedido, o campo NmeroDoPedido utilizado para indicar a qual pedido pertence um determinado item. Vamos a um exemplo de utilizao do JOIN. Exemplo: Escrever um comando SQL que retorne os campos indicados na Tabela III.2.

www.juliobattisti.com.br

772

ANEXO 3: A LINGUAGEM SQL

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

34,8 5 18,6 9 42,4 40 7,7 10

42,4 35 16,8 15 ... ...

773

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Observe que, para cada pedido, aparecem tantas linhas quantas forem os itens do pedido. Vamos analisar a sintaxe bsica do JOIN.
SELECT Campo1, Campo2, ..., Campon FROM JOIN Tabela2 ON [Tabela1].[CampoComun]= [Tabela2].[CampoComun] Tabela1

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]

INNER JOIN [Pedidos] ON [Clientes].[CdigoDoCliente]= [Pedidos].[CdigoDoCliente]

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

ANEXO 3: A LINGUAGEM SQL


SELECT [Clientes].[CdigoDoCliente], [Clientes].[NomeDaEmpresa],

[Clientes].[Cidade],[Pedidos].[NmeroDoPedido], [Pedidos].[DataDoPedido] FROM [Clientes]

LEFT OUTER JOIN [Pedidos] ON [Clientes].[CdigoDoCliente]= [Pedidos].[CdigoDoCliente] ORDER BY [Clientes].[CdigoDoCliente]

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.

Figura III.1: Utilizando LEFT OUTER JOIN.


RIGHT OUTER JOIN: Este tipo retorna todos os registros da segunda tabela e os registros relacionados da primeira tabela. Um exemplo de RIGHT OUTER JOIN:
SELECT [Clientes].[CdigoDoCliente], [Clientes].[NomeDaEmpresa], [Clientes].[Cidade],[Pedidos].[NmeroDoPedido], [Pedidos].[DataDoPedido] FROM [Clientes]

RIGHT OUTER JOIN [Pedidos] ON [Clientes].[CdigoDoCliente]= [Pedidos].[CdigoDoCliente] ORDER BY [Clientes].[CdigoDoCliente]

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Figura III.2: Utilizando RIGHT OUTER JOIN.

JOIN com Mais do que Duas Tabelas


Tambm podemos fazer um JOIN com mais do que duas tabelas. Sempre o nmero de JOINs, ser igual ao nmero de tabelas menos um. Por exemplo, se estivermos relacionando 4 tabelas, teremos trs JOINs; se estivermos relacionando trs tabelas, teremos dois JOINs, e assim por diante. Exemplo: Criar uma listagem com os campos indicados na Tabela III.3

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

ANEXO 3: A LINGUAGEM SQL


A seguir temos o comando que retorna a listagem solicitada:
SELECT [Clientes].[CdigoDoCliente], [Clientes].[NomeDaEmpresa], [Pedidos].[NmeroDoPedido],[Pedidos].[OrderDate], SUM(([Detalhes do Pedido].[Quantidade] * [Detalhes do Pedido].[PreoUnitrio]) * (1 - dbo.[Detalhes do Pedido].Desconto)) AS TotalPedido FROM [Detalhes do Pedido] INNER JOIN [Pedidos] ON [Detalhes do Pedido].[NmeroDoPedido] = [Pedidos].[NmeroDoPedido] INNER JOIN [Clientes] ON [Pedidos].[CdigoDoCliente] = [Clientes].[CdigoDoCliente] GROUP BY [Clientes].[CdigoDoCliente], [Clientes].[NomeDaEmpresa], [Pedidos].[NmeroDoPedido],[Pedidos].[OrderDate] ORDER BY [Clientes].[CdigoDoCliente]

Na listagem a seguir, temos a parte inicial do resultado retornado:


Cdigo BERGS BERGS BERGS BERGS BERGS BERGS ... NomeDaEmpresa Nmero OrderDate TotalPedido 12/8/1996 1.488,80 14/8/1996 613,20 16/12/1996 2.222,40

Berglunds snabbkp 10278 Berglunds snabbkp 10280 Berglunds snabbkp 10384 Berglunds snabbkp 10444 Berglunds snabbkp 10445 Berglunds snabbkp 10524 ... ... ...

12/2/1997 1.031,70 13/2/1997 174,90 1/5/1997 3.192,65 ...

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


ON [Detalhes do Pedido].[NmeroDoPedido] = [Pedidos].[NmeroDoPedido] INNER JOIN [Clientes] ON [Pedidos].[CdigoDoCliente] = [Clientes].[CdigoDoCliente]

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]

A seguir temos os registros iniciais retornados pela consulta anterior:

www.juliobattisti.com.br

778

ANEXO 3: A LINGUAGEM SQL


Nmero 10248 10249 10250 10251 10252 10253 ... OrderDate MaiorPreoUnitrio 1996-07-04 1996-07-05 1996-07-08 1996-07-08 1996-07-09 1996-07-10 ... ... 348.000 424.000 424.000 168.000 648.000 160.000

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)

Com este comando obtemos o seguinte resultado:


Nmero 10248 Cdigo VINET MaisRecente 1996-07-04

779

www.juliobattisti.com.br

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB


Temos um tipo especial de subconsulta chamada de Subconsulta correlacionada Correlated subqueries. Neste tipo de subconsulta a subconsulta utiliza informaes da consulta principal e executada para cada linha retornada pela consulta externa. Neste tipo de subconsulta que temos que tomar cuidados com o desempenho. Por exemplo, se a consulta principal retorna 5000 registros, a subconsulta ser executada 5000 vezes. Mais uma vez vamos utilizar um exemplo para ilustrar este conceito. Exemplo: Criar uma consulta que liste o nome de todos os funcionrios que fizeram pedidos para o Brazil, em que o campo DataDoPedido tem o ano de 1997. Para obter esta listagem, utilizamos o seguinte comando:
SELECT [Funcionrios].[Nome]+ +[Funcionrios].[Sobrenome] As NomeCompleto, CdigoDoFuncionrio FROM Employees WHERE EXISTS (SELECT * FROM [Pedidos] WHERE [Funcionrios].[CdigoDoFuncionrio]=[Pedidos].[CdigoDoFuncionrio] AND Year([DataDoPedido])=1997')

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

ANEXO 3: A LINGUAGEM SQL


Nancy Davolio Robert King Steven Buchanan 1 7 5

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

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

Tabela IV.1 Sites sobre ASP.NET. Site Descrio

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.asptoday.com www.aspfree.com

www.aspnextgen.com

www.juliobattisti.com.br

782

ANEXO 4: SITES SOBRE ASP.NET, C# E XML

Site www.4guysfromrolla.com www.411asp.net

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.developersdex.com www.dotnetexperts.com www.plusasp.com

www.superexpert.com www.superexpert.com www.aspx101.net www.asp101.com/aspplus

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

Na Tabela IV .2 temos a lista de sites indicados para C#.

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

ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB

Site www.csharptoday.com www.mastercsharp.com www.csharpindex.com www.devdex.com/csharp www.csharphelp.com www.c-sharpcorner.com www.csharp-station.com

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

ANEXO 4: SITES SOBRE ASP.NET, C# E XML

Site www.hotwired.com/webmonkey/xml/ www.w3.org/XML www.xml.com www.xmlpitstop.com msdn.microsoft.com/xml/default.asp

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

You might also like