Sunteți pe pagina 1din 0

I www.juliobattisti.com.

br
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
Site: www.juliobattisti.com.br
e-mail: webmaster@juliobattisti.com.br
ASP.NET
Uma Revoluo na
Construo de Sites e
Aplicaes Web
II 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 e-
mail: 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.
III www.juliobattisti.com.br
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.
IV www.juliobattisti.com.br
Conhea Outros Livros do Autor Jlio Battisti
Chega ao mercado editorial mais um aguardado lanamento da Axcel Books
Editora - Certificao Microsoft - Guia de Estudos Para o MCSE - Exame 70-
217, 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 Op-
erations, 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
Manual de Estudos Para o Exame 70-217 752 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.
Windows Server 2003 Curso Completo 1568 pginas
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.
V www.juliobattisti.com.br
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.
Windows XP Home & Professional 840 pginas
Manual de Estudos Para o Exame 70-290 1021 pginas
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.
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
VI www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Sumrio
Introduo: Uma Nova Revoluo no Desenvolvimento de Software? 1
Quem Deveria Ler Este Livro? 2
Equipamento e Software Necessrios 2
Instalando e Testando o IIS 5.0 4
Como Obter e Instalar o Microsoft .NET Framework SDK 9
Configuraes do Servidor Utilizado Neste Livro 12
Uma Viso Geral do Contedo do Livro 13
Hora de Comear 13
PARTE 1: O Framework .NET e a Linguagem C# 14
Captulo 1: Entendendo a Nova Proposta da Microsoft o Framework .NET 15
Introduo 15
O Primeiro Contato com o Framework .NET 16
Apresentando o Conceito de Servios Web Services 16
Apresentando o CLR Common Language Runtime 18
.NET Framework Class Library 19
Um Pequeno Parnteses Para falar mal dos Modelos Anteriores 21
Ai que Saudade do MS-DOS??? 21
Prazer. Eu Sou o Windows! 22
Redes e Internet Mais Problemas (ou Solues) Vista! 23
Modelo em 2 Camadas 23
Aplicaes em 3 Camadas 25
Aplicaes em Quatro Camadas 26
Questes a Considerarmos nos Modelos de 3 ou Mais Camadas Utilizados Atualmente 28
De Volta ao Framework .NET: os Demais Elementos 29
Linguagens Habilitadas ao .NET 29
Um Rpida Apresentao do VB.NET 30
Uma Rpida Apresentao do C# 30
Common Type System 32
Metadata 33
Assemblies 34
Interfaces com o Usurio 35
Windows Forms 35
Web Forms 36
Os Servidores .NET 37
VII www.juliobattisti.com.br
SUMRIO
SQL Server 2000 39
Exchange Server 2000 39
BizTalk Server 2000 39
Commerce Server 2000 40
Application Center 2000 40
Host Integration Server 2000 40
Internet Security and Acceleration Server 2000 40
Mobile Information 2001 Server 40
ADO.NET 41
Concluso 43
Captulo 2: Entendendo o CLR 45
Introduo 45
CLR Common Language Runtime 46
Compilar ou no Compilar, eis a Questo? 47
O Papel dos Metadados (Metadata) 47
Integrao Entre Diferentes Linguagens: Promessa ou Realidade? 47
O Processo de Execuo de Cdigo do CLR 48
Mais Algumas Observaes Sobre o JIT 49
Assemblies 50
Uma Definio em Poucas Palavras 51
Funes do Assembly 51
Componentes do Assembly 52
O que Temos no Manifesto? 54
CTS Common Type System 54
Classificao dos Tipos do CTS 55
.NET Framework Class Library Biblioteca de Classes do Framework .NET 55
Conceitos Bsicos de Orientao a Objetos 60
O que um Objeto? 61
Mensagens 62
Classes 62
Herana 64
Reutilizao de Cdigo 68
Mais Alguns Detalhes Antes de Iniciarmos a Parte Prtica 69
Concluso 72
Captulo 3: Apresentando o C# 73
Introduo 73
Mais uma Linguagem de Programao? 74
Como a cara de um Programa Escrito em C#? 75
VIII www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Tipos da Linguagem C# 82
Value Types 83
O Tipo Struct 86
Os Tipos de Enumerao 90
Reference Types 92
O Tipo String 92
O Tipo Arrays 96
Instrues de Fluxo de Controle no C# 99
Instrues de Seleo 100
A Instruo If 100
A Instruo Switch 105
Instrues de Repetio 109
A Instruo For 110
A Instruo While 114
A Instruo do/while 117
A Instruo Foreach 120
Instrues de Salto (Jump) 123
A Instruo Break 123
A Instruo Continue 123
A Instruo Goto 123
A Instruo Return 124
A Instruo Throw 124
Concluso 124
Captulo 4: Classes, Mtodos, Herana e Polimorfismo com o C# 125
Introduo 125
Operadores e Mais Operadores 126
Built-in Operators 126
Operadores Aritmticos 127
Operador de Incremento: ++ 130
Operador de Decremento 131
Operadores Relacionais e Lgicos 131
Operadores de Atribuio (Assignment) 133
Precedncia de Operadores 134
Classes 137
Para Comear um Exemplo Simples 137
Membros de uma Classe 140
Campos (Fields) 140
Mtodos (Methods) 140
Propriedades (Properties) 141
Constantes (Constants) 141
IX www.juliobattisti.com.br
SUMRIO
Indexadores (Indexers) 141
Eventos (Events) 141
Construtores e Destrutores de uma Classe 141
Modificadores Para os Membros de uma Classe 144
Adicionando Funcionalidade a uma Classe Mtodos 144
O Polimorfismo Posto em Prtica Override 155
Concluso 159
Captulo 5: Tpicos Diversos em C# 160
Introduo 160
A Classe System.Math Operaes Matemticas 161
Campos da Classe System.Math 161
Mtodos da Classe System.Math 162
A Estrutura System.DateTime Datas e Horas 174
Campos da Estrutura System.DateTime 176
Propriedades da Estrutura System.DateTime 176
O Namespace System.IO Operaes com Arquivos e Pastas 178
A Classe System.IO.File Operaes com Arquivos 178
Mtodos da Classe System.IO.File 179
A Classe System.IO.FileInfo Informaes Sobre Arquivos 182
Propriedades da Classe System.IO.FileInfo 182
O Tratamento de Excees 184
Utilizando try e catch 185
Utilizando try e finally 188
Concluso 195
PARTE 2: Fundamentos do ASP.NET 196
Captulo 6: Uma Introduo ao ASP.NET 197
Introduo 197
Mais uma Verso? 197
Uma Introduo Tecnologia ASP 198
Contedo Dinmico na Internet 200
Novidades e Melhorias do ASP.NET 202
Faz Parte do Framework .NET 202
Suporte a Mltiplas Linguagens 202
Menos Cdigo Para Mais Trabalho 203
Separao Entre o Cdigo HTML e o Cdigo ASP 203
Maiores Facilidades Para Criao e Utilizao de Componentes 207
Compatibilidade com Qualquer Navegador 207
X www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Check List Para Acompanhar os Exemplos Deste Livro 207
ASP e ASP.NET Podem Rodar no Mesmo Servidor? 209
Enfim Vamos Iniciar com ASP.NET 209
A Extenso do Arquivo Mudou .aspx 209
Inserindo Cdigo ASP.NET 210
Um Pequeno Exemplo, s Para Comear 212
Exemplo 1 212
Banco de Dados do SQL Server 2000 Para os Exemplos Deste Livro 216
O Segundo Exemplo Conectando com um Banco de Dados 216
Cad o meu Objeto Recordset? 219
Conectando com o Banco de Dados 219
Um Controle Poderoso Para Exibir os Dados 220
Posso Ter um Comando que Ultrapassa uma Linha? 220
O Bom e Velho SQL Continua o Mesmo? 220
Concluso 221
Captulo 7: HTML Server Controls 223
Introduo 223
Uma Classe Chamada Page 224
Eventos ao Carregar uma Pgina ASP.NET 224
A Classe Page 225
Os Eventos da Classe Page 225
As Propriedades da Classe Page 227
Mtodos da Classe Page 234
O Processamento de uma Pgina ASP.NET 235
Manuteno de Estado Fundamental 236
HTML Server Controls 236
Uma Definio Para HTML Server Controls 237
HTML Server Controls Disponveis 238
A Classe Base System.Web.UI.HtmlControls.HtmlControl 238
HTMLForm Control 239
HTMLInputText Control 242
HTMLInputCheckBox 244
HtmlTextArea Control 250
HTMLInputRadioButton Control 251
Controles Para a Criao de Tabelas: HtmlTable, HtmlTableRow e HtmlTableCell Controls 254
O Controle HtmlTable 254
O Controle HtmlTableRow 255
O Controle HtmlTableCell 256
Um Exemplo Prtico 256
HTMLSelect Control 263
XI www.juliobattisti.com.br
SUMRIO
HTMLAnchor Control 267
HtmlInputButton Control 269
HtmlButton Control 270
HtmlImage Control 273
Concluso 277
Introduo 279
Captulo 8: Validation Server Controls 279
Validation Controls: Definio e Propriedades Gerais 280
Como que Utilizamos os Controles de Validao? 281
A Me de Todos? Ou Seria o Pai de Todos? 282
Principais Propriedades da Classe BaseValidator 282
Principais Mtodos da Classe BaseValidator 282
Um Exemplo, s Para Comear 283
O Controle RequiredFieldValidator 287
O Controle CompareValidator 293
O Controle RangeValidator 297
O Controle CustomValidator 300
O Controle RegularExpressionValidator 305
Concluso 308
Captulo 9: Web Form Controls 309
Introduo 309
A Classe Bsica WebControl 310
Principais Propriedades da Classe WebControl 310
Principais Mtodos da Classe WebControl 311
Principais Eventos da Classe WebControl 312
TextBox Web Server Control 312
Label Web Server Control 318
CheckBox Web Server Control 320
RadioButton Web Server Control 324
Button Web Server Control 326
ListBox Web Server Control 329
Table, TableCell e TableRow Web Server Controls 331
Panel Web Server Control 337
Image Web Server Control 343
HyperLink Web Server Control 345
LinkButton Web Server Control 347
ImageButton Web Server Control 350
Concluso 353
XII 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 355
Introduo 355
Uma Viso Geral do Acesso a Dados 356
Quais as Principais Diferenas do ADO.NET em Relao ao ADO? 358
Bancos de Dados Utilizados nos Exemplos 359
O Banco de Dados do Microsoft Access NorthWind.mdb 359
O Banco de Dados do SQL Server Pubs 360
Uma Introduo ao ADO.NET 362
Informando que Voc Deseja Utilizar Classes de um Determinado Namespace 362
Classe ou Objeto; Objeto ou Classe? 363
Estabelecendo Conexes 363
Estabelecendo uma Conexo com o SQL Server 2000 SqlConnection 364
Estabelecendo uma Conexo com o Microsoft Access OleDbConnection 369
Uma Viso Geral do Processo de Acesso a Dados 374
Criando Objetos Command 376
Retornando Dados com DataAdapter 380
O Objeto DataSet 382
O Objeto DataView 388
Um Pouco Mais Sobre o Controle DataGrid 405
Primeira Maravilha do DataGrid: Paginao 405
Segunda Maravilha do DataGrid: Mais do que um Conjunto de Dados na Mesma Pgina 407
Concluso 413
Captulo 11:Acessando Bancos de Dados com ASP.NET Parte 2 414
Introduo 414
Um tal de Data Binding 415
Maneira Antiga: Criando uma Lista Dinmica com ASP 3.0 415
A Evoluo: Data Binding com ASP.NET. 418
Data Binding de Valores Simples 422
Sintaxe Para o Data Binding 422
Data Binding de Mltiplos Valores. repeated-value-binding 425
O Controle CheckBoxList 425
O Controle DropDownList 434
O Controle RadioButtonList 435
Mais um Pouco Sobre o Controle DataGrid 440
Ordenao com o Controle DataGrid 440
Filtrando Dados com o Controle DataGrid 446
O Controle DataGrid em Detalhes 456
Um Exemplo de Criao Manual de Colunas BoundColumn 460
Implementando Paginao com o Controle DataGrid 465
XIII www.juliobattisti.com.br
SUMRIO
Concluso 473
Captulo 12: Acessando Bancos de Dados com ASP.NET Parte 3 474
Introduo 474
No Esquea, Estamos em um Modelo Desconectado 475
O Objeto DataTable Alteraes nos Dados Desconectados 475
Inserindo, Excluindo e Adicionando Dados com o Objeto DataTable 477
Sincronizando Dados com o Banco de Dados 511
Excluindo Registros a Propriedade DeleteCommand 529
Adicionando Registros a Propriedade InsertCommand 531
Concluso 532
PARTE 3: Conceitos Avanados do ASP.NET e Segurana 533
Captulo 13: Web Services e Visual Studio .NET 534
Introduo 534
Uma Introduo aos Web Services 535
Possveis Utilizaes Para um Web Service 537
O que Diferencia Web Services das Tecnologias de Componentes Como COM ou CORBA? 538
Criando um Web Service 539
Sintaxe Para a Criao de um Web Service 539
Uma Maneira Fcil de Testar a Funcionalidade de um Web Service 541
Proxies: Conceito e Criao 545
Conceito 545
Criando o Proxy Utilizando o Utilitrio Wsdl.exe 546
Compilando o Arquivo CalculosLegais.cs Para Gerar a DLL Correspondente 549
Disponibilizando a DLL Para que a Mesma Possa Ser Utilizada 550
Utilizando o Web Service em uma Pgina ASP.NET 552
O Novo Ambiente Grfico de Desenvolvimento Visual Studio .NET 558
O que h de Novo no Visual Studio .NET 558
Concluso 577
Captulo 14: Segurana de Aplicaes Web com o IIS 5.0 e ASP.NET 579
Introduo 579
Autenticao de Usurios com o IIS 5.0 580
Autenticao Annima 581
Como Definir a Conta Para Acesso Annimo no IIS 5.0 583
Verificando as Configuraes da Conta Para Acesso Annimo no Windows 2000 Server 587
Configurando Permisses NTFS em Pastas do Servidor Web 592
XIV www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Sistemas de Arquivos no Windows 2000 e Permisses NTFS 593
Definindo Permisses NTFS 596
Autenticao Bsica 603
Autenticao Integrada do Windows 604
Autenticao Utilizando Certificados 605
Mapeamento do Certificado Cliente 606
Configurando o Tipo de Autenticao no IIS 606
Mais Configuraes de Segurana do IIS 610
Configurando Opes Gerais de Segurana 610
Configurando de Segurana Para Aplicativos Web no IIS 613
Definindo Restries de Acesso em Nvel de Endereo IP 615
Mecanismos de Segurana do Banco de Dados 619
O que uma Aplicao Web no IIS? 620
Uma Aplicao Cliente/Servidor Tradicional 620
Aplicaes Web um Novo Paradigma 621
O que uma Aplicao Web no IIS? 622
Configuraes de Segurana com o Arquivo Web.Config 629
Impersonation 629
O Arquivo Web.Config 630
Definindo o Tipo de Autenticao 634
Definindo os Usurios e Grupos que Tm Permisso de Acesso Aplicao 634
Concluso 639
Captulo 15: Caixa de Ferramentas do ASP.NET 641
Introduo 641
Criao de Listas Dinmicas 642
Edio de Dados com o Controle DataGrid 655
Acessando Dados de uma Planilha do Excel 667
Um Conceito Importante: Code Behind 670
O Objeto HttpRequest 675
O Objeto HttpResponse 681
Diretivas de Pgina 682
A Diretiva @Page 682
A Diretiva @Import 683
Outras Diretivas 683
Configuraes de Segurana Atravs de Programao 684
Acessando Informaes Sobre o Usurio Autenticado 684
Concluso 691
XV www.juliobattisti.com.br
SUMRIO
Captulo 16: Tratamento de Erros e Gerenciamento de Estado 693
Introduo 693
Tratamento de Erros no Framework .NET 694
Excees e a Classe Exception 694
Revisando as Estruturas Try...Catch...Finally 696
Utilizando try e catch 696
Utilizando try e finally 700
Mltiplos Blocos Catch e Tratamento de Excees Especficas 703
Um Exemplo de Tratamento de Exceo do Tipo SqlException 704
Concluso 709
ANEXO 1: Principais Tags do HTML e Criao de Contas e Grupos no Windows 2000 710
Introduo 710
Um Passeio Pelo HTML 710
Criao de Contas de Usurios e Grupos no Windows 2000 712
A Estrutura Bsica de uma Pgina HTML 712
Relao das Principais Tags do HTML Utilizadas nos Exemplos do Livro 713
As Tags Para Criao de Ttulos 713
Tags Para a Criao de Tabelas 714
Inserindo uma Linha Horizontal 717
Tags Para Formatao Bsica do Texto 717
Formatao de Fonte 719
A Tag <A></A> 720
O Conceito de Contas de Usurios no Windows 2000 722
Alterando Propriedades Importantes das Contas de Usurios 727
Definindo as Polticas de Senhas 734
Grupos de Usurios e Tipos de Grupos Existentes no Windows 2000 Server 737
Criando Grupos de Usurios e Adicionando Usurios aos Grupos 740
Introduo 745
Anexo 2: O Modelo de Dados Relacional 745
Conceitos Bsicos de Bancos de Dados Relacionais 746
Entidades e Atributos 747
O Conceito de Chave Primria 749
Relacionamentos Entre Tabelas 750
Relacionamento do Tipo Um Para Um 751
Relacionamento do Tipo Um Para Vrios 752
Relacionamento do Tipo Vrios Para Vrios 753
Integridade Referencial 754
Normalizao de Tabelas 755
XVI www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Primeira Forma Normal 755
Segunda Forma Normal 756
Terceira Forma Normal 757
Passos Para Projetar um Banco de Dados 758
Concluso 760
ANEXO 3: A Linguagem SQL 761
Introduo 761
Noes Bsicas da Linguagem SQL Structured Query Language 761
Conhecendo o SQL 761
A Instruo SELECT 762
A Instruo UPDATE 769
A Instruo INSERT 771
A Instruo DELETE 771
Comandos Avanados da Linguagem T-SQL 772
Pesquisando Dados em Mltiplas Tabelas Detalhes e Exemplos 772
Tipos de JOIN 774
JOIN com Mais do que Duas Tabelas 776
Utilizando Subconsultas 778
Concluso 781
ANEXO 4: Sites Sobre ASP.NET, C# e XML 782
Introduo 782
Concluso 785
1
INTRODUO
www.juliobattisti.com.br
I NT R ODU O
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:
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 ORA-
CLE possuem suas prprias ferramentas e iniciativas nesta direo, algumas in-
clusive em estgios bastante avanados de desenvolvimento.
A plataforma .NET a aposta da Microsoft nesta
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 encontravam-
se 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
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.
2 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
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.
NOTA: So vrias as
maneiras de se referir
nova plataforma .NET da
Microsoft: DOT.NET, .NET,
Plataforma .NET,
Iniciativa .NET, Frame-
work .NET
3
INTRODUO
www.juliobattisti.com.br
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:
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
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.
4 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-a-
dia. 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. Faa o logon no Windows 2000 Server ou Professional.
2. Abra o Painel de controle (Iniciar -> Configuraes -> Painel de controle).
3. Abra a opo Adicionar ou remover programas.
4. 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.
5
INTRODUO
www.juliobattisti.com.br
6. Surgir a janela indicada na Figura 2.
7. D um clique no boto Componentes.
8. Ser exibida, por breves instantes, uma mensagem Aguarde.... Depois surge a janela Assistente de componentes
do Windows, conforme indicado na Figura 3.
9. 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.
6 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).
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.
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.
7
INTRODUO
www.juliobattisti.com.br
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.
8 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. Abra o Internet Explorer.
2. Digite o seguinte endereo: http://localhost.
3. Deve surgir uma janela conforme indicado na Figura 7.
Figura 7: A pgina padro do IIS 5.0, logo aps a instalao.
4. Esta a pgina inicial padro, do IIS 5.0, logo aps a instalao.
5. Isto comprova que o IIS 5.0 foi instalado com sucesso.
6. 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
9
INTRODUO
www.juliobattisti.com.br
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.
10 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. Localize o arquivo MDAC_TYP_dnld.exe que voc copiou anteriormente.
2. D um clique duplo no mesmo para iniciar a instalao do MDAC 2.7.
3. Surge uma tela com o contrato de licena de uso do MDAC 2.7. D um clique no boto Yes para aceitar o contrato.
4. 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.
5. V para a pasta C:\temp e execute o arquivo MDAC_TYP.EXE.
6. 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.
11
INTRODUO
www.juliobattisti.com.br
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. 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.
9. 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. Localize o arquivo Setup.exe que voc copiou anteriormente.
2. D um clique duplo no mesmo para iniciar a instalao.
3. Surge uma tela perguntando se voc deseja iniciar a instalao. D um clique no boto Sim para seguir adiante.
4. O programa de instalao iniciar a extrao dos arquivos necessrios instalao. Este procedimento demora
alguns minutos.
5. Encerrada e extrao, surgir a tela inicial do assistente de instalao. D um clique no boto Next para seguir
para a prxima etapa.
6. Na segunda etapa voc precisa marcar a opo I accept the agreement, para aceitar o contrato de licena do
Framework .NET e seguir adiante.
7. Marque a opo I accept the agreement e d um clique no boto Next para ir para a prxima etapa.
8. 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.
12 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.
13
INTRODUO
www.juliobattisti.com.br
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 Main-
frame 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.
14 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
P A R T E
1
O Framework .NET e a Linguagem C#
15
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
C A P T U L O
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 re-
solver, 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:
CLR Common Language Runtime
Metadata
Assemblies
Linguagens habilitadas ao .NET
Common Type System
Interoperabilidade entre diferentes linguagens
Web Services
Os servidores .NET
ADO.NET
16 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.
17
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
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:
18 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 Frame-
work .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:
19
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
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.
20 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.
21
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
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 inter-
face 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.
22 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.
23
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
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.
24 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
25
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
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:
26 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
27
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
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
28 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.
29
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
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
30 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++.
31
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
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.
32 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,
33
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
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.
34 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.
35
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
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
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.
NOTA: Veremos mais
detalhes sobre assemblies
e seus elementos no
Captulo 2, onde
estaremos detalhando o
CLR Common Language
Runtime.
36 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.
37
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
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.
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
NOTA: Veremos mais
detalhes sobre a criao,
vantagens e os elementos
de Web Forms no Captulo
6 Uma Introduo ao
ASP.NET.
38 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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
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
Figura 1.11: Uma aplicao Web com ASP.NET e Web Forms.
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).
39
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
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
40 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
41
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
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
42 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.
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.
NOTA: Esta figura foi
retirada da documentao
do Framework .NET.
43
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
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
44 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.
45
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
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 mani-
festo contido em um assembly.
Na seqncia apresentaremos mais detalhes sobre o CTS Common Type Sys-
tem. 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
C A P T U L O
2
Entendendo o CLR
46 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.
47
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
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.
48 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.
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
NOTA: No final do
captulo apresentaremos
os principais conceitos de
orientao a objetos,
como por exemplo:
classes e herana.
49
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
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
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.
50 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.
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.
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.
51
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
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.
52 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 (inter-
faces 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.
53
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
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.
54 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.
55
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
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 User-
defined 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.
.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.
NOTA: Nos Captulos 3, 4
e 5 apresentaremos alguns
exemplos que ilustram a
diferena entre value types
e reference types.
56 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.
57
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
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.
58 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.
59
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
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. IIS Internet Information Server
2. LDAP Lightweight Directory Access Protocol
3. NDS Novel Directory Services
4. 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.
60 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.
61
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
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.
62 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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:
Na Figura 2.7 temos uma representao do objeto Funcionrio.
63
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
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);
}
}
64 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.
65
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
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












66 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)
67
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
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.




















68 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.
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 Frame-
work .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.
Clientes
ClienteCorrentista ClienteEmprstimos ClienteCorrentista ClienteCorrentista
69
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
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. Verifique se a opo Microsoft .NET Framework SDK foi adicionada ao menu
Programas (Iniciar -> Programas -> Microsoft .NET Framework SDK).
2. 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. Abra o Bloco de Notas (Iniciar -> Programas -> Acessrios -> Bloco de Notas).
2. Digite o cdigo indicado na Listagem 2.2:
Listagem 2.2 Hello World !
using System;
class teste
{
// Aprendendo C#.
// Um exemplo simples.
public static void Main()
{
Console.WriteLine(Testando o compilador !!!);
}
}
NOTA: Para orientaes
sobre o download e a
instalao do Framework
.NET consulte a
Introduo deste livro.
NOTA: Se voc est
utilizando o Windows
2000 em Ingls, ao invs
de Arquivo de
Programas, procure na
pasta Program Files.
70 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
3. Selecione o comando Arquivo -> Salvar como...
4 Na lista Salvar em, navegue at a pasta C:\Meus documentos.
5. Na lista Salvar como tipo:, selecione a opo Todos os arquivos.
6. No campo Nome do arquivo:, digite teste.cs
7. Sua janela deve estar conforme indicado na Figura 2.11.
8. D um clique no boto Salvar.
9. 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.
71
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
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.
72 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.
73 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
C A P T U L O
3
Apresentando o C#
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 Com-
mon 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
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
NOTA: Para maiores
detalhes sobre o CTS
consulte os Captulos 1 e 2.
74 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?
75 www.juliobattisti.com.br
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 cdigo-
fonte como ex1cap3.cs. Ao compilarmos o cdigo-fonte ser gerado um arquivo chamado ex1cap3.exe.
76 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Criando o programa ex1cap3.cs:
1. Abra o Bloco de Notas (Iniciar -> Programas -> Acessrios -> Bloco de Notas).
2. 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);
}
}
77 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
3. Selecione o comando Arquivo -> Salvar como...
4 Na lista Salvar em, navegue at a pasta C:\ExCsharp\Cap3.
5. Na lista Salvar como tipo:, selecione a opo Todos os arquivos.
6. No campo Nome do arquivo:, digite ex1cap3.cs.
7. D um clique no boto Salvar.
8. Feche o Bloco de Notas.
9. 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
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.
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.
Figura 3.1: Execuo do programa ex1cap3.exe.
78 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;
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. Ob-
serve 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 cdigo-
fonte. 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 ->);
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.
79 www.juliobattisti.com.br
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
80 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 cdigo-
fonte 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 ->);
81 www.juliobattisti.com.br
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);
82 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.
83 www.juliobattisti.com.br
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()
{
84 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.
85 www.juliobattisti.com.br
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.
Tipo Alias no C# Descrio
System.Byte byte Byte de 8 bits, sem sinal. Valor variando entre 0 e 255.
System.SByte sbyte Byte de 8 bits, com sinal. Valor variando entre
-128 e 127.
System.Int16 short Inteiro de 16 bits, com sinal. Valor variando entre
32.768 e 32.767.
System.UInt16 ushort Inteiro de 16 bits, sem sinal. Valor variando entre
0 e 65.535.
System.Int32 int Inteiro de 32 bits, com sinal. Valor variando entre
-2.147.438.648 e 2.147.438.647.
System.UInt32 uint Inteiro de 32 bits, sem sinal. Valor variando entre 0 e
4.294.967.295.
Tabela 3.1 Tipos bsicos do C# value types.
86 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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:
Tipo Alias no C# Descrio
System.Int64 long Inteiro de 64 bits, com sinal. Valor variando entre
-9.223.372.036.854.775.808 e
9.223.372.036.854.775.807.
System.UInt64 ulong Inteiro de 64 bits, sem sinal. Valor variando entre
0 e 184.467.440.737.095.551.615.
System.Char char Um nico caractere unicode com 16 bits.
System.Single float Real de 32 bits, com sinal. Valor variando entre
-3,402823E38 e 3,402823E38.
System.Double double Real de 64 bits, com sinal. Valor variando entre
-1,79769313486232E308 e 1,79769313486232E308.
System.Boolean bool Pode conter os valores True ou False.
System.Decimal decimal 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.
87 www.juliobattisti.com.br
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.
88 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 ->);
89 www.juliobattisti.com.br
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();
90 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 = 0
Segunda = 1
Tera = 2
Quarta = 3
Quinta = 4
Sexta = 5
Sbado = 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}
91 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
Neste caso os valores inteiros associados aos elementos do conjunto seriam os seguintes:
Domingo = 1
Segunda = 2
Tera = 3
Quarta = 4
Quinta = 5
Sexta = 6
Sbado = 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 = 1
Segunda = 2
Tera = 3
Quarta = 4
Quinta = 5
Sexta = 6
Sbado = 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 = 1,
Segunda = 2,
Tera = 3,
92 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Quarta = 4,
Quinta = 5,
Sexta = 6,
Sbado = 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
{
93 www.juliobattisti.com.br
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(*********************************************);
}
}
94 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 Descrio
Compare( ) 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.
CompareOrdinal( ) Compara strings desconsiderando diferenas entre idiomas, ou seja, faz uma comparao
posio a posio da string. Recebe como parmetros duas strings.
CompareTo( ) 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.
EndsWith( ) Utilizada para verificar se uma substring existe no final de uma string.
Concat( ) Concatena duas ou mais strings passadas como parmetros. Tambm podem ser passados
objetos como parmetros, desde que os mesmos possam ser avaliados como strings.
95 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
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(+++++++++++++++++++++++++++++++++++++++++++++++++++);
}
}
Mtodo Descrio
Replace( ) Substitui todas as ocorrncias de um determinado caractere por outro caractere.
ToLower( ) Converte a string para letras minsculas.
ToUpper( ) Converte a string para letras maisculas.
Trim( ) Remove os espaos em branco de uma string.
96 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).
97 www.juliobattisti.com.br
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()
98 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]);
}
}
99 www.juliobattisti.com.br
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];
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.
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.
100 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;
101 www.juliobattisti.com.br
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 ->);
102 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.
103 www.juliobattisti.com.br
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:
104 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.
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 utiliza-
se o operador ==.
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).
105 www.juliobattisti.com.br
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;
}
106 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()
{
107 www.juliobattisti.com.br
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:
108 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.
109 www.juliobattisti.com.br
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
110 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.
111 www.juliobattisti.com.br
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.
112 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
113 www.juliobattisti.com.br
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();
}
}
}
114 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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
}
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.
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.
115 www.juliobattisti.com.br
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.
116 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.
117 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
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)
Repita a execuo do programa. Agora digite 85. Voc obter os resultados indicados na Figura 3.14.
118 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
119 www.juliobattisti.com.br
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.
120 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.
121 www.juliobattisti.com.br
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
122 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.
123 www.juliobattisti.com.br
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.
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
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.
124 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.
125
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
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.
C A P T U L O
4
Classes, Mtodos, Herana e
Polimorfismo com o C#
126 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:
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-de-
interrogao: ? 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:
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.
127
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
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.
128 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
129
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
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.
130 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.
131
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
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 Descrio
== x == y Comparao. Retorna verdadeiro se x for igual a y.
!= x != y Diferente. Retorna verdadeiro se x for diferente de b.
< x < y Menor do que. Retorna verdadeiro se x for menor do que y.
> x > y Maior do que. Retorna verdadeiro se x for maior do que y.
132 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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 !);
}
Operador Exemplo Descrio
<= x <= y Menor ou igual a. Retorna verdadeiro se x for menor ou igual a y.
>= x >= y Maior ou igual a. Retorna verdadeiro se x for maior ou igual a y.
133
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
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;
134 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 = x + y
-= x - = y x = x - y
*= x * = y x = x * y
/= x / = y x = x / y
%= 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.
135
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
// 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(***********************************);
}
}
136 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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
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.
137
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
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.
138 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(**************************************************);
}
}
139
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
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
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.
140 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.
141
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
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 Frame-
work .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);
142 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
{
143
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
// 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.
144 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.
145
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
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
{
146 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(*****************************************);
}
}
147
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
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;
}
148 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)
{
149
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
// 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
150 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.
151
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
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.
152 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.
153
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
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.
154 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.
155
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
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;
}
}
156 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
157
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
// 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));
}
}
158 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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.
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));
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:
159
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
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.
160 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 Li-
brary. 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.
C A P T U L O
5
Tpicos Diversos em C#
161
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
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(****************************************);
}
}
162 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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
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.
163
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
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 -> {0},Math.Acos(-1));
Console.WriteLine(NGULO PARA COS = -0,5 -> {0},Math.Acos(-0.5));
Console.WriteLine(NGULO PARA COS = 0 -> {0},Math.Acos(0));
Console.WriteLine(NGULO PARA COS = 0.5 -> {0},Math.Acos(0.5));
Console.WriteLine(NGULO PARA COS = 1 -> {0},Math.Acos(1));
164 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 -> {0},((Math.Acos(-1)*180)/Math.PI));
Console.WriteLine(NGULO PARA COS = -0,5 -> {0},((Math.Acos(-0.5)*180)/Math.PI));
Console.WriteLine(NGULO PARA COS = 0 -> {0},((Math.Acos(0)*180)/Math.PI));
Console.WriteLine(NGULO PARA COS = 0.5 -> {0},((Math.Acos(0.5)*180)/Math.PI));
Console.WriteLine(NGULO PARA COS = 1 -> {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)
165
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
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.
166 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) retorna 7,38905609893065
System.Math.Exp(0) 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) retorna 2
System.Math.Floor(-2.3498) retorna -3 (lembre que 3 menor do que 2)
System.Math.Floor(5.0001) retorna 5
System.Math.Floor(-1.9999) retorna -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
167
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
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) retorna 2,30258509299405
System.Math. Log(100,10) retorna 2
System.Math. Log(16,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) retorna 1
System.Math. Log10(100) retorna 2
System.Math. Log10(1000) 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) retorna -6
System.Math.Min(5,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) retorna 4
System.Math.Pow(2,3) retorna 8
System.Math.Pow(2,4) retorna 16
System.Math.Pow(5,2) retorna 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).
168 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) retorna -1
System.Math.Sign(32.15) retorna 1
Mtodo Sqrt System.Math.Sqrt(nmero): Este mtodo retorna a raiz quadrada do nmero passado como
parmetro.
Ex:
System.Math.Sqrt(25) retorna 5
System.Math.Sqrt(144) 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
mtodo Tan.
Ex:
System.Math.Tan(Math.PI/3) retorna 1,73205080756888
System.Math.Tan(0) retorna 0
Vamos a um exemplo completo no qual utilizamos todos os mtodos matemticos
apresentados neste item. Considere o exemplo da Listagem 5.3
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.
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
169
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
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 -> {0},Math.Asin(-1));
Console.WriteLine(NGULO PARA SIN = -0,5 -> {0},Math.Asin(-0.5));
Console.WriteLine(NGULO PARA SIN = 0 -> {0},Math.Asin(0));
Console.WriteLine(NGULO PARA SIN = 0.5 -> {0},Math.Asin(0.5));
Console.WriteLine(NGULO PARA SIN = 1 -> {0},Math.Asin(1));
Console.WriteLine(*************************************************);
Console.WriteLine(*************************************************);
Console.WriteLine(CONVERSO DOS NGULOS PARA GRAUS);
Console.WriteLine(*************************************************);
Console.WriteLine(NGULO PARA SIN = -1 -> {0},((Math.Asin(-1)*180)/Math.PI));
Console.WriteLine(NGULO PARA SIN = -0,5 -> {0},((Math.Asin(-0.5)*180)/
Math.PI));
Console.WriteLine(NGULO PARA SIN = 0 -> {0},((Math.Asin(0)*180)/Math.PI));
Console.WriteLine(NGULO PARA SIN = 0.5 -> {0},((Math.Asin(0.5)*180)/Math.PI));
Console.WriteLine(NGULO PARA SIN = 1 -> {0},((Math.Asin(1)*180)/Math.PI));
Console.WriteLine(*************************************************);
Console.WriteLine(ANGULO PARA TAN = 3 -> {0},Math.Atan2(6,2));
Console.WriteLine(ANGULO PARA TAN = 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));
170 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-> {0},Math.Exp(2));
Console.WriteLine(e elevado na zero -> {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 -> {0},Math.IEEERemainder(10,4));
Console.WriteLine(RESTO DA DIVISO 250/6 -> {0},Math.IEEERemainder(250,6));
Console.WriteLine(RESTO DA DIVISO 10/5 -> {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 -> {0},Math.Log(100,10));
Console.WriteLine(LOG DE 16 NA BASE 2 -> {0},Math.Log(16,2));
Console.WriteLine(*************************************************);
Console.WriteLine(LOGARITMO DE 10 -> {0},Math.Log10(10));
Console.WriteLine(LOGARITMO DE 100 -> {0},Math.Log10(100));
Console.WriteLine(LOGARITMO DE 1000 -> {0},Math.Log10(1000));
Console.WriteLine(*************************************************);
Console.WriteLine(MXIMO ENTRE -5 E -6 -> {0},Math.Max(-5,-6));
Console.WriteLine(MXIMO ENTRE 5 E 6 -> {0},Math.Max(5,6));
Console.WriteLine(*************************************************);
171
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Console.WriteLine(MNIMO ENTRE -5 E -6 -> {0},Math.Min(-5,-6));
Console.WriteLine(MNIMO ENTRE 5 E 6 -> {0},Math.Min(5,6));
Console.WriteLine(*************************************************);
Console.WriteLine(2 ELEVADO NA 2 -> {0},Math.Pow(2,2));
Console.WriteLine(2 ELEVADO NA 3 -> {0},Math.Pow(2,3));
Console.WriteLine(2 ELEVADO NA 4 -> {0},Math.Pow(2,4));
Console.WriteLine(5 ELEVADO NA 2 -> {0},Math.Pow(5,2));
Console.WriteLine(*************************************************);
Console.WriteLine(ROUND EM 2,49 -> {0},Math.Round(2.49));
Console.WriteLine(ROUND EM 2,4599 -> {0},Math.Round(2.4599));
Console.WriteLine(10,4987564 COM 3 CASAS -> {0},Math.Round(10.4987564,3));
Console.WriteLine(*************************************************);
Console.WriteLine(SENO PARA 90 graus PI/2-> {0},Math.Sin(Math.PI/2));
Console.WriteLine(SENO PARA 0 graus -> {0},Math.Sin(0));
Console.WriteLine(*************************************************);
Console.WriteLine(SINAL PARA -32,15 -> {0},Math.Sign(-32.15));
Console.WriteLine(SINAL PARA 32,15 -> {0},Math.Sign(32.15));
Console.WriteLine(*************************************************);
Console.WriteLine(RAIZ QUADRADA DE 25 -> {0},Math.Sqrt(25));
Console.WriteLine(RAIZ QUADRADA DE 144 -> {0},Math.Sqrt(144));
Console.WriteLine(*************************************************);
Console.WriteLine(TANENTE PARA 60 graus PI-> {0},Math.Tan(Math.PI/3));
Console.WriteLine(TANENTE PARA 0 graus -> {0},Math.Tan(0));
}
}
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:
172 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 -> -1,5707963267949
NGULO PARA SIN = -0,5 -> -0,523598775598299
NGULO PARA SIN = 0 -> 0
NGULO PARA SIN = 0.5 -> 0,523598775598299
NGULO PARA SIN = 1 -> 1,5707963267949
*************************************************
CONVERSO DOS NGULOS PARA GRAUS
*************************************************
NGULO PARA SIN = -1 -> -90
NGULO PARA SIN = -0,5 -> -30
NGULO PARA SIN = 0 -> 0
NGULO PARA SIN = 0.5 -> 30
NGULO PARA SIN = 1 -> 90
*************************************************
NGULO PARA TAN = 3 -> 1,24904577239825
NGULO PARA TAN = 2 -> 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 -> 7,38905609893065
e elevado na zero -> 1
*************************************************
173
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
ARREDONDA UTILIZ. Floor -> 2
ARREDONDA UTILIZ. Floor -> -3
ARREDONDA UTILIZ. Floor -> 5
ARREDONDA UTILIZ. Floor -> -2
*************************************************
RESTO DA DIVISO 10/4 -> 2
RESTO DA DIVISO 250/6 -> 4
RESTO DA DIVISO 10/5 -> 0
*************************************************
LOGARITMO NATURAL DE 10 -> 2,30258509299405
LOG DE 100 NA BASE 10 -> 2
LOG DE 16 NA BASE 2 -> 4
*************************************************
LOGARITMO DE 10 -> 1
LOGARITMO DE 100 -> 2
LOGARITMO DE 1000 -> 3
*************************************************
MXIMO ENTRE -5 E -6 -> -5
MXIMO ENTRE 5 E 6 -> 6
*************************************************
MNIMO ENTRE -5 E -6 -> -6
MNIMO ENTRE 5 E 6 -> 5
*************************************************
2 ELEVADO NA 2 -> 4
2 ELEVADO NA 3 -> 8
2 ELEVADO NA 4 -> 16
5 ELEVADO NA 2 -> 25
*************************************************
ROUND EM 2,49 -> 2
ROUND EM 2,4599 -> 2
10,4987564 COM 3 CASAS -> 10,499
*************************************************
SENO PARA 90 graus PI/2-> 1
SENO PARA 0 graus -> 0
*************************************************
SINAL PARA -32,15 -> -1
174 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
SINAL PARA 32,15 -> 1
*************************************************
RAIZ QUADRADA DE 25 -> 5
RAIZ QUADRADA DE 144 -> 12
*************************************************
TANENTE PARA 60 graus PI/3 -> 1,73205080756888
TANENTE PARA 0 graus -> 0
TANENTE PARA 180 graus PI -> 1,63317787283838E+16
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);
175
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
//Exibio dos resultados
Console.WriteLine(****************************************);
Console.WriteLine(DATA E HORA ATUAIS -> {0},DateTime.Now);
Console.WriteLine(CONSTRUTOR -dia,ms,ano -> {0},constrex1);
Console.WriteLine(CONSTRUTOR -milisegundos -> {0},constrex2);
Console.WriteLine(CONSTRUTOR -d,m,a,h,min,seg -> {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.
176 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 Descrio
Date Retorna apenas a parte referente data.
Day Retorna apenas o dia.
DayOfWeek 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.
DayOfYear 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.
Hour Retorna apenas a hora.
Minute Retorna apenas o minuto.
Month Retorna apenas o ms.
Now Retorna a Data e a Hora do sistema.
Second Retorna os segundos.
Year Retorna apenas o Ano.
177
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
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 -> {0},constrex1.Hour);
Console.WriteLine(MINUTO DO SISTEMA -> {0},constrex1.Minute);
Console.WriteLine(SEGUNDOS DO SISTEMA -> {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 -> {0},constrex1.Date);
Console.WriteLine(DIA DA SEMANA -> {0},constrex1.DayOfWeek);
Console.WriteLine(DIA DO ANO ->
{0},constrex1.DayOfYear);
}
}
178 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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,
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.
179
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
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 Descrio
AppendText Anexa texto a um arquivo j existente ou cria um novo arquivo se ainda no existir o
arquivo passado como parmetro.
Copy 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.
Create Cria um arquivo em uma pasta especificada como parmetro.
Delete Exclui um arquivo passado como parmetro. Caso o arquivo no exista, ser gerada uma
exceo.
Exists Determina se o arquivo passado como parmetro existe.
GetAttributes Obtm os atributos do arquivo passado como parmetro.
GetCreationTime Retorna a data e a hora em que o arquivo foi criado.
GetLastAccessTime Retorna a data e a hora em que o arquivo foi acessado pela ltima vez.
GetLastWriteTime Retorna a data e a hora em que foram gravadas informaes no arquivo, pela ltima vez.
Move Move o arquivo para uma nova localizao.
SetAttributes Define os atributos de um arquivo.
SetCreationTime Define a informao sobre a hora e a data em que o arquivo foi criado.
SetLastAccessTime Define a informao sobre a ltima data e hora em que o arquivo foi acessado.
SetLastWriteTime Define a informao sobre a ltima data e hora em que foram feitas gravaes no
arquivo.
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.
180 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
181
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
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.
182 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 Descrio
Name Retorna o nome do arquivo.
Length Retorna o tamanho do arquivo ou pasta passado como parmetro.
183
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
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.
Propriedade Descrio
Directory Retorna uma instncia de um objeto do tipo Directory, a qual aponta para a pasta onde
est o arquivo.
DirectoryName Retorna o caminho completo para o arquivo passado como parmetro.
184 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.
185
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
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
{
186 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 -> {0},divisao);
}
// Final do bloco try.
// 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.
187
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
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.
188 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.
189
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
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.
190 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Console.WriteLine(O valor da DIVISO -> {0},divisao);
}
// Final do bloco try.
// 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.
191
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Figura 5.13: Aviso de que uma exceo foi gerada.
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.14: O cdigo do bloco finally sempre executado.
192 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();
193
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
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 -> {0},divisao);
}
// Final do bloco try.
// 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.
}
}
194 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.
195
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
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.
196 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
P A R T E
2
Fundamentos do ASP.NET
197
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
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.
Mais uma Verso?
ASP, ASP 2.0, ASP 3.0 e agora ASP.NET.
C A P T U L O
6
Uma Introduo ao ASP.NET
198 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.
199
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
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
200 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.
201
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
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.
202 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
203
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
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.
204 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)
205
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
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>
206 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.
207
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
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
208 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 Pasta
Captulo6 D:\Inetpub\wwwroot\chap6
Captulo7 D:\Inetpub\wwwroot\chap7
Captulo8 D:\Inetpub\wwwroot\chap8
Captulo9 D:\Inetpub\wwwroot\chap9
Captulo10 D:\Inetpub\wwwroot\chap10
Captulo11 D:\Inetpub\wwwroot\chap11
Captulo12 D:\Inetpub\wwwroot\chap12
Captulo13 D:\Inetpub\wwwroot\chap13
Captulo14 D:\Inetpub\wwwroot\chap14
Captulo15 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.
209
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
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.
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.
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.
NOTA: As pginas
ASP.NET tm a extenso
.aspx ao invs de .asp.
Falaremos mais sobre as
diferenas do ASP.NET em
relao ao ASP, no
prximo item.
IMPORTANTE: Se voc
estiver utilizando uma
configurao diferente
para testar os exemplos
deste livro, utilize as
configuraes do
equipamento que estiver
utilizando em substituio
s descritas neste item.
Por exemplo, sempre que
for solicitado acesso
http://www.groza.com,
substitua este endereo
pelo endereo que voc
estiver utilizando.
210 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
211
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
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 %>
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:
NOTA: Nos exemplos
deste livro estaremos
utilizando o C#. Para uma
introduo linguagem
C# consulte os Captulos
3, 4 e 5.
212 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 !!!!;
213
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
}
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.
214 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.
215
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
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. A pgina chap6ex1.aspx carregada.
2. O usurio preenche os campos Nome e Senha e d um clique no boto Enter.
3. O evento Click do boto disparado.
4. 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
216 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
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: 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).
NOTA: A partir do
Captulo 10 estaremos
tratando em detalhes da
conexo de pginas
ASP.NET com banco de
dados.
217
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
<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. %>
218 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.
219
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
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:
220 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:
221
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
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. HTML Server Controls.
2. Web Server Controls.
3. Validation Server Controls.
NOTA: No Anexo III
apresento uma reviso
dos conceitos bsicos da
linguagem SQL Struc-
tured 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.
222 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.
223
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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:
C A P T U L O
7
HTML Server Controls
224 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.
225
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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 Descrio
AbortTransaction Ocorre quando uma transao cancelada.
CommitTransaction Ocorre quando uma transao finalizada com sucesso.
DataBinding Ocorre quando um controle de servidor (Server Control) vinculado a uma fonte de dados.
Error Ocorre quando detectada uma exceo que no foi tratada.
Init Ocorre quando a pgina inicializada.
Load Ocorre quando a pgina carregada e todos os seus controles tiverem sido carregados.
PreRender Ocorre antes que qualquer informao seja enviada para o navegador do cliente.
Unload 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.
226 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.
227
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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 Descrio
Application 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.
Cache 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.
ClientTarget 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.
EnableViewState 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.
228 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Propriedade Descrio
ErrorPage Pode ser utilizada para retornar ou definir a pgina que deve ser carregada, caso seja
detectada uma exceo no tratada.
IsPostBack 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.
IsValid 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.
Request 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.
Response 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.
Server Retorna uma referncia ao objeto Server.
Session Retorna uma referncia ao objeto Session.
TraceEnabled 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.
Trace Retorna uma referncia ao objeto Trace, caso o mesmo tenha sido habilitado.
User Obtm informaes a respeito do usurio que est fazendo a requisio da pgina.
Validators Retorna uma coleo que contm todos os controles de validao da pgina.
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>
229
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
void Page_Load(Object Src, EventArgs E)
{
PrApplication.Value = Convert.ToString(Page.Application);
PrCache.Value = Convert.ToString(Page.Cache);
PrClientTarget.Value = Convert.ToString(Page.ClientTarget);
PrEnableViewState.Value = Convert.ToString(Page.EnableViewState);
Page.ErrorPage = http://localhost/erros/erro.aspx;
PrErrorPage.Value = Convert.ToString(Page.ErrorPage);
PrIsPostBack.Value = Convert.ToString(Page.IsPostBack);
PrIsValid.Value = Convert.ToString(Page.IsValid);
PrRequest.Value = Convert.ToString(Page.Request);
PrResponse.Value = Convert.ToString(Page.Response);
PrServer.Value = Convert.ToString(Page.Server);
PrSession.Value = Convert.ToString(Page.Session);
PrTrace.Value = Convert.ToString(Page.Trace);
PrUser.Value = 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>
230 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>
231
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
<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>
232 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>
233
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
</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.
234 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
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.
NOTA: Para maiores
detalhes sobre os
comandos bsicos da
linguagem HTML consulte
o Anexo I.
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.
235
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
Tabela 7.3 Mtodos da classe Page.
Mtodos Descrio
DataBind Executa uma operao de DataBind para todos os controles da pgina.
FindControl Permite que localizemos um determinado controle, na pgina.
MapPath Retorna o caminho fsico para um determinado diretrio virtual.
Validate 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 Win-
dows 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.
236 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.
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.
IMPORTANTE:Tambm
podemos desabilitar o
mecanismo de ViewState
em nvel de controle.
Veremos isso mais
adiante.
237
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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 Botao_Click(Object sender,EventArgs e)
{
if (Nome.Value == user1 && Senha.Value == senha123)
{
Message.InnerHtml = LOGON EFETUADO COM SUCESSO !!!!;
}
else
{
Message.InnerHtml = LOGON FALHOU, TENTE NOVAMENTE !!!;
}
}
</script>
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.
238 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 Descrio
Attributes Retorna uma coleo de todos os atributos do tipo pares de nome/valor contidos na
pgina .aspx, na qual est o controle.
ClientID Retorna a identificao do controle. Esta identificao gerada pelo ASP.NET e utilizada,
dentre outras coisas, para manter o estado do controle.
Disabled Utilizado para retornar ou definir um valor que indica se o controle est ou no desabilitado.
EnableViewState Utilizado para retornar ou definir um valor boleano que indica se o controle de estado
est habilitado (true) ou desabilitado (false), para o controle.
ID Utilizado para retornar ou definir um nome associado ao controle. Este nome utilizado
no cdigo para acessar as propriedades e mtodos do controle.
Page Retorna uma referncia para a pgina que contm o controle.
239
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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>
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.
Propriedade Descrio
Site Retorna informao a respeito do Web site.
Visible Utilizado para retornar ou definir um valor que indica se o controle ou no visvel.
NOTA: Para uma referncia
a todas as propriedades e
mtodos da classe
System.Web.UI.Html-
Controls.HtmlControl, consulte
a documentao do Frame-
work .NET, no item .NET
Framework Reference.
240 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 Enviar_Click(Object sender,EventArgs e)
{
Voltou.Value = Digitou.Value;
}
</script>
<body>
<form method=post runat=server>
<table>
<tr>
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.
241
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
<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.
242 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.
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 Enviar_Click(Object sender,EventArgs e)
{
Voltou.Value = Digitou.Value;
}
</script>
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.
NOTA: Apenas para lembrar, voc pode desabilitar a manuteno automtica de estado utilizando a seguinte diretiva, no incio da pgina:
<%@Page EnableViewState=false %>
243
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
Tabela 7.5 HTMLInputText Control
Tipo Descrio
Texto <input type=text>. Para a digitao de informaes como por exemplo:
nome, endereo, telefone, e-mail, etc.
Senha <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>
...
244 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
245
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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 Enviar_Click(Object sender,EventArgs e)
{
Dados.Visible = true;
//Declarao das variveis auxiliares
String Aux;
// Comeo a montar uma string que ser atribuda
// propriedade Value do controle Dados.
246 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>
247
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
<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>
248 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.
249
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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:
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.
NOTA: Para maiores
informaes sobre os
comandos bsicos da
linguagem HTML consulte
o Anexo I.
250 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
251
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
>
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.
252 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 Exibe.Value=OUTROS TIPOS DE CARTO!;
}
</script>
<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
253
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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.
254 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
255
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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>
256 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.
257
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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()
258 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>
259
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
<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.
260 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.
261
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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);
}
262 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.
263
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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.
264 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>
265
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
<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.
266 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.
267
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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
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>
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.
268 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>
269
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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
270 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";
}
271
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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>
272 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.
273
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
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
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
alt=texto exibido quando o usurio aponta o mouse para a imagem
align= top | middle | bottom | left | right
border=largura da borda
NOTA: Para uma
referncia completa a
todas as definies de
estilo existentes, consulte
www.w3.org ou
www.wdvl.com.
IMPORTANTE: Algumas
destas definies fazem
parte do HTML 4.0 e
somente funcionaro
corretamente com o
Internet Explorer 4.0 ou
superior.
274 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>
275
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
<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.
276 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;
}
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 -> Cdigo-
fonte. 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:
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.
277
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
<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:
278 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 Valida-
tion Server Controls.
279
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
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.
C A P T U L O
8
Validation Server Controls
280 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
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.
NOTA: Estudaremos o
controle
RequiredFieldValidator
em detalhes ainda neste
captulo.
281
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
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.
282 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:
283
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
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.
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
{
NOTA: O exemplo
apresentado baseado
em um exemplo da
documentao do
Framework .NET.
284 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>
285
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
<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.
286 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:
287
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
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:
288 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>
289
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
<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
290 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.
291
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
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/>
292 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.
293
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
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.
294 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)
{
295
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
// 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>
296 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 Descrio
Equal Igual a.
GreaterThan Maior do que.
GreaterThanEqual Maior ou igual a.
297
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
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>
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
Valor Descrio
LessThan Menor do que.
LessThanEqual Menor ou igual a.
NotEqual Diferente.
NOTA: Estes valores
esto definidos em uma
estrutura do tipo
Enumeration, chamada
ValidationCompareOperator.
Esta estrutura faz parte
do namespace
System.Web.UI.WebControls.
298 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.
299
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
<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>
300 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,
301
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
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
302 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.
303
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
// 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;
304 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.
305
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
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.
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.
NOTA: Para maiores
informaes sobre o
tratamento de excees e
sobre os operadores do
C#, consulte os Captulos
3, 4 e 5.
306 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>
307
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
<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}
308 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.
309
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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.
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
C A P T U L O
9
Web Form Controls
310 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.
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.
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#.
Propriedade Descrio
AccessKey utilizada para definir ou retornar uma combinao de teclas (tecla de atalho) utilizada
para colocar o foco no controle.
BackColor utilizada para definir ou retornar a cor de segundo plano, do controle.
BorderColor utilizada para definir ou retornar a cor das bordas do controle.
BorderStyle utilizada para definir ou retornar o estilo das bordas do controle.
BorderWidth utilizada para definir ou retornar a largura das bordas do controle.
ControlStyle utilizada para definir ou retornar o estilo (aspectos visuais) do controle, como por
exemplo: com ou sem preenchimento, com sombra, etc.
311
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
Propriedade Descrio
Enabled 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.
EnableViewState 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).
Font Retorna informaes sobre a fonte utilizada para o controle.
ForeColor utilizada para definir ou retornar informaes sobre a cor do texto
do controle.
Height utilizada para definir ou retornar a altura do controle.
Style Faz referncia a uma coleo de propriedades do tipo CSS
Cascading Style Sheets, associadas com o controle.
TabIndex 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.
ToolTip utilizada para definir ou retornar um pequeno texto que ser
exibido quando o usurio apontar o mouse para o controle.
Visible Propriedade boleana, utilizada para retornar ou definir um valor
que indica se o controle deve ser exibido (True) ou no (False).
Width utilizada para definir ou retornar a largura do controle.
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 Descrio
CopyBaseAttributes 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.
312 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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.
Propriedade Descrio
DataBind Faz a associao de uma fonte de dados com o controle e com todos os seus controles
filhos.
Equals Determina se duas instncias de um controle so iguais.
FindControl Procura um determinado controle no Conteiner atual. Normalmente o Conteiner atual a
pgina ASP.NET onde est o controle.
HasControls Retorna um valor Boleano indicando se o controle possui controles filhos (True) ou no
(False).
ToString Retorna uma representao do controle, no formato String.
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.
Evento Descrio
DataBinding Ocorre quando o controle ligado (associado) a uma fonte de dados.
Disposed Ocorre quando o controle descarregado da memria, o qual o ltimo estgio no ciclo
de vida do controle quando a pgina ASP.NET carregada.
Init Ocorre quando o controle inicializado, o que o primeiro estgio no seu ciclo de vida.
Load 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.
313
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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.
314 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>
315
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
<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>
316 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
317
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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 Enviar_Click(Object sender,EventArgs e)
{
Exibe.Value = Nome.Text + \n + Seus comentrios:
+ \n + Comentrios.Text;
}
Figura 9.1: Utilizando o controle TextBox com as opes SingleLine, Password e MultiLine.
318 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>
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>
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.
319
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
<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.
320 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.
321
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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;
322 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>
323
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
<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>
324 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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.
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.
325
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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.
326 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.
327
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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
/>
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
/>
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 Frame-
work .NET.
328 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.
329
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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>
<asp:ListItem value=value selected=True|False>
Texto do item.
</asp:ListItem>
</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>
NOTA: As definies dos
elementos visuais fazem
parte de uma especificao
conhecida como CSS
Cascading Style Sheets. O
estudo da definio CSS est
fora do escopo deste livro.
Para maiores informaes
sobre CSS, consulte os
seguintes endereos:
www.w3.org
www.wdvl.com
www.internet.com e
www.developer.com
NOTA:O Controle ListBox
Web Server Control
derivado da classe base
ListBox, do namespace
System.Web.UI.WebControls.
Para uma referncia
completa a todas as
propriedades e mtodos
deste controle, consulte a
documentao do Frame-
work .NET.
330 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
331
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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
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.
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.
332 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>
<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>.
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.
333
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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>
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>
<script runat=server>
void Page_Load(Object sender, EventArgs e)
{
// Declaro duas variveis.
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.
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.
334 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() + , coluna
+ i.ToString()));
r.Cells.Add(c);
}
Table1.Rows.Add(r);
}
}
</script>
</head>
<body>
<form runat=server>
<h3><font face=Verdana>Exemplo de tabela dinmica!!</font></h3>
335
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
<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() + , coluna +
i.ToString()));
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
336 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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.
Figura 9.7: Utilizando os controles Table, TableRow e TableCell chap9ex5.aspx.
337
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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 Frame-
work .NET.
338 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++)
{
339
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
// 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;
340 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.
341
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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.
342 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();
343
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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. Ob-
serve 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 Frame-
work .NET.
344 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.
345
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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 Frame-
work .NET.
346 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>
347
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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.
348 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
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>
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 Frame-
work .NET.
349
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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.
350 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 Frame-
work .NET.
351
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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.
352 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( )
Para acessar a coordenada Y, utilizamos o seguinte comando:
e.Y.ToString( )
NOTA: A origem das
coordenadas (0,0) no
canto superior esquerdo.
353
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
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.
354 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.
355
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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 Man-
agement, 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 Main-
frame, 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
C A P T U L O
10
Acessando Bancos de Dados
com ASP.NET Parte 1
356 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.
357
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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.
358 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.
359
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Figura 10.2: O Banco de
dados NorthWind.mdb
do Microsoft Access.
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.
360 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.
361
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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 Frame-
work .NET.
Figura 10.4: O diagrama Entidades x Relacionamentos do Banco de dados pubs.
362 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.
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.
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.
363
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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.
364 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 Descrio
ConnectionString 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.
ConnectionTimeOut Define por quanto tempo feita a tentativa de estabelecer a conexo. Aps o tempo
definido nesta propriedade, a tentativa cancelada e um erro gerado.
Database utilizada para definir ou retornar o nome do banco de dados que ser utilizado quando
a conexo for estabelecida.
DataSource Retorna o nome da instncia do SQL Server com a qual foi estabelecida uma conexo.
ServerVersion Retorna uma string informando a verso do servidor SQL Server com o qual a conexo foi
estabelecida.
State Retorna o estado atual da conexo.
Vamos apresentar um pequeno exemplo, onde criamos uma conexo com o Banco de dados pubs da instncia
SERVIDOR\NETSDK (conforme descrito anteriormente). Uma vez estabelecida a conexo, vamos exibir as
propriedades desta conexo em um Web Server Control do tipo TextArea. Vamos utilizar o evento Page_Load, da
pgina ASP.NET, para estabelecer a conexo com o Banco de dados pubs.
Na Listagem 10.1 temos o cdigo para o exemplo proposto.
Listagem 10.1 A classe SqlConnection chap10ex1.aspx.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.SqlClient %>
365
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
<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>
366 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.
367
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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:
368 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 Descrio
Open Abre a conexo de acordo com as definies da propriedade ConnectionString.
Close Fecha a conexo com o banco de dados.
ChangeDatabase 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.
369
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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:
370 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 OLE-
DB Provider do Microsoft Access.
Tabela 10.3 Definindo a propriedade ConnectionString para uma fonte do Microsoft Access.
Propriedade Descrio
Provider Deve ser especificado o OLE DB Provider para o Microsoft Access. Para esta propriedade
utilizamos o seguinte valor: Microsoft.Jet.OLEDB.4.0.
Data Source Informamos o caminho para o arquivo .mdb. Por exemplo, C:\\Arquivos de
programas\\NorthWind.mdb.
User ID 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.
371
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Na Tabela 10.4 temos uma descrio das principais propriedades da classe OleDbConnection:
Tabela 10.4 Principais propriedades da classe OleDbConnection.
Propriedade Descrio
Password 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.
Propriedade Descrio
ConnectionString 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.
ConnectionTimeOut Define por quanto tempo feita a tentativa de estabelecer a conexo. Aps o tempo
definido nesta propriedade, a tentativa cancelada e um erro gerado.
Database 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.
State Retorna o estado atual da conexo.
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.
372 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>
373
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
<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.
374 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 Descrio
Open Abre a conexo de acordo com as definies da propriedade ConnectionString.
Close Fecha a conexo com o banco de dados.
ChangeDatabase 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
375
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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.
376 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 Descrio
CommandText Esta propriedade utilizada para definir ou retornar o comando SQL ou o nome de um
Stored Procedure associado com o comando.
CommandTimeOut 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.
CommandType 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.
Connection Esta propriedade utilizada para definir ou retornar a conexo atravs da qual o
comando executado.
Na Tabela 10.7 temos uma descrio dos principais mtodos das classes SqlCommand/OleDbCommand:
Tabela 10.7 Principais mtodos das classes SqlCommand/OleDbCommand.
Mtodo Descrio
Cancel Cancela a execuo do comando.
CreateParameter Utilizada para a criao e definio de parmetros. Podemos utilizar parmetros quando
estamos executando um Stored Procedure ou uma consulta parametrizada do Microsoft
Access.
ExecuteNonQuery 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.
377
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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();
378 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"
379
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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.
380 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 OLE-
DB 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:
381
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
1. 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.
2. 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.
Na Tabela 10.9 temos uma descrio dos principais mtodos das classes SqlDataAdapter/OleDbDataAdapter:
Tabela 10.9 Principais mtodos das classes SqlDataAdapter/OleDbDataAdapter:
Propriedade Descrio
DeleteCommand Utilizada para definir ou retornar um comando SQL para excluso de dados, normalmente
um comando DELETE.
InsertCommand Utilizada para definir ou retornar um comando SQL para insero de novos dados,
normalmente um comando INSERT.
SelectCommand 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.
UpdateCommand Utilizada para definir ou retornar um comando SQL que atualiza dados. Normalmente um
comando UPDATE.
Mtodo Descrio
Fill 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.
FillSchema 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.
Update 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.
382 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:
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.
Evento Descrio
FillError Ocorre quando um erro retornado durante a execuo do mtodo Fill.
RowUpdated Ocorre durante uma atualizao, aps o respectivo comando ter sido executado na fonte
de dados original.
RowUpdating Ocorre durante uma atualizao, antes do respectivo comando ter sido executado na fonte
de dados original.
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.
383
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Na Tabela 10.11 temos uma descrio das principais propriedades da classe DataSet:
Tabela 10.11 Principais propriedades da classe DataSet.
Propriedade Descrio
DataSetName Utilizada para definir ou retornar o nome do DataSet.
EnforceConstraints 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.
Relations Retorna uma coleo com todos os relacionamentos existentes entre as tabelas do
DataSet.
Tables Retorna uma coleo com todas as tabelas do DataSet.
Na Tabela 10.12 temos uma descrio dos principais mtodos da classe DataSet:
Tabela 10.12 Principais mtodos da classe DataSet.
Mtodo Descrio
AcceptChanges 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.
Clear Remove todos os dados do DataSet, zerando todas as linhas de
todas as tabelas.
Clone Faz uma cpia idntica do DataSet, inclusive dos seus dados, para
um outro objeto do tipo DataSet.
GetChanges 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.
HasChanges 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.
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
384 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.
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.
IMPORTANTE: Tambm
utilizaremos um objeto do
tipo DataView que ser
detalhado mais adiante.
385
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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
386 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);
387
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Figura 10.12: Exibindo dados do Banco de dados NorthWind.mdb.
3. OleDbDataAdapter MeuDataAdapter = new OleDbDataAdapter( );
4. 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 ;
388 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);
Voc obter o resultado indicado na Figura 10.13.
NOTA: Ainda neste
captulo estudaremos o
objeto DataView e o
controle DataGrid, em
maiores detalhes.
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.
389
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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.
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:
Propriedade Descrio
AllowDelete 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.
AllowEdit 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.
AllowNew 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.
Count Retorna o nmero de registros no DataView.
390 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Na Tabela 10.14 temos uma descrio dos principais mtodos da classe DataView:
Tabela 10.14 Principais mtodos da classe DataView.
Propriedade Descrio
RowFilter Utilizada para definir ou retornar uma expresso que determina quais os dados do objeto
DataView que sero exibidos.
RowStateFilter 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.
Sort Utilizada para definir ou retornar informaes sobre a(s) coluna(s) e a ordem de
classificao dos dados.
Table Utilizada para definir ou retornar a tabela a partir da qual o DataView obtm os dados.
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.
Mtodo Descrio
AddNew Adiciona um novo registro ao DataView.
Delete Exclui um registro do DataView.
Find Localiza um determinado registro, com base no valor da chave primria.
391
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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.
392 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.
393
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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
/>
394 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.
395
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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.
396 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;
397
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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.
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; +
IMPORTANTE: Para
maiores informaes
sobre a instruo switch/
case e sobre as demais
instrues de controle de
fluxo do C#, consulte o
Captulo 3.
398 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.
399
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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>
400 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>
401
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
</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>
402 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.
403
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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.
404 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;
405
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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:
406 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
/>
407
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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>
<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;
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.
408 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
409
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
// 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
410 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.
411
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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. Utilizamos o evento Pge_Load para colocar o cdigo necessrio ao nosso exemplo.
2. 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;
412 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.
413
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
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.
414 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
C A P T U L O
11
Acessando Bancos de Dados
com ASP.NET Parte 2
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
415
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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.
416 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>
417
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
<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
418 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>
419
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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
420 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.
421
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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.
422 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 repeated-
value-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_Load(Object Src, EventArgs E )
{
Page.DataBind();
}
</script>
<body>
<form runat=server>
423
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
<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
/>
424 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_Load(Object Src, EventArgs E )
{
Page.DataBind();
}
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
425
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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-bind-
ing. 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
426 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.
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 )
{
NOTA: Existem diversas
outras propriedades para
este controle. Para
maiores informaes
consulte a classe
CheckBoxList Class, do
namespace
System.Web.UI.WebControls.
427
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
// 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 ;
428 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
429
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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.
430 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 de-
fine 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:
431
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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>
432 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.
433
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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.
434 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 Descrio
BackColor Utilizada para definir ou retornar a cor de segundo plano do controle.
BorderColor Utilizada para definir ou retornar a cor de borda do controle.
BorderWidth Utilizada para definir ou retornar o tamanho, em pixels, das bordas do controle.
DataSource Define a fonte de dados a partir da qual so gerados os itens do controle.
DataTextField Define o campo da fonte de dados, que define o texto que ser exibido para cada item.
Font Define ou retorna informaes sobre as caractersticas da fonte do controle.
AccessKey Define um atalho de teclado para colocar o foco no controle.
435
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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.
436 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.
Listagem 11.6 Um exemplo do controle RadioButtonList.
<%@ Import Namespace=System.Data %>
NOTA: Existem diversas
outras propriedades para
este controle. Para
maiores informaes
consulte a classe
RadioButtonList Class, do
namespace
System.Web.UI.WebControls.
437
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
<%@ 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.
438 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>
439
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
<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.
440 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>
<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;
NOTA: Para a criao
deste exemplo,
utilizaremos algumas
tcnicas avanadas. Todas
as tcnicas utilizadas
sero descritas aps o
cdigo do exemplo.
441
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
// 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;
442 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();
}
443
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
// 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
444 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. Page_Load
2. Busca_Dados
3. 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;
445
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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;
446 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. O evento OnSortCommand disparado.
2. Em resposta ao evento OnSortCommand, o procedimento OrdenaDados executado.
3. 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.
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.
NOTA: Para maiores
informaes sobre a classe
DataGridSortCommandEventArgs,
consulte a documentao
do Framework .NET. Esta
classe faz parte do
namespace
System.Web.UI.WebControls.
447
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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.
Tabela 11.2 Campos para o exemplo Chap11Ex8.aspx.
NOTA: Para maiores
detalhes sobre a
linguagem SQL, consulte
o Anexo III.
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>
<script language=C# runat=server>
// Declaro uma varivel do tipo String.
// Esta varivel contm o nome da coluna pela qual
Campo De qual tabela?
NmeroDoPedido Pedidos
NomeDaEmpresa Clientes
CidadeDeDestino Pedidos
PasDeDestino Pedidos
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.
448 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.
449
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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
450 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.
451
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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
452 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
453
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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. Page_Load
2. Busca_Dados
3. OrdenaDados
454 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;
455
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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;
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.
NOTA: Maiores
informaes sobre a
linguagem SQL podem ser
encontradas no Anexo III.
456 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.
457
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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
458 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>
459
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
<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 Descrio
BoundColumn 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.
ButtonColumn 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.
HyperLinkColumn Cria uma coluna com links que so associados com um campo da fonte de dados. Por
exemplo, uma coluna que exibe o nomedos funcionrios pode ter o nome como um link.
Ao clicarmos no Link ser aberta uma pgina com todas as informaes do funcionrio.
460 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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 %>
<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.
Tipo Descrio
EditCommandColumn Cria uma coluna onde podemos definir os comandos para Edio (Update), incluso (Add)
ou excluso (Remove) de registros.
TemplateColumn Utilizada para definir o layout dos controles que compem o DataGrid, a partir de
modelos para determinados elementos do HTML. Veremos exemplos mais adiante.
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.
461
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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
462 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>
463
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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. Para a primeira linha dos ttulos das colunas, aplicamos as seguintes formataes: Negrito, fonte Courier New e
cor Branca.
2. Para a primeira coluna aplicamos cor cinza para o segundo plano.
3. Para a segunda coluna aplicamos uma fonte Courier New e Itlico.
4. Para a terceira coluna aplicamos negrito e uma tonalidade de verde para a cor de segundo plano.
464 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:
465
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
<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.
466 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 Utilizada para definir
PagerStyle-BackColor A cor de segundo plano.
PagerStyle-BorderColor A cor das bordas.
PagerStyle-BorderWidth O tamanho das bordas.
PagerStyle-Font Caractersticas da fonte (Negrito, Itlico, etc.).
PagerStyle-ForeColor A cor da fonte.
PagerStyle-Mode 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.
PagerStyle-NextPageText O texto para o link que navega para a prxima pgina.
467
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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()
{
Propriedade Utilizada para definir
PagerStyle-PrevPageText O texto para o link que navega para a pgina anterior.
PagerStyle-Position 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.
468 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
469
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
// 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 ->>
470 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.
471
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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
472 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.
473
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
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.
474 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.
C A P T U L O
12
Acessando Bancos de Dados
com ASP.NET Parte 3
475
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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. Criamos um objeto OleDbConnection ou SqlConnection.
2. 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.
3. Criamos um objeto do tipo DataSet.
4. 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.
5. 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.
476 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.
Na Tabela 12.1 temos a descrio das principais propriedades da classe DataTable.
Tabela 12.1 Principais propriedades da classe DataTable.
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);
Propriedade Descrio
CaseSensitive Propriedade boleana que indica se, para comparao de Strings, ser feita distino entre
maisculas e minsculas.
Columns Retorna a coleo de colunas da tabela.
Constraints Retorna a coleo de Constraints da tabela.
DataSet Retorna o objeto DataSet a partir do qual foi criado o objeto DataTable.
PrimaryKey Utilizada para retornar ou definir um Array de colunas que atuam como Chave Primria
da tabela.
Rows Retorna a coleo de linhas da tabela.
TableName Utilizada para retornar ou definir o nome associado ao objeto DataTable.
477
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
Na Tabela 12.2 temos a descrio dos principais mtodos da classe DataTable.
Tabela 12.2 Principais mtodos da classe DataTable.
Mtodo Descrio
AcceptChanges 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.
Clear Remove todas as linhas do DataTable.
Clone Faz uma cpia da estrutura do DataTable, inclusive os relacionamentos e constraints.
Copy Faz uma cpia da estrutura e tambm dos dados do DataTable.
LoadDataRow 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.
NewRow Este mtodo utilizado para criar uma nova linha.
RejectChanges Desfaz todas as alteraes que foram feitas desde que a tabela foi inicializada ou desde a
ltima chamada do mtodo AcceptChanges.
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
478 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;
479
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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;
480 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
481
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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.
482 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";
483
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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.
484 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;
485
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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.
486 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>
487
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
<% 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
488 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:
489
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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();
490 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.
491
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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);
492 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)
{
493
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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]};
494 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 = Linha[NomeDaEmpresa].ToString();
txtEndereo.Text = Linha[Endereo].ToString();
txtTelefone.Text = Linha[Telefone].ToString();
txtPas.Text = 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]);
495
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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] = txtCdigoDoCliente.Text;
Linha[NomeDaEmpresa] = txtNomeDaEmpresa.Text;
Linha[Endereo] = txtEndereo.Text;
Linha[Telefone] = txtTelefone.Text;
Linha[Pas] = txtPas.Text;
Linha.EndEdit();
// 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;
496 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 = auxNomeDaEmpresa;
txtEndereo.Text = auxEndereo;
txtTelefone.Text = auxTelefone;
txtPas.Text = auxPas;
}
</script>
<body>
<h3><font face=Verdana>
Selecione um cliente na lista,
<BR>
para editar o registro do cliente.
</font>
</h3>
<HR>
497
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
<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"
498 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
499
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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>
500 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>
501
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
<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"
/>
502 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"
503
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
/>
</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>
504 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.
505
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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.
506 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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;
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.
507
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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.
508 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 = Linha[NomeDaEmpresa].ToString();
txtEndereo.Text = Linha[Endereo].ToString();
txtTelefone.Text = Linha[Telefone].ToString();
txtPas.Text = Linha[Pas].ToString();
509
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
Em resumo, o procedimento ClienteSelecionado faz o seguinte:
1. Oculta os controles da terceira coluna.
2. Conecta com o banco de dados.
3. Cria um objeto DataTable Clientes.
4. Localiza o registro correspondente ao cliente selecionado na lista de clientes.
5. 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] = txtCdigoDoCliente.Text;
Linha[NomeDaEmpresa] = txtNomeDaEmpresa.Text;
Linha[Endereo] = txtEndereo.Text;
Linha[Telefone] = txtTelefone.Text;
Linha[Pas] = txtPas.Text;
Linha.EndEdit();
Em seguida tornamos os controles da terceira coluna visveis e exibimos, nestes controles, o registro j alterado:
510 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 = auxNomeDaEmpresa;
txtEndereo.Text = auxEndereo;
txtTelefone.Text = auxTelefone;
txtPas.Text = auxPas;
Em resumo, o procedimento AtualizaRegistro faz o seguinte:
1. Conecta com o banco de dados.
2. Cria um objeto DataTable Clientes.
3. Localiza o registro correspondente ao cliente selecionado na lista de clientes.
4. Atribui os valores antes da edio a variveis auxiliares.
511
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
5. Edita o registro.
6. Exibe os novos valores na terceira coluna.
7. 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. Definimos uma chave primria para o objeto DataTable.
2. Criamos um objeto do tipo OleDbComandBuilder/SqlCommandBuilder. Na criao deste objeto passamos o
nome do objeto DataAdapter como parmetro.
3. 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
512 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.
513
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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;
514 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.
515
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
Linha[CdigoDoCliente] = txtCdigoDoCliente.Text;
Linha[NomeDaEmpresa] = txtNomeDaEmpresa.Text;
Linha[NomeDoContato] = txtNomeDoContato.Text;
Linha[CargoDoContato] = txtCargoDoContato.Text;
Linha[Endereo] = txtEndereo.Text;
Linha[Cidade] = txtCidade.Text;
Linha[Regio] = txtRegio.Text;
Linha[CEP] = txtCEP.Text;
Linha[Pas] = txtPas.Text;
Linha[Telefone] = txtTelefone.Text;
Linha[Fax] = 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.
516 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>
517
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
<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
518 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"
/>
519
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
</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"
520 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"
521
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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
522 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
523
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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
524 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>
525
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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.
526 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
527
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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.
528 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. Conecta com o banco de dados utilizando os comandos j vistos em exemplos anteriores.
2. 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] = txtEndereo.Text;
Linha[Cidade] = txtCidade.Text;
Linha[Regio] = txtRegio.Text;
Linha[CEP] = txtCEP.Text;
Linha[Pas] = txtPas.Text;
529
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
Linha[Telefone] = txtTelefone.Text;
Linha[Fax] = 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]};
530 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.
531
CAPTULO 12: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 3
www.juliobattisti.com.br
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] = txtEndereo.Text;
Linha[Cidade] = txtCidade.Text;
Linha[Regio] = txtRegio.Text;
Linha[CEP] = txtCEP.Text;
Linha[Pas] = txtPas.Text;
Linha[Telefone] = txtTelefone.Text;
Linha[Fax] = 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();
532 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.
533
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
P A R T E
3
Conceitos Avanados
do ASP.NET e Segurana
534 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 mostrou-
se 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 Appli-
cations 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.
C A P T U L O
13
Web Services e
Visual Studio .NET
535
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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.
536 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 Descrip-
tion 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.
537
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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.
538 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 inter-
faces 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.
539
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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 % Imposto
RS 12
SC 15
PR 17
SP 20
RJ 22
Outros 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;
540 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 = Total * (1-(Desconto/100));
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;
case RJ:
return ValorComDesconto*1.22;
break;
default:
return ValorComDesconto*1.25;
break;
}
}
}
541
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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
542 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.
543
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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"?>
544 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>
545
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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. Criao do cdigo-fonte em um arquivo .asmx (j feito).
2. Gerao de um proxy utilizando o utilitrio Wsdl.exe (prximo tpico).
3. Compilao do cdigo gerado no item 2, para a gerao da DLL representativa do Web Service.
546 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
4. Distribuio da DLL criada no item anterior, para que ela possa ser acessada atravs da Web.
5. 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 Descrio
/language:language 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#.
/protocol:protocol Opcional. Define o protocolo utilizado para invocar os mtodos do Web Service. O padro
SOAP. Tambm pode ser utilizado: HttpGet e HttpPost.
/namespace:myNameSpace Opcional. Define o namespace do Proxy gerado.
/out:filename Opcional. Define o nome do arquivo que ser gerado, contendo o proxy. O nome padro
baseado no nome do Web Service.
/username:username Opcional. Nome do usurio com o qual fazer a conexo, quando o servidor, onde est o
Web Service, requer autenticao.
/password:password Opcional. Senha para o usurio definido no parmetro anterior.
/domain:domain 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.
547
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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>
// This code was generated by a tool.
// Runtime Version: 1.0.2914.16
//
// Changes to this file may cause incorrect behavior and will be lost if
548 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]));
}
549
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
[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.
550 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.
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:
NOTA: Para uma relao
completa de todas as opes
do compilador csc, digite: csc
/? e pressione Enter.
Figura 13.8: Disponibilizando a DLL CalculosLegais.dll para uso.
551
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
1. Abra o gerenciador do IIS (Iniciar -> Programas -> Ferramentas Administrativas Gerenciador de servios de
Internet).
2. 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.
3. Nas opes que surgem d um clique no sinal de mais ao lado da opo Site da Web padro, para expandi-la.
4. Nas pastas que surgem, clique com o boto direito na pasta Chap13 e, no menu de opes, clique em Propriedades.
5. Surge a janela Propriedades de Chap13. Na guia Pasta, temos as opes para tornar Chap13 uma aplicao Web.
6. D um clique no boto Criar. Certifique-se de que as opes da guia Pasta estejam configuradas conforme indicado
na Figura 13.9.
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:
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.
552 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();
553
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
// 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 : + txtValor +\n+
Estado : + txtEstado + \n+
Desconto : + txtDesconto + \n+
********************************** + \n+
PREO FINAL : + Convert.ToString(txtValorFinal);
}
</script>
<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
554 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
555
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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
556 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;
557
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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 : + txtEstado + \n+
Desconto : + 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.
558 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. Criao do cdigo-fonte em um arquivo .asmx.
2. Testar a funcionalidade do arquivos .asmx.
3. Criar um proxy para o Web Service, utilizando o utilitrio wsdl.exe.
4. Compilar o proxy gerado no item 3, para gerar uma DLL.
5. 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.
6. Criar uma pasta bin dentro da pasta correspondente aplicao Web.
7. Copiar a DLL para dentro da pasta bin.
8. 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, faz-
se 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
559
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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
560 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. 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).
2. O Visual Studio carregado e a pgina Start Page exibida, conforme indicado na Figura 13.13.
3. 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.
4. D um clique na opo New Project. Ser aberta a janela New Project, onde podemos selecionar o tipo de
aplicao que ser criada.
5. Em Project Types, d um clique em Visual C# Projects.
6. Nas opes que so exibidas, no painel da direita, d um clique em ASP.NET Web Application.
7. No campo Name, digite: AppWebChap13.
8. No campo Location, digite: http://SERVIDOR.
9. A janela New Project deve estar com as configuraes indicadas na Figura 13.14.
Figura 13.13: Personalizando o ambiente do Visual Studio .NET.
561
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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.
562 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.
563
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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.
564 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.
565
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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
566 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.
567
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
Figura 13.23: Adicionando um novo Web Form.
3. D um clique no boto Open. A pgina Form2.aspx ser criada e exibida no Visual Studio.
4. 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. Agora que alinhamos os controles vamos configurar as diversas propriedades de cada controle.
7. Configure a propriedade Text, para os controles Label e para o controle Button, com os valores indicados na
Figura 13.24.
8. Agora vamos configurar a propriedade Id para o controle DropDownList, para os controles TextBox e para o
controle Button, conforme indicado a seguir:
DropDownList -> ID= SelecionaPais
Primeiro TextBox -> ID= Nome
Segundo TextBox -> ID= Email
Terceiro TextBox -> ID= Exibe
Controle Button - > ID= Enviar
568 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.
10. Vamos adicionar os seguintes itens para o controle DropDownList:
Argentina
Brasil
Chile
EUA
Frana
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.
569
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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.
570 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.
571
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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. 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.
3. D um clique no boto Open.
4. A primeira tela do assistente Data Form Wizard ser exibida.
5. D um clique no boto Next, seguindo para a prxima etapa do assistente.
6. Nesta etapa temos a opo de criar um novo objeto DataSet.
7. D um clique na opo Create a new dataset named: e no campo nome digite: ListaDePedidos, conforme
indicado na Figura 13.30.
572 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. D um clique no boto Next, seguindo para a prxima etapa do assistente.
9. Nesta etapa vamos definir a conexo com o banco de dados.
10. D um clique no boto New Connection. Ser exibida a janela Connection.
573
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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.
574 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 Cus-
tomers (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.
575
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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.
576 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: CompanyName
Phone
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 objListaDePedidos
OleDbConnection oleDbConnection1
OleDbDataAdapter oleDbDataAdapter1
OleDbDataAdapter 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.
577
CAPTULO 13: WEB SERVICES E VISUAL STUDIO .NET
www.juliobattisti.com.br
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.
578 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. Criao do cdigo-fonte em um arquivo .asmx.
2. Testar a funcionalidade do arquivos .asmx.
3. Criar um proxy para o Web Service, utilizando o utilitrio wsdl.exe.
4. Compilar o proxy gerado no item 3, para gerar uma DLL.
5. 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.
6. Criar uma pasta bin dentro da pasta correspondente aplicao Web.
7. Copiar a DLL para dentro da pasta bin.
8. 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.
579
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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.
C A P T U L O
14
Segurana de Aplicaes Web
com o IIS 5.0 e ASP.NET
580 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.
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
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.
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.
581
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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 Serv-
ices 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.
582 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. A conta IUSR_NOME_DO_COMPUTADOR adicionada ao grupo Convidados no computador ou do Domnio,
conforme descrito anteriormente.
2. 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. Se o acesso for permitido, a autenticao concluda e os recursos tornam-se
disponveis para o usurio.
5. 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.
583
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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. Faa o logon no Windows 2000 Server, com permisses de administrador.
2. Abra o Gerenciador do Internet Services: Iniciar -> Programas -> Ferramentas
administrativas -> Gerenciador do Internet Services.
3. Surge a janela indicada na Figura 14.2.
4. Esta a janela do console de administrao do IIS 5.0.
5. 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).
6. Surgem as opes indicadas na Figura 14.3.
7. 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,
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.
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.
584 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.
585
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
Figura 14.4: Propriedades do Site Web padro.
Figura 14.5: As opes da guia Segurana de pasta.
586 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.
587
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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
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
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. Faa o logon no Windows 2000 Server, com permisses de administrador.
2. 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.
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.
588 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 14.8: O console para Gerenciamento do computador.
4. D um clique no sinal de + ao lado da opo Ferramentas de sistema, para abri-la.
5. 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.
6. Surgem as opes indicadas na Figura 14.9.
3. Surge a janela indicada na Figura 14.8.
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.
589
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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.
590 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. Faa o logon no Windows 2000 Server, com permisses de administrador.
2. Abra o Console Configuraes locais de segurana: Programas -> Ferramentas
administrativas -> Diretivas de segurana local.
3. 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 passo-
a-passo.
Figura 14.12: Configuraes locais de segurana.
4. D um clique no sinal de + ao lado da opo Diretivas locais, para abri-la.
591
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
Figura 14.13: Atribuies de direitos para contas e grupos de usurios.
7. No painel da direita surgem as diversas permisses disponveis.
8. Na listagem de permisses, localize Efetuar logon local, conforme indicado na Figura 14.14.
5. 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.
6. Surgem as opes indicadas na Figura 14.13.
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.
592 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.
593
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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
594 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 Nvel de acesso
Leitura Permite ao usurio listar as pastas e arquivos dentro da pasta, permite que sejam exibidas
as permisses, donos e atributos.
Gravar 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.
Listar Contedo de pastas Permite ao usurio ver o nome dos arquivos e subpastas.
Ler e executar 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.
595
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
Tabela 14.2 Permisses NTFS para arquivos.
Permisso Nvel de acesso
Modificar Permite ao usurio eliminar a pasta, mais todas as aes permitidas pela permisso
Gravar e pela permisso Ler e executar.
Controle total 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.
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.
Permisso Nvel de acesso
Leitura Permite ao usurio ler o arquivo, permite que sejam exibidas as permisses, donos e
atributos.
Gravar 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.
Ler e executar Permite ao usurio executar aplicativos (normalmente programas .exe, .bat ou .com),
mais todos os direitos da permisso Leitura.
Modificar Permite ao usurio modificar e eliminar o arquivo, mais todas as aes permitidas pela
permisso Gravar e pela permisso Ler e executar.
Controle total 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.
596 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. Faa o logon com privilgios de Administrador.
2. Utilizando o Windows Explorer, localize a pasta cujas permisses NTFS sero alteradas.
3. 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.
597
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
Figura 14.17: As configuraes de segurana para a pasta selecionada.
7. 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.
8. D um clique no boto Avanado. Surge a janela indicada na Figura 14.18.
6. Surge a janela indicada na Figura 14.17.
Figura 14.18: A conta IUSR_SERVIDOR possui permisso somente para leitura.
598 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.
10. Vamos remover as permisses da conta IUSR_SERVIDOR (Conta de convidado da Internet). Para isso d um
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.
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.
599
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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. Utilizando o Windows Explorer, localize a pasta cujas permisses NTFS sero alteradas.
2. D um clique com o boto direito do mouse sobre a pasta. No menu de opes que surge d um clique em
Propriedades.
3. Na janela de propriedades d um clique na guia Segurana.
600 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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.
4. Surge a janela indicada na Figura 14.21.
Figura 14.22: A conta IUSR_SERVIDOR no aparece na lista de contas.
601
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
Figura 14.23: Adicionando novamente o usurio IUSR_SERVIDOR.
8. D um clique no boto OK. Surge uma janela pedindo para que voc defina as permisses NTFS para o usurio
IUSR_SERVIDOR.
9. Defina as permisses conforme indicado na Figura 14.24 e d um clique no boto OK.
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.24: Restaurando as permisses para o usurio IUSR_SERVIDOR.
602 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.
603
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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
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.
604 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. O navegador tenta estabelecer uma conexo usando essas informaes.
3. 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.
605
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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 Win-
dows, 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. Somente o Microsoft Internet Explorer, verso 2.0 ou posterior, oferece suporte a
esse mtodo de autenticao.
2. 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.
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
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.
606 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.
607
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
Figura 14.28: Opes de gerenciamento do IIS.
6. Neste momento podemos configurar o tipo de autenticao para todos os aplicativos Web contidos no Servidor ou
para cada aplicativo individualmente.
7. A ttulo de exemplo, vamos configurar o tipo de autenticao para o site Web padro.
8. 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.
9. 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.
2. Abra o Gerenciador do Internet Services: Iniciar -> Programas -> Ferramentas administrativas -> Gerenciador do
Internet Services.
3. aberto o console de gerenciamento do IIS.
4. D um clique duplo no nome do computador. No nosso exemplo o nome Servidor.
5. Surgem as opes indicadas na Figura 14.28.
608 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.
609
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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.
610 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. Faa o logon no Windows 2000 Server, com permisses de administrador.
2. Abra o Gerenciador do Internet Services: Iniciar -> Programas -> Ferramentas administrativas -> Gerenciador do
Internet Services.
3. aberto o console de gerenciamento do IIS.
4. D um clique duplo no nome do computador. No nosso exemplo o nome Servidor.
Figura 14.33: Configurando opes gerais de segurana para Capitulo6.
611
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
5. D um clique no sinal de + ao lado de Site Web padro. Sero exibidas as diversas pastas virtuais disponveis no servidor.
6. A ttulo de exemplo, vamos configurar as opes gerais de segurana para a pasta Capitulo6, conforme indicado
na Figura 14.33.
7. Clique com o boto direito do mouse sobre a opo Capitulo6. No menu de opes
que surge d um clique em Propriedades.
8. Ser exibida a janela Propriedades de Capitulo6.
9. 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.
612 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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.
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.
613
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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. Faa o logon no Windows 2000 Server, com permisses de administrador.
2. Abra o Gerenciador do Internet Services: Iniciar -> Programas -> Ferramentas administrativas -> Gerenciador do
Internet Services.
3. aberto o console de gerenciamento do IIS.
4. D um clique duplo no nome do computador. No nosso exemplo o nome Servidor.
5. D um clique no sinal de + ao lado de Site Web padro. Sero exibidas as diversas pastas virtuais disponveis no
servidor.
6. A ttulo de exemplo, vamos configurar as opes de aplicao para a pasta Capitulo6.
7. Clique com o boto direito do mouse sobre a opo Capitulo6. No menu de opes
que surge d um clique em Propriedades.
8. Ser exibida a janela Propriedades de Capitulo6.
9. Certifique-se de que esto sendo exibidas as opes da guia Pasta.
10. Na parte de baixo da guia Pasta, temos um grupo de opes chamado Configuraes
do aplicativo. Abaixo temos uma descrio de cada uma destas opes.
NOTA: Caso voc no
tenha criado uma pasta
virtual Captulo6, utilize
qualquer pasta virtual
disponvel no seu
servidor IIS.
614 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.
615
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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. Faa o logon no Windows 2000 Server, com permisses de administrador.
2. Abra o Gerenciador do Internet Services: Iniciar -> Programas -> Ferramentas administrativas -> Gerenciador do
Internet Services.
3. aberto o console de gerenciamento do IIS.
4. D um clique duplo no nome do computador. No nosso exemplo o nome Servidor.
5. 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. Ser exibida a janela Propriedades de Site Web padro.
7. D um clique na guia Segurana de pasta.
616 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.
617
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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.
618 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.
619
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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.
620 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.
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
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).
621
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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.
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.
NOTA: Para maiores
detalhes sobre os modelos
de aplicao de 2 ou mais
camadas, consulte os
Captulos 1 e 2.
622 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.
623
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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. Faa o logon no Windows 2000 Server, com permisses de administrador.
2. Abra o Gerenciador do Internet Services: Iniciar -> Programas -> Ferramentas administrativas -> Gerenciador do
Internet Services.
3. 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.
624 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 14.46: Opes de gerenciamento do IIS.
7. 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.
8. Sero exibidas todas as pastas virtuais disponveis no servidor IIS, conforme indicado na Figura 14.47.
4. Esta a janela do console de administrao do IIS 5.0.
5. D um clique duplo no nome do computador. No nosso exemplo o nome Servidor.
6. Surgem as opes indicadas na Figura 14.46.
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.
625
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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.
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.
626 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.
627
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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.
628 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
voc deseje pode alterar para JScript. Tambm podemos especificar o nome de
qualquer outra linguagem para a qual tenhamos o interpretador instalado no
servidor IIS, como por exemplo Perl. Esta opo define a linguagem que ser
utilizada para interpretar os comandos dentro das tags <% e %>.
Tempo limite do script ASP: Especifica o perodo de tempo durante o qual o
ASP permitir a execuo de um script. Se a execuo do script no terminar ao
final do perodo de tempo limite, o ASP ir parar o script e gravar um evento no
log de eventos do Windows 2000. Voc pode definir o perodo de tempo limite
como um valor entre 1 e 2147483647, alm de poder substituir essa opo em uma pgina ASP usando o
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.
IMPORTANTE: Se voc
ativar essa opo, no
fornea acesso de
execuo aos diretrios
pai; caso contrrio, um
script poder tentar
executar um programa
no autorizado em um
diretrio pai.
Figura 14.52: Opes da guia Depurao de aplicativo.
629
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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
630 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.
631
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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
Set compilation debug=true to enable ASPX debugging. Otherwise, setting
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
/>
<! AUTHENTICATION
This section sets the authentication policies of the application. Possible modes
are
Windows, Forms,
Passport and None
>
<authentication mode=None />
632 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. If
pageOutput=true, the
trace information will be displayed at the bottom of each page. Otherwise,
you can view the
application trace log by browsing the trace.axd page from your web appli-
cation 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.
633
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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>
634 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:
635
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
<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.
636 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 au-
thentication, 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
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 />
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.
637
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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:
638 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 gerentesMembros do grupo: user1
user2
user3
user4
user5
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> </au-
thorization>, 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 users=* />
</authorization>
639
CAPTULO 14: SEGURANA DE APLICAES WEB COM O IIS 5.0 E ASP.NET
www.juliobattisti.com.br
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 users=GROZA\user2,GROZA\user5 />
</authorization>
</system.web>
</location>
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?
640 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.
641
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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 Frame-
work .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.
C A P T U L O
15
Caixa de Ferramentas
do ASP.NET
642 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;
643
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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;
644 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 Where PasDeDestino=;
auxSQL2 = ListaPaises.SelectedItem.Value + Group By CidadeDeDestino
Order
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)
645
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
{
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);
646 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 = Linha[NmeroDoPedido].ToString();
txtCdigoDoCliente.Text = Linha[CdigoDoCliente].ToString();
txtDataDoPedido.Text = Linha[DataDoPedido].ToString();
txtFrete.Text = Linha[Frete].ToString();
txtNomeDoDestinatrio.Text = Linha[NomeDoDestinatrio].ToString();
txtPasDeDestino.Text = Linha[PasDeDestino].ToString();
txtCidadeDeDestino.Text = Linha[CidadeDeDestino].ToString();
}
}
</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>
647
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
<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
648 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
649
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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
650 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
651
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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
652 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.
653
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
Figura 15.1: Lista de pases j preenchida.
Figura 15.2: Selecionando uma cidade.
654 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.
655
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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);
656 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.
657
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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 = ((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;
DataRow Linha = authors.Rows.Find(txtCodAutor);
// Agora vamos editar o valor da linha.
658 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Linha.BeginEdit();
Linha[au_id]= txtCodAutor;
Linha[au_fname] = txtNome;
Linha[au_lname] = txtSobreNome;
Linha[phone] = txtTelefone;
Linha.EndEdit();
// 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
659
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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
>
660 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
>
661
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
</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.
662 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.
663
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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
/>
664 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();
}
665
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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.
666 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. Criamos um objeto DataTable.
2. Definimos uma chave primria para este objeto.
3. Localizamos a linha correspondente ao cdigo do autor que est sendo editado.
4. Atualizamos a linha no objeto DataTable.
5. 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.
667
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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();
668 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.
669
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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);
670 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
671
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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; +
672 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
673
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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>
674 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.
675
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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 Descrio
AcceptTypes Retorna um Array de strings, com todos os Mime Types aceitos pelo navegador do cliente.
ApplicationPath Retorna uma String, indicando o caminho virtual para a pastaraiz da aplicao.
Browser Retorna um objeto do tipo HttpBrowserCapabilities. As propriedades deste objeto
fornecem informaes sobre o navegador do cliente.
676 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Propriedade Descrio
Browser Retorna um objeto do tipo HttpBrowserCapabilities. As propriedades deste objeto
fornecem informaes sobre o navegador do cliente.
ClientCertificate Retorna um objeto do tipo HttpClientCertificate. As propriedades deste objeto fornecem
informaes sobre o certificado de segurana do Cliente.
ContentLength Retorna o tamanho, em bytes, da requisio enviada pelo cliente.
ContentType Retorna uma string indicando o tipo do contedo requisitado pelo cliente.
Cookies Retorna uma coleo de Cookies, enviados na requisio do cliente.
HttpMethod Retorna o mtodo HTTP de transferncia utilizado pelo cliente. Pode ser: GET, POST ou
HEAD.
IsSecuryConnection Retorna True se a conexo est utilizando HTTPS (sockets seguros) e False, caso contrrio.
Path Retorna o caminho virtual da requisio atual.
PhysicalPath Retorna o caminho fsico correspondente a URL contida na requisio.
QueryString Nos d acesso s variveis passadas na prpria URL, quando utilizado o mtodo GET
para enviar as informaes contidas no campo de um formulrio.
Url Retorna informaes sobre a URL da requisio atual.
UserAgent Retorna uma string que identifica o navegador do Cliente. Porexemplo: MSIE identifica
o Internet Explorer da Microsoft.
UserHostAddres Retorna o nmero IP da estao do cliente.
UserHostName 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>);
677
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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.
678 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 )
{
679
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
// 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;
680 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.
681
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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 Descrio
Buffer 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.
BufferOutput 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.
Cache Retorna um objeto do tipo HttpCachePolicy com informaes sobre as configuraes de
cache para a resposta atual.
Cookies Retorna a coleo de Cookies contida na resposta para o navegador do cliente.
Write 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.
682 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.
683
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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-
684 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 -> Direc-
tive 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.
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.
NOTA: Para maiores
informaes sobre a
criao de usurios,
criao de grupos e adio
de usurios a grupos,
consulte o Anexo I.
685
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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 Descrio
AuthenticationType Retorna o tipo de autenticao.
IsAuthenticated Retorna true se o usurio foi autenticado com sucesso e false, caso contrrio.
Name Retorna o nome do usurio autenticado.
O tipo de objeto IDentity retornado diferente, para os diferentes tipos de identificao. Para a autenticao Win-
dows, 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>
686 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.
687
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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.
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).
688 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
tring NomeDoUsuario = User.Identity.Name;
tring TipoDeAutenticacao = User.Identity.AuthenticationType;
/ Verifico se o usurio pertence ao grupo Gerentes.
f (User.IsInRole(GROZA\\Gerentes))
{
MostraNome.Text = Sr. Gerente: + NomeDoUsuario + , seja bem
vindo!;
MostraTipo.Text = Voc est autenticado usando: + TipoDeAutenticacao;
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 = Prezado Funcionrio: + NomeDoUsuario +
, seja bem vindo!;
MostraTipo.Text = Voc est autenticado usando: + TipoDeAutenticacao;
Mensagem.Text = VOC NO TEM PERMISSO PARA ACESSAR AS
INFORMAES DE CLEINTES!;
}
}
</script>
<body>
689
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
<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
690 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: suser2
Senha: abc12345
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.
691
CAPTULO 15: CAIXA DE FERRAMENTAS DO ASP.NET
www.juliobattisti.com.br
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: suser3
Senha: abc12345
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 = User.Identity.Name;
string TipoDeAutenticacao = 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.
692 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.
693
CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO
www.juliobattisti.com.br
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.
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
C A P T U L O
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.
694 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
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.
NOTA: Para maiores
informaes sobre as
estruturas
Try...Catch...Finally,
consulte o Captulo 5.
695
CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO
www.juliobattisti.com.br
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 Descrio
HelpLink Define ou retorna um link para um arquivo de ajuda associado com a exceo.
InnerException 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.
MessageProperty Retorna a mensagem associada com a exceo.
TargetSite Retorna o nome do mtodo original, onde foi inicialmente disparada a exceo.
ToString Retorna o nome completo da exceo, a mensagem de erro, e outras informaes sobre
a exceo.
696 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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
NOTA: Veremos
exemplos dos usos destas
propriedades nos
exemplos prticos, mais
adiante neste captulo.
697
CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO
www.juliobattisti.com.br
{
// 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 -> {0},divisao);
}
// Final do bloco try.
// Incio do bloco catch.
// Cdigo que ser executado se uma exceo
// for gerada no bloco try.
698 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 Mes-
sage, 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.
699
CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO
www.juliobattisti.com.br
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
700 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();
701
CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO
www.juliobattisti.com.br
// Clculo da diviso.
divisao = Convert.ToInt32(Aux1) / Convert.ToInt32(Aux2);
// Exibio dos resultados.
Console.WriteLine(O valor da DIVISO -> {0},divisao);
}
// Final do bloco try.
// 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 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.
702 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.
703
CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO
www.juliobattisti.com.br
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
// 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.
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.
704 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,
705
CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO
www.juliobattisti.com.br
// 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)
{
706 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.
707
CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO
www.juliobattisti.com.br
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>
708 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.
709
CAPTULO 16: TRATAMENTO DE ERROS E GERENCIAMENTO DE ESTADO
www.juliobattisti.com.br
No primeiro bloco Catch retornamos as seguintes mensagens:
1. Iniciando o tratamento da exceo do tipo SqlException.
2. 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>);
}
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
NOTA: Para maiores
informaes sobre Web
Server Controls, consulte
os Captulos 7, 8 e 9.
710 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.
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.
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>
ANEXO
1
Principais Tags do HTML
e Criao de Contas e
Grupos no Windows 2000
711
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
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.
712 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.
713
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
<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>
714 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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
Na Figura I.1 temos o resultado desta pgina.
715
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
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%>
716 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>
717
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
<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>
718 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
719
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
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">
720 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>
721
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
<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.
722 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.
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 Ac-
counts (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: Tambm
utilizamos as tags
<ul></ul> e <li></li>
para a criao de uma
lista com bullets.
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).
723
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
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:
Tabela I.1 Contas de Usurios do Domnio CARUNCHO
IMPORTANTE: Para as
senhas, o Windows 2000
Server distingue letras
maisculas de minsculas.
Por exemplo a senha
Abc123 diferente da
senha abc123.
Para criar a Conta para o usurio Jos da Silva:
1. Efetue o logon como Administrador.
2. D um clique no boto Iniciar, aponte para Programas e, dentro de Programas, aponte para Ferramentas
administrativas.
3. 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.
Nome da conta Senha Nome completo
jsilva senha123 Jos da Silva
maria maria123 Maria do Socorro
paulo paulo123 Paulo Pereira
724 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. 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.
6. 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.
725
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
Figura I.9: Criando o usurio jsilva.
8. D um clique no boto Avanar para ir para a prxima etapa.
9. 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.
726 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.
727
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
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. Feche todos os aplicativos que voc tiver aberto.
2. D um clique no boto Iniciar e depois na opo Desligar.
3. Surge a janela Desligar o Windows.
4. Na lista escolha Efetuar logoff de Administrador e d um clique em OK.
5. Em poucos instantes o logoff efetuado e o Windows 2000 Server volta a mostrar a tela inicial de logon.
6. Pressione Ctrl+Alt+Del.
7. Na tela que surge, no campo Nome do usurio, digite jsilva.
8. No campo Senha digite senha123.
9. 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. Efetue o logon como Administrador.
2. D um clique no boto Iniciar, aponte para Programas e dentro de Programas aponte para Ferramentas
administrativas.
3. No menu que surge, d um clique na opo: Usurios e computadores do Active Directory.
4. Ser inicializado o MMC e carregado o Snap-In para Gerenciamento do Diretrio.
5. 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.
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.
728 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
6. 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.
7. 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. Digite as informaes para os campos Descrio, Escritrio, Telefone e Correio eletrnico, conforme indicado na
Figura I.12.
9. 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.
729
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
Para alterar propriedades importantes do usurio jsilva:
1. Efetue o logon como Administrador.
2. D um clique no boto Iniciar, aponte para Programas e dentro de Programas aponte para Ferramentas
administrativas.
3. 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. 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).
5. Abaixo de caruncho.com surgem diversas opes.
6. D um clique na opo Users. No painel da direita exibida uma listagem com o nome de todos os usurios
cadastrados.
7. 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.
730 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.
731
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
Figura I.15: Configurando os horrios de logon permitidos.
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.
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.
732 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.
733
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
Figura I.18: Adicionando computadores lista.
Exemplo: Vamos aprender a renomear uma conta de usurio.
Para renomear uma conta de usurio:
1. Efetue o logon como Administrador.
2. D um clique no boto Iniciar, aponte para Programas e dentro de Programas aponte
para Ferramentas administrativas.
3. No menu que surge, d um clique na opo: Usurios e computadores do Active
Directory.
4. Ser inicializado o MMC e carregado o Snap-In para Gerenciamento do Diretrio.
5. 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).
6. Abaixo de caruncho.com surgem diversas opes.
7. 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.
8. Localize o usurio Jos da Silva e d um clique duplo sobre o mesmo para abrir as
propriedades da conta deste usurio.
9. 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.
734 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.
735
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
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. Efetue o logon como Administrador.
2. D um clique no boto Iniciar, aponte para Programas e dentro de Programas aponte para Ferramentas
administrativas.
3. No menu que surge, d um clique na opo: Diretivas de segurana do domnio.
4. Ser inicializado o MMC e carregado o Snap-In que permite que sejam configurados vrios aspectos de segurana
para o domnio.
5. D um clique no sinal de + ao lado da opo Windows Settings (Configuraes do Windows), para abri-la.
6. 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. D um clique no sinal de + ao lado da opo Accounts Policies para abri-la.
8. 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.
9. 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.
736 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.
737
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
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.
738 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.
739
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
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.
740 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. Faa o logon com Administrador.
2. D um clique no boto Iniciar, aponte para Programas e aponte para Ferramentas administrativas.
3. No menu de opes que surge, d um clique na opo Usurios e computadores do Active Directory.
4. Surge o console para criao de contas de usurios e grupos.
5. 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.
6. 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.
741
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
7. D um clique no boto OK para criar o grupo.
8. Voc estar de volta ao console Usurios e computadores do Active Directory.
9. 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. Faa o logon com Administrador.
2. D um clique no boto Iniciar, aponte para Programas e aponte para Ferramentas administrativas.
3. No menu de opes que surge, d um clique na opo Usurios e computadores do Active Directory.
4. Surge o console para criao de contas de usurios e grupos.
5. 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. 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.
7. Para adicionar membros ao grupo, d um clique no boto Adicionar.
Figura I.26: Alterando as propriedades do Grupo1.
742 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.
743
ANEXO 1: PRINCIPAIS TAGS DO HTML E CRIAO DE CONTAS E GRUPOS NO WINDOWS 2000
www.juliobattisti.com.br
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.
744 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
745
ANEXO 2: O MODELO DE DADOS RELACIONAL
www.juliobattisti.com.br
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 no-
vas 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
746 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:
747
ANEXO 2: O MODELO DE DADOS RELACIONAL
www.juliobattisti.com.br
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.
748 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 indi-
vidual 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.
749
ANEXO 2: O MODELO DE DADOS RELACIONAL
www.juliobattisti.com.br
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.
750 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
751
ANEXO 2: O MODELO DE DADOS RELACIONAL
www.juliobattisti.com.br
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
752 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.
753
ANEXO 2: O MODELO DE DADOS RELACIONAL
www.juliobattisti.com.br
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.
754 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
755
ANEXO 2: O MODELO DE DADOS RELACIONAL
www.juliobattisti.com.br
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
756 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.
757
ANEXO 2: O MODELO DE DADOS RELACIONAL
www.juliobattisti.com.br
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.
758 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.
759
ANEXO 2: O MODELO DE DADOS RELACIONAL
www.juliobattisti.com.br
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
760 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.
761
ANEXO 3: A LINGUAGEM SQL
www.juliobattisti.com.br
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.
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
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.
762 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 palavras-
chave 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.
763
ANEXO 3: A LINGUAGEM SQL
www.juliobattisti.com.br
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 Descrio
campo1, campo2, ... campon Nome dos campos a serem retornados a partir de uma ou mais tabelas.
nome_da_tabela Nome da tabela a partir da qual os dados devem ser recuperados.
WHERE Permite que sejam especificados critrios de pesquisa.
GROUP BY 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.
HAVING Especifica critrios para serem utilizados juntamente com Group By.
ORDER 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.
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
764 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
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.
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.
765
ANEXO 3: A LINGUAGEM SQL
www.juliobattisti.com.br
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.
766 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.
767
ANEXO 3: A LINGUAGEM SQL
www.juliobattisti.com.br
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.
768 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.
769
ANEXO 3: A LINGUAGEM SQL
www.juliobattisti.com.br
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.
770 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
771
ANEXO 3: A LINGUAGEM SQL
www.juliobattisti.com.br
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.
772 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 Trans-
act-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.
773
ANEXO 3: A LINGUAGEM SQL
www.juliobattisti.com.br
Tabela III.2 Campos Tabelas
Campo Tabela
NmeroDoPedido Pedidos
DataDoPedido Pedidos
CdigoDoProduto Detalhes do Pedido
PreoUnitrio Detalhes do Pedido
Quantidade 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 [Detalhes do Pedido]
JOIN
[Pedidos]
ON
[Detalhes do Pedido].[NmeroDoPedido] = [Pedidos].[NmeroDoPedido]
Observe que estamos utilizando a sintaxe [NomeDaTabela].[NomeDoCampo].
O resultado parcial indicado na listagem a seguir:
NmeroDoPedidoDataDoPedido Cdigo PreoUnitrio
10248 4/7/1996 11 14 12
10248 4/7/1996 42 9,8 10
10248 4/7/1996 72 34,8 5
10249 5/7/1996 14 18,6 9
10249 5/7/1996 51 42,4 40
10250 8/7/1996 41 7,7 10
10250 8/7/1996 51 42,4 35
10250 8/7/1996 65 16,8 15
... ... ... ...
774 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 Tabela1
JOIN
Tabela2
ON
[Tabela1].[CampoComun]= [Tabela2].[CampoComun]
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:
775
ANEXO 3: A LINGUAGEM SQL
www.juliobattisti.com.br
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]
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).
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.\
776 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 Tabela
CdigoDoCliente Clientes
NomeDaEmpresa Clientes
NmeroDoPedido Pedidos
DataDoPedido Pedidos
TotalPedido ([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.
777
ANEXO 3: A LINGUAGEM SQL
www.juliobattisti.com.br
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 NomeDaEmpresa Nmero OrderDate TotalPedido
BERGS Berglunds snabbkp 10278 12/8/1996 1.488,80
BERGS Berglunds snabbkp 10280 14/8/1996 613,20
BERGS Berglunds snabbkp 10384 16/12/1996 2.222,40
BERGS Berglunds snabbkp 10444 12/2/1997 1.031,70
BERGS Berglunds snabbkp 10445 13/2/1997 174,90
BERGS Berglunds snabbkp 10524 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]
778 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:
779
ANEXO 3: A LINGUAGEM SQL
www.juliobattisti.com.br
Nmero OrderDate MaiorPreoUnitrio
10248 1996-07-04 348.000
10249 1996-07-05 424.000
10250 1996-07-08 424.000
10251 1996-07-08 168.000
10252 1996-07-09 648.000
10253 1996-07-10 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 Cdigo MaisRecente
11077 RATTC 1998-05-06
11076 BONAP 1998-05-06
11075 RICSU 1998-05-06
11074 SIMOB 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 Cdigo MaisRecente
10248 VINET 1996-07-04
780 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. 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.
2. A consulta interna (segundo SELECT) utiliza o valor passado pela consulta externa e executa o comando SE-
LECT da subconsulta.
3. Aps a execuo, a subconsulta retorna o seu resultado para a consulta principal.
4. 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 Cdigo
Andrew Fuller 2
Anne Dodsworth 9
Janet Leverling 3
Laura Callahan 8
Margaret Peacock 4
Michael Suyama 6
781
ANEXO 3: A LINGUAGEM SQL
www.juliobattisti.com.br
Nancy Davolio 1
Robert King 7
Steven Buchanan 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
782 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.
Tabela IV.1 Sites sobre ASP.NET.
ANEXO
4
Sites Sobre ASP.NET, C# e
XML
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.
www.123aspx.com 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.
www.aspnextgen.com timo site com lies gratuitas sobre os aspectos
bsicos do ASP.NET.
www.asptoday.com Site pago. A assinatura anual custa U$ 50,00. Contm uma
grande quantidade de artigos e tutoriais sobre ASP.NET.
www.aspfree.com Link para artigos, sites, componentes. Links para
assuntos diversos como SOAP, PHP, XML, C# e .NET em
geral.
www.aspnextgen.com timo site com lies gratuitas sobre os aspectos bsicos
do ASP.NET.
783
ANEXO 4: SITES SOBRE ASP.NET, C# E XML
www.juliobattisti.com.br
Site Descrio
www.4guysfromrolla.com 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.
www.411asp.net 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.
www.developersdex.com Bom site com informaes sobre ASP, ASP.NET, C#
(melhor rea do site), XML, SOAP, ADSI e VB.
www.dotnetexperts.com Uma comunidade de especialistas em .NET, onde so publicados artigos sobre
ASP.NET, XML, SOAP, C#, alm de links para diversos outros sites relacionados.
www.plusasp.com Site interessante com diversos exemplos prticos.
Cdigo dos exemplos disponvel. Explicaes
detalhadas sobre cada exemplo.
www.superexpert.com Site com tutoriais, artigos e links sobre ASP, ASP.NET e Web Services.
www.superexpert.com Excelente site. Com muitos artigos, links e informaes sobre: ASP, ASP.NET, PHP,
Java, Java Script e CGI. Eu recomendo.
www.aspx101.net Maravilhoso. Artigos, Revistas, links, tutoriais. Tudo muito bem organizado e fcil de
localizar. Destaque para informaes sobre Web Services. Eu recomendo.
www.asp101.com/aspplus Bom site. Com links para artigos divididos por
categoria. Tambm contm links para outros sites
sobre ASP.NET.
www.aspwire.com Bom site. Com artigos, dicas e tutoriais. Bom design e navegao intuitiva.
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.
www.aspnetpro.com Revista sobre ASP.NET com links para grupos de discusso.
Na Tabela IV.2 temos a lista de sites indicados para C#.
Tabela IV.2 Sites sobre C#.
Site Descrio
www.csharp.net Excelente portal sobre C#. Links para artigos, tutoriais, cdigos gratuitos e outros sites
com informaes sobre C#. Excelente site. Eu recomendo.
784 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
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 Descrio
www.csharptoday.com Site pago. A assinatura anual custa U$ 50,00. Contm uma grande quantidade de artigos
e tutoriais sobre C#.
www.mastercsharp.com Bom site. Com artigos, e links para C#, ADO.NET, VB.NET e demais tecnologias .NET.
www.csharpindex.com Excelente. Tutoriais, links para outros sites sobre C#. Exemplos divididos por categorias,
componentes, Web Services, XML, SOAP e .NET em geral. Eu recomendo.
www.devdex.com/csharp Excelente. Tutoriais, links para outros sites sobre C#. Exemplos divididos por categorias,
componentes, Web Services, XML, SOAP e .NET em geral. Eu recomendo.
www.csharphelp.com timo. Suporte a dvidas, cdigo, exemplos, tutoriais, Base de Conhecimentos sobre C#,
links para outros sites e novidades sobre .NET. Eu recomendo.
www.c-sharpcorner.com timo. Site gratuito para desenvolvedores .NET que utilizam C#. Contm artigos, cdigo-
fonte, tutoriais e grupos de discusso.
www.csharp-station.com Contm links e tutoriais. Bom site.
Site Descrio
www.xml.org Excelente portal sobre XML. Links para artigos, tutoriais e outros sites sobre XML. Eu
recomendo.
www.vbxml.com Bom site. Links, artigos, tutoriais e muita informao para programadores VB e ASP/
ASP.NET, que trabalham com XML.
www.wdvl.com Excelente site sobre uma variedade de tecnologias para desenvolvimento Web. Excelentes
artigos e tutoriais sobre XML.
785
ANEXO 4: SITES SOBRE ASP.NET, C# E XML
www.juliobattisti.com.br
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.
Site Descrio
www.hotwired.com/webmonkey/xml/ Links, artigos e timos tutoriais. Ideal para quem est iniciando no estudo do XML.
www.w3.org/XML Site com a especificao oficial para o XML. Eu recomendo.
www.xml.com Um portal com grande quantidade de informaes sobre XML. Excelente. Eu
recomendo.
www.xmlpitstop.com Outro excelente portal com grande quantidade de informaes sobre XML. Eu
recomendo.
msdn.microsoft.com/xml/default.asp Site da Microsoft sobre XML. Eu recomendo.

S-ar putea să vă placă și