Tutorial de ASP

Document Sample
Tutorial de ASP Powered By Docstoc
					Tutorial de ASP.net (linguagem C#)

1 - Namespaces

Os namespaces são coleções de tipos organizados de acordo com as funções que
executam.
O System é o namespace raiz do ASP.NET. Ou seja, todos os outros namespaces se
encontram dentro do System.
O System é invocado automaticamente em qualquer página, ou seja, ele não precisa ser
chamado. Abaixo, uma
lista dos namespaces do ASP.NET:


CodeDom        - Contém os objetos que representam os elementos de um documento de
código fonte.
Collections - Contém objetos de coleção, como listas, filas e tabelas de hash.
ComponentModel - Classes que permitem controlar o comportamento dos componentes
e controles.
Configuration - Métodos e objetos que permitem acessar opções de configuração do
.NET
Data - Contém classes que permitem interagir com fontes de dados
Diagnostics - Classes que permitem depurar e acompanhar a execução de suas
aplicações
DirectoryServices - Fornece acesso aos serviços Active Directory
Drawing        - Classes que permitem usar capacidades básicas de interface de exibição
gráfica(GDI)
EnterpriseServices - Objetos que permitem controlar o comportamento dos
componentes de um servidor
Globalization - Classes que definem informações relacionadas com a cultura
IO - Contém classes que permitem ler e gravar fluxos e arquivos de dados
Management - Classes usadas para fornecer interface com eventos e objetos WMI.
Messaging - Classes para interagir com mensagens através de uma rede
Net - Fornece classes para operar com protocolos de rede
Reflection - Contém classes que permitem ver informações sobre outros tipos do .NET
Resources - Contém classes que permitem gerenciar recursos especificos da cultura
Security - Fornece acesso a estrutura de segurança do .NET
ServiceProcess - Permite interagir com serviços
Text - Classes que apresentam as codificações de caractere ASCII, Unicode, UTF-7 e
UTF-8
Threading - Contém classes que permitem programação com multithread
Timers - Contém classes para gerar eventos em intervalo de tempo especificados
Xml - Contém classes que processam dados Xml
Web - Fornece comunicações de cliente/servidor. Representam a maioria dos objetos
que serão usados no ASP.NET


Para importar um namespace para ser utilizado em uma página, colocaremos a seguinte
linha no
inicio da página:
[sourcecode language="csharp"]
       <%@ Import Namespace="System.Data" %>
[/sourcecode]

O exemplo acima importaria o namespace Data.

Os seguintes namespaces são importados por padrão e não precisam ser chamados:
System, System.Collections,
System.Web, System.Web.UI, System.Web.UI.HtmlControls e
System.Web.UI.WebControls.

Nota importante:

Caso seja preciso colocar algum código dentro do HTML, podemos usar as tags asp
tradicionais: <% %>
Para fazer um Response.Write, usaremos <%= %>

Nota importante: Ao contrário do que acontece no VB.net, o C# é uma linguagem case-
sensitive. Por isso,
todas as palavras chave da linguagem devem ser digitadas em caracteres minúsculos.


2 - Comentários em C#

[sourcecode language="csharp"]
// Isto é um comentário de 1 linha

/* Isto é um
comentário de várias
linhas */
[/sourcecode]

3 - Concatenação

Em ASP.NET, utilizamos o sinal de soma(+) para concatenar. Se todos os itens, ou um
dos itens a ser
concatenado for uma string, ele apenas juntará os valores. No caso de todos os itens
forem numéricos, ele
realizará a soma e mostrará o resultado.


4 - Redirecionamento

No Asp.net há duas maneiras principais de se fazer um redirecionamento:

[sourcecode language="csharp"]
       Response.Redirect("pagina.aspx");
       Server.Transfer("pagina.aspx");
[/sourcecode]
A primeira maneira (Response.Redirect) é a que nós já usavamos no ASP tradicional.
Ela simplesmente diz ao
navegador para buscar outra página.

Já a segunda maneira (Server.Trasfer) também redireciona para outra página, mas com
algumas diferenças.
Ao transferir o usuário para outra página usando Server.Transfer o servidor conserva os
recursos já usados.
O invés de dizer simplesmente para o Browser redirecionar para outra página ele apenas
altera o 'foco' no
servidor e transfere a requisição. Isto significa que você não está criando novas
requisições e sua
aplicação fica mais rápida.
Porém não podemos usar sempre o Server.Transfer , pois o processo de transferência
pode operar somente em
sites que estão rodando no servidor. Você não pode usar Server.Transfer para enviar o
usuário para uma
página externa ao servidor. Somente Response.Redirect pode fazer isto. Além disto
Server.Transfer mantém a
URL original no Browser o que pode ajudar para entrada de dados mas causar confusão
na depuração.
Server.Transfer possui um segundo parâmetro : preserveForm. Se você definí-lo como
'true' assim :
Server.Transfer("pagina.aspx", true) a consulta existente e qualquer variável de
formulário ficará disponível
para a página para a qual você esta fazendo a transferência.

Nota: existe também a função Server.Execute("pagina.aspx") que executa uma página e
retorna o resultado


       Para receber dados de outra página:
[sourcecode language="csharp"]
       string nome = Request.QueryString("nome");
[/sourcecode]
ou
[sourcecode language="csharp"]
       string nome = Request.Form("nome");
[/sourcecode]
ou
[sourcecode language="csharp"]
       string nome = Request("nome");
[/sourcecode]

5 - Seções

Para criar uma seção:

[sourcecode language="csharp"]
       Session["logado"]="ok";
[/sourcecode]

Abaixo, um exemplo que verificará se a seção existe, e caso não exista, redirecionará o
usuário para a página
de login:

[sourcecode language="csharp"]
       void page_Load(){

                Session["logado"]="ok";

              if(Session["logado"]=="ok"){
       Response.Write("Seja bem vindo");
              } else {
       Server.Transfer("login.aspx");
              }

       }
[/sourcecode]

6 - Lendo arquivo TXT

Abaixo um exemplo de como ler um arquivo TXT e exibir seu conteúdo num TextBox:

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="System.IO" %>
<script runat="server">

void Page_Load(){

  string arquivo = "C:\\Inetpub\\wwwroot\\asp.net\\teste.txt";

  if(File.Exists(arquivo)){

  StreamReader arq = new StreamReader(arquivo);
  TextBox1.Text=arq.ReadToEnd();
  arq.Close();

  } else {

  TextBox1.Text="O arquivo "+arquivo+" não existe!!!";

   }
}
</script>
[/sourcecode]

Note que no C# os caminhos físicos devem conter duas barras.
7 - Criando e gravando num arquivo TXT

Aqui criaremos um arquivo chamado teste.txt e gravaremos nele o conteúdo do
componente TextBox1

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="System.IO" %>
<script runat="server">

void Page_Load(){

    string arquivo = "C:\\Arquivos\\teste.txt";

    StreamWriter arq = new StreamWriter(arquivo);
    arq.WriteLine(TextBox1.Text.Trim());
    arq.Close();
}

</script>
[/sourcecode]

8 - Apagando um arquivo

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="System.IO" %>
<script runat="server">

void Page_Load(){

    File.Delete("C:\\Arquivos\\teste.txt");

}

</script>
[/sourcecode]

9 - AdRotator no ASP.NET

Para criar um AdRotator (imagem rotativa) numa página ASP.NET, apenas
acrescentamos um componete AdRotator.
O atributo AdvertisementFile é o único atributo obrigatório no componente AdRotator.
Esse atributo indicará
o arquivo xml que conterá os conteúdos sobre os banners a serem exibidos.

Abaixo um exemplo de conteúdo desse arquivo:
[sourcecode language="csharp"]
       <?xml version="1.0" encoding="UTF-8"?>

       <Advertisements>

       <Ad>
       <ImageUrl>image.jpg</ImageUrl>
       <NavigateUrl>http://www.site1.com</NavigateUrl>
       <AlternateText>Texto que aparece caso a figura nao apareca</AlternateText>
       <Impressions>1</Impressions>
       </Ad>

       <Ad>
       <ImageUrl>image2.jpg</ImageUrl>
       <NavigateUrl>http://www.site2.com</NavigateUrl>
       <AlternateText>Texto que aparece caso a figura nao apareca</AlternateText>
       <Impressions>4</Impressions>
       </Ad>

       </Advertisements>
[/sourcecode]

Cada tag <Ad> do arquivo fará referência a uma imagem a ser exibida. O atributo
<Impressions> indica quantas
vezes a imagem deve aparecer. Já o atributo <NavigateUrl> cria um link no respectivo
banner.


10 - Procedimentos em C#

No C# temos dois tipos de Procedures (procedimentos): voids e funções. A diferença é
que as funções sempre
devem retornar algum valor, o que não acontece com as voids.

Em C#, para criamos uma função, não faremos o uso da palavra function. Ao invés
disso, usaremos na declaração,
o tipo de valor que será retornado. E dentro de uma função, devemos usar o comando
'return'.

Abaixo, criaremos uma função que retornará uma String:

[sourcecode language="csharp"]
       public string mensagem(){
               return "Isto é uma mensagem";
       }
[/sourcecode]

Para criar uma void, seria assim:

[sourcecode language="csharp"]
       public void fechar(){
              conexao.close();
              Response.Write("A conexao foi fechada");
       }
[/sourcecode]

É importante ressaltar que devemos criar nossas Funções e Voids dentro da tag:

[sourcecode language="csharp"]
 <script runat='server'></script>
[/sourcecode]
porém fora da void Page_Load();


11 - Trabalhando com Strings

[sourcecode language="csharp"]
       void Page_Load(){

          string nome = "Paulo"

          Response.Write(nome.Length); //mostra o número de caracteres de uma string
          Response.Write(nome.Substring(0,7)); //mostra os caracteres das posições '0'
até '7'
          Response.Write(nome.Replace("u","y")); //Substitui todos os caracteres 'u' por
'y'
        Response.Write(nome.Contains("a"); //Diz se determinado caractere existe na
string. Retorna true ou false
        Response.Write(nome.Trim());       //Remove todos os espaços em branco do
inicio e do fim da string
        Response.Write(nome.TrimEnd()); //Remove os espaços em branco do Fim da
String
        Response.Write(nome.TrimStart()); //Remove os espaços em branco do inicio da
string
        Response.Write(nome.ToUpper()); //converte todos os caracteres para maiúsculo
        Response.Write(nome.ToLower()); //Converte todos os caracteres para
minúsculo


       }
[/sourcecode]

Temos também a função Split, que quebra uma string e gera um array a partir dos
pedaços. A string
será quebrada de acordo com o caractere dado entre parênteses. Exemplo:

[sourcecode language="csharp"]
       string paises = "França,Canada,Inglaterra,Italia";

          string[] pais = paises.Split(',');
[/sourcecode]

Nesse outro exemplo abaixo, vamos fazer com que a string seja quebrada onde for
encontrado vírgula ou
ponto-e-vírgula. Veja:

[sourcecode language="csharp"]
       string paises = "França,Canada,Inglaterra,Italia";

        char[] separador = {',',';'};

       string[] pais = paises.Split(separador);
[/sourcecode]


12 - Criando uma classe em C#

Abaixo criamos uma classe chamada Calculadora, e dentro do Page_Load(), criamos
um objeto chamado 'minhacalc'
a partir da classe Calculadora. No C#, todas as instruções devem terminar com ponto-e-
vírgula, assim como
acontece, por exemplo, com o PHP.

[sourcecode language="csharp"]
public class Calculadora{

    public double somar(double n1, double n2){
      return n1+n2;
    }

    public double subtrair(double n1, double n2){
      return n1-n2;
    }

    public double multiplicar(double n1, double n2){
      return n1*n2;
    }

    public double dividir(double n1, double n2){
      return n1/n2;
    }

}

void Page_Load(){

    Calculadora minhacalc = new Calculadora();

    Response.Write(minhacalc.dividir(50,2));
}
[/sourcecode]

13 - Como disponibilizar componentes.

Ao desenvolvermos uma classe, podemos desenvolve-la dentro da própria página .aspx.
Mas também podemos fazer de uma maneira para que ela possa ser reutilizada
futuramente em outras páginas
e em outros projetos. Chamamos isso de criação de componentes reutilizáveis. Para
fazer um exemplo, peça
um novo arquivo e escolha o tipo 'classe'. Dentro dele, crie a classe calculadora (acima)
e salve-o com
o nome de calculadora.cs.

Agora vamos compilar para gerar uma dll. Para isso, acesse o prompt do MS-DOS,
entre no diretório onde está
o arquivo cs e digite o comando:

       csc /t:library /out:calculadora.dll calculadora.cs

Com isso geramos o arquivo calculadora.dll, que deverá ser colocado na pasta 'bin', que
deverá estar no
diretório da aplicação. As classes contidas nessa dll podem agora ser usadas em todos os
nossos projetos.


Nota: no caso do Visual Studio 2005, nem precisamos compilar. Basta colocarmos o
nosso arquivo .cs em uma
pasta chamada App_Code, que deverá estar no diretório raiz da aplicação. Com isso, o
VB 2005 já passa a
reconhecer esses componentes. Não precisar compilar é útil durante o desenvolvimento,
pois assim podemos
facilmente ir modificando a classe conforme necessário.


14 - Encapsulamento

       Quanto ao encapsulamento (Abstração), os membros de uma classe podem ser:

private - Acessível dentro do mesmo módulo, classe ou estrutura. (É o padrão)

internal - Acessível desde dentro do mesmo Projeto, mas não fora dele.

protected - Acessível dentro da mesma classe ou desde uma classe derivada dela.

protected internal - Acessível dentro das classes derivadas ou dentro do mesmo projeto.

public - Acessível a partir de qualquer lugar do projeto.
15 - Herança

Para fazermos herança de classes no C#, utilizamos o sinal de dois pontos( : )

No exemplo abaixo, criaremos uma classe chamada Pessoa, e em seguinda criaremos
uma chamada Funcionario
que será derivada da classe Pessoa.

[sourcecode language="csharp"]
       public class Pessoa{

                // Aqui vão as propriedades e métodos da classe Pessoa

       }


       public class Funcionario: Pessoa{

       }
[/sourcecode]

Com isso temos uma classe Funcionario, que herdará todas as propriedades e métodos
da classe Pessoa. Para
impedirmos que uma classe seja herdada, usaremos o comando 'sealed' na declaração da
classe. Assim:

[sourcecode language="csharp"]
       public sealed class Pessoa{

                // Aqui vão as propriedades e métodos da classe Pessoa

       }
[/sourcecode]

Com isso criamos uma classe que pode ser apenas instanciada, mas não herdada.


16 - Construtores

Para se criar um método construdor de uma classe em C#, criamos uma void com o
mesmo nome da classe, porém,
na verdade, não usaremos a palavra 'void'. Veja o exemplo:

[sourcecode language="csharp"]
public class Pessoa{

  public string nome;
  public string cor;

  public Pessoa(){
      this.nome="Paulo";
      this.cor="Azul";

  }

}
[/sourcecode]

Veja que usamos o 'this' para nos referirmos a uma propriedade da própria classe.



17 - Classes Abstratas

Classes Abstratas são classes que não podem ser instanciadas. Elas servirão apenas de
base para a criação de
outras classes. Ou seja, as classes abstratas só podem ser herdadas. Para tornar uma
classe abstrata, usamos
o operador abstract. Exemplo:

[sourcecode language="csharp"]
public abstract class Mensagem{
   public string mostrar(){
     return "Isto é um teste";
   }
}
[/sourcecode]


18 - Interfaces

A Interface é um tipo especial de classe que na verdade não armazena nenhum código.
Ela será apenas um
modelo, contendo as Voids e as Funções que as classes deverão possuir. Por exemplo,
vamos criar uma Interface
chamada Teste:

[sourcecode language="csharp"]
public interface Teste{
   string mensagem(string x);
   int calcular(int x, int y);

}
[/sourcecode]

Agora podemos criar nossas classes, implantando nelas a Interface criada. Essas classes
deverão ter todos
os métodos declarados dentro da Interface. Para implementar nossa Interface em uma
classe, usaremos dois pontos( : ).
Veja:

[sourcecode language="csharp"]
public class Programa: Teste{

  public string mensagem(string x){
    return x;
  }

  public int calcular(int x, int y){
    return x + y;
  }

}
[/sourcecode]


Fomos obrigados a criar na nossa classe Teste os procedimentos mensagem() e
calcular(), pois assim estava
definido na Interface.


19 - Membros Estáticos:

Os membros(Funções,Voids,Propriedades) de uma classe podem ser acessados sem que
se precise instanciar a classe.
Basta, para isso, torná-los estáticos a partir do operador 'static'. Lembre-se que um
membro, para poder ser
acessado dessa maneira, precisa ser declarado como 'public'. Exemplo:

[sourcecode language="csharp"]
public class Pessoa{

  public static string pais = "Brasil";


  public static string mensagem(){
    return "Isto é um teste";
  }

}
[/sourcecode]

Acima criamos uma classe chamada pessoa com dois membros estáticos: a String pais e
a Função mensagem().

Agora podemos, por exemplo, usar a Função dessa maneira:

[sourcecode language="csharp"]
Response.Write(Pessoa.mensagem());
Nota: se criarmos uma variável de escopo global e quisermos que ela seja visível dentro
de alguma classe,
essa variável deverá ser declarada como 'static'. Exemplo:

[sourcecode language="csharp"]
<script runat="server">
   public static string valor = "Paulo";

   public class Carro{
     public string mensagem(){
        return valor;
     }
   }
</script>
[/sourcecode]


20 - Constantes em C#

Para criarmos uma constante em C#, utilizaremos o comando 'const'. Assim

[sourcecode language="csharp"]
       const string nome = "Paulo";

Ao se declarar uma constante, seu valor deve ser imediatamente informado junto com a
declaração. Não é possível
especificar um valor num outro comando (nem no construtor, caso a constante seja um
membro de instância da classe).

Após criada a constante, podemos exibi-la em qualquer lugar da página:

[sourcecode language="csharp"]
       Response.Write(nome);
[/sourcecode]

21 - Usando a palavra chave 'base'

Quando trabalhamos com herança de classes, e dentro de uma classe filha precisamos
nos referir a um membro
da classe base, usamos o comando 'base'. Ex:

[sourcecode language="csharp"]
public class Pessoa{
   public string mensagem(){
     return("Isto é um teste");
   }
}

public class Amigo: Pessoa{
  public string frase(){
    return(base.mensagem());
  }
}
[/sourcecode]

       Outro Exemplo:

[sourcecode language="csharp"]
public class Animal{
  public double preco;
  public Animal(){
     this.preco=200;
  }
}

public class AnimalImportado: Animal{
   public double preco;
   public AnimalImportado(){
     this.preco=(base.preco*0.15)+base.preco;
   }
}
[/sourcecode]

Perceba que na segunda classe o preço do animal importado deve ser 15% mais que o
do animal comum.


22 - Criando uma classe Carro:

[sourcecode language="csharp"]
public class Carro{

  public string cor;
  public double velocidade;

  public Carro(){
    this.cor = "Indefinido";
    this.velocidade = 0;
  }

  public void defineCor(string x){
    this.cor = x;
  }

  public void acelera(double n1){
    double velocidadeNova = this.velocidade + n1;
    this.velocidade = velocidadeNova;
  }
}
[/sourcecode]

Nota: para criar um método construtor para uma classe, criaremos uma void com o
mesmo nome da classe, e sem
usar a palavra void. Essa void passa a ser o construtor da classe. O que tiver contido
nessa void será
executado automaticamente assim que a classe 'Carro' for instanciada.

Nota: usamos o operador 'this' para nos referirmos a uma propriedade do próprio objeto.

Agora, dentro da Sub Page_Load(), faremos:

[sourcecode language="csharp"]
   Carro meuCarro = new Carro();

  meuCarro.defineCor("Azul");

   Response.Write(meuCarro.cor);
[/sourcecode]

23 - Polimorfismo

O Polimorfismo é um dos principios básicos da programação orientada a objetos. Ele
permite que criemos
métodos com o mesmo nome, porém que executarão funções diferentes. Temos dois
tipos principais de
Polimorfismo: a Reescrita de Método e a Sobrecarga de Método.

A Reescrita de método acontece quando criamos métodos com o mesmo nome, que
receberão as mesmas quantidades
e tipos de atributos e que retornarão o mesmo tipo de valor. Um desses métodos estará
na classe mãe, e
outro na classe filha. Ou seja, a Reescrita de método está diretamente ligado à herança.

A Sobrecarga de método acontece quando temos, numa mesma classe, dois métodos
com o mesmo nome, porém que
receberão quantidades ou tipos de atributos diferentes.


24 - Reescrita de método

Quando fazemos uma herança de classe e na classe filha criamos um procedimento com
o mesmo nome de um
já existente na classe mãe, estamos fazendo uma reescrita de método. Agora todos os
objetos criados a
partir dessa classe filha usarão o procedimento existente na classe filha, não o da classe
mãe.

[sourcecode language="csharp"]
public class Aviao{
  public string decolar(){
     return "O avião está decolando";
  }
}

public class Boeing: Aviao{
   public string decolar(){
     return "O Boeing está decolando";
   }
}
[/sourcecode]

Perceba que acima temos uma classe mãe e uma classe filha, ambas com uma função
chamada decolar(). Porém
o método decolar() da classe filha substituirá o método decolar() da classe mãe.



25 - Sobrecarga (ou Overloading)

Chamamos de sobrecarga a criação de Procedimentos com o mesmo nome, mas que
executam funções diferentes
dependendo do parâmetro recebido.

No exemplo abaixo, por exemplo, criaremos duas funções com o mesmo nome:

[sourcecode language="csharp"]
public string teste(string v1){
   return "O valor recebido é uma string";
}

public string teste(int n1){
   return "O valor recebido é um número";
}
[/sourcecode]

Nesse exemplo acima, se o parâmetro recebido for uma String, a primeira função será
executada. Caso
o parâmetro recebido seja um número, a segunda função será executada.

Também podemos diferenciar uma função de outra de acordo com o número de
parâmetros recebidos:

[sourcecode language="csharp"]
public string teste(string v1){
   return "O valor recebido é uma string";
}

public string teste(string v1, string v2){
   return "Dois valores foram recebidos";
}
[/sourcecode]

Nota: a sobrecarga também pode ser realizada dentro de Classes.


26 - Definir propriedades como Somente leitura

Podemos definir as propriedades de uma classe como sómente leitura, para que seu
valor não possa ser
modificado pelos objetos criados a partir dela. Para isso, usaremos o atributo 'readonly'.

[sourcecode language="csharp"]
   public class Frase{
     public readonly string mensagem;
     public Frase(){
        this.mensagem="Testando...";
     }


     public string imprimir(){
       return this.mensagem;
     }
   }
[/sourcecode]

Na classe acima criamos uma propriedade chamada mensagem e a definimos como
readonly. Com isso, o seu valor
não poderá ser alterado. Um valor readonly deve ser membro de uma classe, não
podendo ser uma variável
local.


27 - Criando Namespaces em C#

Criando nossas proprias namespaces, podemos melhorar muito a organização de nossos
componentes.

Vamos criar um namespace chamado MinhaName, que contenha as classes Calculadora
e Mensagem. Para isso,
vamos criar um arquivo 'cs' com o seguinte conteúdo:

[sourcecode language="csharp"]
namespace MyName{
       public class Calculadora{
              public double somar(double n1, double n2){
                      return n1+n2;
              }
              public double subtrair(double n1, double n2){
                     return n1-n2;
                }
       }
       public class Mensagem{
              public string frase(){
                      return "Isto é uma mensagem";
              }
       }
}
[/sourcecode]

Pronto. Agora para utilizar devemos importar a Namespace MyName para poder utilizar
as classes Calculadora
e Mensagem. Podemos colocar num mesmo arquivo cs (ou numa mesma dll) quantos
namespace desejarmos.

Também podemos colocar uma namespace dentro de outra, assim:

[sourcecode language="csharp"]
namespace Materias{
       namespace Matematica{
              public class Calculadora{
                     public double somar(double n1, double n2);
              }
       }
       namespace Portugues{
              public class Frase{
                     public double mensagem(){
                             return "Isto é uma mensagem";
                     }
              }
       }
}
[/sourcecode]

Acima criamos uma namespace chamada Materias, e dentro desta as namespaces
Portugues e Matematica. É
importante entender que apenas importando a Materias, ainda não teremos acesso as
classes das namespaces
Portugues e Matematica, ou seja, para usarmos a namespace Portugues, por exemplo,
devemos importar assim:

<%@ Import Namespace="Materias.Portugues" %>

Em alguns casos, precisaremos utilizar namespaces do ASP.NET dentro de nossas
namespaces. Para isso,
utilizaremos o comando 'using'. No exemplo abaixo, vamos criar um namespace que
utilizará o namespace
Odbc. Então, nossa namespace ficará assim:
[sourcecode language="csharp"]
       using System.Data.Odbc;

       namespace Dados{
              class Conexao{
                     public string conexao(){
                             OdbcConnection conexao = new OdbcConnection();
                             return "Conexão criada";
                     }
              }
       }
[/sourcecode]


28 - Tipos de variáveis no C#

string        Cadeia de Caracteres
char          Apenas um caractere. Deve ser usado aspas simples (não aspas duplas
como nas strings)
bool          Booleano: True ou False
byte          Número inteiro positivo de um byte
ushort        Número inteiro positivo de dois bytes
uint          Número inteiro positivo de quatro bytes
ulong         Número inteiro positivo de oito bytes
sbyte         Número inteiro positivo ou negativo de um byte
short         Número inteiro positivo ou negativo de dois bytes
int           Número inteiro positivo ou negativo de quatro bytes
long          Número inteiro positivo ou negativo de oito bytes
float         Número com ponto flutuante positivo ou negativo de quatro bytes
double        Número com ponto flutuante positivo ou negativo de oito bytes
decimal       Número com ponto flutuante positivo ou negativo de dezesseis bytes
object        Tipo universal - Deve ser usado em último caso

Para declarar variáveis de um mesmo tipo, podemos declará-las numa mesma linha,
assim:

       int valor1, valor2, valor3;


29 - Conversão de tipos de variáveis

Em alguns casos precisaremos converter uma variável de um tipo para outro tipo
diferente. Para isso usaremos as
funções de conversão de dados da classe Convert.
Por exemplo, vamos supor que temos duas Caixas de Texto (TextBox) e que queremos
criar uma Sub que some os números
das duas primeiras caixas e jogue os resultados num Label. Mas para isso, durante a
operação, teremos que
recolher os dois valores à serem somados (que são strings, pois vieram de um textbox),
converte-los para double,
para poder realizar o cálculo, e converter o resultado de novo para String, para poder
jogá-lo no Label, pois
o Label só aceita uma String.
Veja o exemplo:

[sourcecode language="csharp"]
   void Button1_Click(object sender, EventArgs e) {
      double n1 = Convert.ToDouble(TextBox1.Text);
      double n2 = Convert.ToDouble(TextBox2.Text);
      double resultado = n1+n2;
      Label1.Text = Convert.ToString(resultado);
   }
[/sourcecode]

As funções de conversão de tipos da classe Convert são: ToByte(), ToChar(),
ToDateTime(), ToDecimal(),
ToDouble(), ToInt16(), ToInt32(), ToInt64(), ToSByte(), ToSingle(), ToBoolean(),
ToBase64String(),
ToBase64CharArray(), ToString(), ToUint16(), ToUInt32() e ToUInt64().

30- Tratamento de Erros

Há quatro tipos de erros que podemos cometer na programação: Erros de Sintaxe, Erros
de Lógica, Erros de
Compilação, Erros de Runtime.

Abaixo falaremos de como tratar esses erros. Os erros de sintaxe, como tentar usar uma
variável que não existe,
ou esquecer de fechar uma aspa, não são erros tratáveis e devem ser corrigidos durante o
desenvolvimento do
software. Ou seja, os tratamentos de erro descritos abaixo não valem para erros de
sintaxe.

Podemos usar no ASP.NET o tratamento de erros estruturado, através da construção
Try-Catch-Finally. Isso permite
detectar ativamente diferentes formas de erro e responde-las apropriadamente.

A sintaxe é:

[sourcecode language="csharp"]
       Try
               'Código que poderá gerar um erro
       Catch
               'Detecta o erro e o responde
       Finally
               'Código executado independente de haver erro ou não
       End Try
[/sourcecode]

Exemplo:
[sourcecode language="csharp"]
void Page_Load(){

  int valor = 5;
  int valor2 = 0;

  try{
  Response.Write(valor/valor2);
  }catch(DivideByZeroException e){
     Response.Write("Erro: Divisão por Zero");
  }catch(FormatException e){
     Response.Write("Formato Inválido");
  }finally{
     Response.Write("<br><br>Fim da operação");
  }
}
[/sourcecode]

Acima foi causado um erro de divisão por zero.
Podemos usar quantos blocos Catch desejarmos. Porém, se o erro ocorrido não
combinar com nenhum bloco Catch,
então o erro não será tratado.


31 - O uso do throw

O throw dispara um erro, podendo ter uma mensagem personalizada (como abaixo).
Caso a mensagem não exista,
uma mensagem genérica "System.Exception" será mostrada.

[sourcecode language="csharp"]
public void registrar(string nome, int idade){
   if(idade<18){
      throw new Exception("Membro menor de Idade");
   }else{
      Response.Write("Cadastro realizado com sucesso!");
   }
}
[/sourcecode]

32 - Criado Exceptions Personalizadas:


Podemos criar nossas próprias Exceptions. Por exemplo, vamos criar uma Exception pra
ser utilizada em casos
de erro de argumento:

[sourcecode language="csharp"]
public class ErroDeArgumento: ArgumentException{
    public ErroDeArgumento(): base("Erro de Argumento"){

    }
    public ErroDeArgumento(string mensagem): base(mensagem) {

    }
}


public void registrar(string nome, int idade){
   if(idade<18){
      throw new ErroDeArgumento();
   }
}
[/sourcecode]

Perceba que ela possui duas classes construtoras. A primeira void será usada caso não
coloquemos nenhuma
mensagem na hora de disparar uma exceção, assim a mensagem pré-definida será usada.
Caso contrário, a
segunda void será usada.


33 - Usando a classe Trace

Podemos fazer uso da classe Trace para rastrear o fluxo de uma aplicação. Para ativar o
rastreamento em
uma página, basta definir o parâmetro Trace definido como "True" dentro da tag Page
no inicio da página:

[sourcecode language="csharp"]
<%@ Page Language="C#" Trace="True" %>
[/sourcecode]

Com isso serão exibidas várias informações pertencentes à requisição, informações da
aplicação em tempo
de execução, informações de cabeçalhos HTTP, variáveis de ambiente do lado servidor,
etc.


34 - Trabalhando com datas

Para exibirmos datas no C#, usaremos a classe DateTime e seus respectivos métodos.

DateTime.Now                                 Exibe a data e a hora atuais do sistema
DateTime.Today                               Exibe a data no seguinte formato: 5/2/2006
00:00:00
DateTime.Now.DayOfWeek                      Exibe o dia da semana (em texto)
DateTime.Now.Day                     Exibe o dia do mês (1-31)
DateTime.Now.Month                          Exibe o número do mês (1-12)
DateTime.Now.Year              Exibe o ano
DateTime.Now.Date              Exibe a data no seguinte formato: 5/2/2006
00:00:00
DateTime.Now.Hour              Mostra somente as horas
DateTime.Now.Minute                   Mostra somente os minutos
DateTime.Now.Second                   Mostra somente os segundos
DateTime.Now.DayOfYear                Mostra o dia do ano (1-366)
DateTime.Today.AddDays(15)            Mostra a data acrescida de 15 dias
DateTime.Today.AddDays(15).Day        Mostra o dia de hoje somando com mais 15
dias
DateTime.Today.AddHours(15)           Acrescenta 15 horas a uma variável data
DateTime.Today.AddMinutes(15)         Adiciona 15 minutos à variável
DateTime.Today.AddHours(15).Hour      Mostra a hora atual somada com mais 15
horas
DateTime.Today.AddMonths(3)           Adiciona 3 meses à variável data
DateTime.Today.AddYears(6)            Adiciona 6 anos à variável data
DateTime.DaysInMonth(2003,5)          Mostra quantos dias determinado mês
possui

Nota: para conseguirmos o dia da semana em formato numérico
(domingo=0,segunda=1,etc) temos que
pegar o dia da semana em texto e converte-lo pra inteiro. Assim:

[sourcecode language="csharp"]
       Response.Write(Convert.ToInt16(DateTime.Now.DayOfWeek));
[/sourcecode]

Para conseguir tempos passados, podemos usar todas as funções Add usando como
parâmetro um número negativo.
Por exemplo, para conseguir a data de dez dias atrás:
Response.Write(DateTime.Now.AddDays(-10));

Para conseguir o dia de dez dias atrás: Response.Write(DateTime.Now.Day-10);


Podemos usar a função ToString() para a formatação de datas.

A sintaxe é: ToString("formatação desejada"[,indicativo_regional])

Aqui a lista de parâmetros disponíveis para fazer a formatação através do ToString():

d    Exibe o dia do mês sem zero
dd   Exibe o dia do mês com zero
ddd Exibe o nome abreviado do dia
dddd Exibe o nome completo do dia
M    Exibe o número do mês sem zero
MM Exibe o número do mês com zero
MMM Exibe o nome abreviado do mês
MMMM        Exibe o nome completo do mês
yy   Exibe o ano em dois dígitos
yyyy   Exibe o ano em quatro dígitos
h      Exibe as horas sem zero com formato de 12 horas
hh     Exibe as horas com o zero com formato de 12 horas
H      Exibe as horas sem zero para formato de 24 horas
HH     Exibe as horas com zero para formato de 24 horas
m      Exibe os minutos sem zero
mm     Exibe os minutos com zero
s      Exibe os segundos sem zero
ss     Exibe os segundos com zero
:      separador de tempo
/      Separador de datas

Por exemplo:

[sourcecode language="csharp"]
       Response.Write(DateTime.Now.ToString("dddd',' dd 'de' MMMM 'de' yyyy"));
[/sourcecode]
              imprimiria 'terça-feira, 07 de fevereiro de 2006'
       e

[sourcecode language="csharp"]
       Response.Write(DateTime.Now.ToString("dd/MM/yyyy"));
[/sourcecode]
              imprimiria '07/02/2006'

Para criarmos uma variável data com um valor diferente, podemos fazer assim:
[sourcecode language="csharp"]
        DateTime data = new DateTime(2001,04,03);
[/sourcecode]
              ou assim:

[sourcecode language="csharp"]
       DateTime data = new DateTime(2001,04,03,10,15,25);

No primeiro valor temos só data, e no segundo, data e hora.

Agora poderiamos imprimir assim: Response.Write(data.ToString("dd/MM/yyyy"));

       A função ToString possui um segundo parâmatro opcional, para formatar
informações de acordo
com a região. Para usarmos esse segundo parâmetro, deveremos importar o namespace
System.Globalization.

Ex:

[sourcecode language="csharp"]
       CultureInfo br = new CultureInfo("pt-BR");

       DateTime data = new DateTime(2001,04,03);
       Response.Write(data.ToString("dd/MM/yyyy HH:mm:ss",br));
[/sourcecode]

Isso garantirá que informações como dia da semana e mês seja mostrados no formato
brasileiro.


       Nota: Pra ver se um ano é bissexto, usaremos a função IsLeapYear(), assim:

[sourcecode language="csharp"]
              Response.Write(DateTime.IsLeapYear(2006)); // retornará True ou False
[/sourcecode]

35 - Arquivo de configuração global.asax

Abaixo, um exemplo do arquivo global.asax:

[sourcecode language="csharp"]
<%@ Application language="C#" %>

<script runat="server">

  public void Application_Start(Object sender, EventArgs e) {
       Application["usuarios_ativos"]=0;
  }

  public void Application_End(Object sender, EventArgs e) {
    // Code that runs on application shutdown
  }

  public void Application_Error(Object sender, EventArgs e) {
    // Code that runs when an unhandled error occurs
  }

  public void Session_Start(Object sender, EventArgs e) {
       Application.Lock();
       Application["usuarios_ativos"] = (int)Application["usuarios_ativos"]+1;
       Application.UnLock();
  }

  public void Session_End(Object sender, EventArgs e) {
       Application.Lock();
       Application["usuarios_ativos"] = (int)Application["usuarios_ativos"]-1;
       Application.UnLock();
  }

</script>
[/sourcecode]
36 - Criação de Arrays:

Criando um array para dias da semana:

[sourcecode language="csharp"]
       string[] diasemana = new string[7];
       int valor = Convert.ToInt16(DateTime.Now.DayOfWeek);

       diasemana[0]="Domingo";
       diasemana[1]="Segunda-Feira";
       diasemana[2]="Terça-Feira";
       diasemana[3]="Quarta-Feira";
       diasemana[4]="Quinta-Feira";
       diasemana[5]="Sexta-Feira";
       diasemana[6]="Sábado";

       Response.Write(diasemana[valor]);
[/sourcecode]

Outra maneira de Criar Array:

[sourcecode language="csharp"]
     string[] nomes = new string[]{"Paulo","Franco","Leandro","Alba","Ernandes"};

     Response.Write(nomes[2]);
[/sourcecode]

Para listar os itens de um array, também poderiamos fazer:

[sourcecode language="csharp"]
        string[] nomes = new
string[]{"Paulo","Franco","Leandro","Fernando","Juliano"};

                foreach(string nome in nomes){
                       Response.Write(nome+"<br>");
                }
[/sourcecode]

Em C#, não podemos redimensionar um array dinamicamente. A saída é copiar o
conteúdo do atual array
para um novo. Vamos ver como fazer:

[sourcecode language="csharp"]
string[] nomes = new string[]{"Paulo","Franco","Leandro"};
[/sourcecode]

Acima criamos um array chamado nomes, com três índices. Agora vamos criar um
outro array chamado nomes2,
que possuirá quatro índices e copiaremos para este o conteúdo do array nomes:
[sourcecode language="csharp"]
string[] nomes2 = new string[4];

Array.Copy(nomes, nomes2, nomes.Length); //ou assim: nomes.CopyTo(nomes2, 0);
[/sourcecode]

Pronto, agora temos um novo array, com todo o conteúdo do primeiro e mais um índice
livre. A sintaxe é:

[sourcecode language="csharp"]
Array.Copy(array_origem, array_destino,
número_de_indices_a_ser_copiado_do_primeiro_array);
[/sourcecode]

Se quisermos, também podemos agora redimensionar o primeiro array, assim:

[sourcecode language="csharp"]
       nomes = nomes2;
[/sourcecode]


               Criando arrays multidimensionais:

Vamos criar, no exemplo abaixo um array bidimensional:

[sourcecode language="csharp"]
     string[,] nomes = new string[,] { { "Paulo", "23" }, { "Franco", "25" }, {
"Ernandes", "19" } };

     Response.Write(nomes[1,1]);
[/sourcecode]

Nesse outro exemplo, criamos outro array bidimensional:

[sourcecode language="csharp"]
     string[,] nomes = new string[2,3];

     nomes[0, 0] = "Paulo";
     nomes[0, 1] = "25";
     nomes[0, 2] = "3652-5478";
     nomes[1, 0] = "Franco";
     nomes[1, 1] = "23";
     nomes[1, 2] = "3852-1657";

Criamos aqui um array de dois índices, cada índice contendo três colunas. No nosso
exemplo, usaremos essas
três colunas para guardar o nome, a idade e o telefone.

Para criar um novo array e copiar para ele os índices do array antigo:
[sourcecode language="csharp"]
       string[,] nomes2 = new string[3,3];
       Array.Copy(nomes, nomes2, nomes.Length);
[/sourcecode]

E podemos, por fim, redimensionar também o array nome:

[sourcecode language="csharp"]
       nomes = nomes2;
[/sourcecode]

Vale lembrar que podemos também criar arrays com mais dimensões, assim:

[sourcecode language="csharp"]
       string[,,] nomes = new string[3,2,4];

       string[,,,] carros = new string[3,3,7,8];
[/sourcecode]

Exemplo de array tridimensional:

[sourcecode language="csharp"]
     string[,,] nomes = new string[2,2,3];

     nomes[0, 0, 0] = "Paulo";
     nomes[0, 0, 1] = "25";
     nomes[0, 0, 2] = "3254-8744";
     nomes[0, 1, 0] = "Leonardo";
     nomes[0, 1, 1] = "23";
     nomes[0, 1, 2] = "3652-9854";
     nomes[1, 0, 0] = "Julio";
     nomes[1, 0, 1] = "30";
     nomes[1, 0, 2] = "3254-6985";
     nomes[1, 1, 0] = "Estela";
     nomes[1, 1, 1] = "28";
     nomes[1, 1, 2] = "4587-3214";
[/sourcecode]

Propriedades de um array:

Response.Write(nomes.Rank);                    //Diz quantas dimensões tem o array
Response.Write(nomes.Length);                  //Obtem o total de elementos em todas as
dimensões do array
Response.Write(nomes.GetValue(2));             //Mostraria o valor de determinado índice
de um array unidimensional
Response.Write(nomes.GetValue(2,3));           //Mostraria o valor de determinado índice
de um array multidimensional

Response.Write(nomes.GetLength(0));
O método GetLength, se usado num array unidimensional, dirá quantos índices o array
possui.

Se usado em arrays multidimensionais, nos diz o número de elementos de uma
dimensão especificada de um array.
O número da dimensão desejada deve ser colocado entre parênteses.


37 - If e Else

Ex:

[sourcecode language="csharp"]
   int x = 1;

   if(x<10){
      Response.Write("O valor é menor que 10");
   }else{
      Response.Write("O valor é maior que 10");
   }
[/sourcecode]

Ex:

[sourcecode language="csharp"]
   int valor1 = 5;
   int valor2 = 5;

   if(valor1==valor2){
      Response.Write("São Iguais");
   }
[/sourcecode]

//Perceba acima que usamos dois sinais de igual quando queremos fazer uma
comparação, como no PHP.


        If e Else If

Ex:

[sourcecode language="csharp"]
   int x = 6;

   if(x<10){
      Response.Write("O valor é menor que 10");
   }else if(x>5){
      Response.Write("O valor é maior que 5");
   }
[/sourcecode]
38 - Loops

Em C# temos três tipos de Loop: 'For', 'While' e 'Do While'.

**** Loop For

Sintaxe:

[sourcecode language="csharp"]
       for(variavel,condicao,incremento){
               //instruções;
       }
[/sourcecode]

Exemplo:

[sourcecode language="csharp"]
   for(int x=0;x<10;x++){
      Response.Write("Isto é um Loop For<br>");
   }
[/sourcecode]

**** Loop While

Sintaxe:

[sourcecode language="csharp"]
       while(condição){
              //Instruções;
       }
[/sourcecode]

Exemplo:

[sourcecode language="csharp"]
   while(x<10){
     Response.Write("Isto é um loop While<br>");
     x++;
   }
[/sourcecode]

**** Loop Do While

Sintaxe:

[sourcecode language="csharp"]
   do{
     //Instruções;
   }while(condição);
[/sourcecode]


Exemplo:

[sourcecode language="csharp"]
   do{
     Response.Write("Isto é um loop Do While<br>");
     x++;
   }while(x<10);
[/sourcecode]

Temos também a instrução foreach, que funciona de maneira semelhante, porém quando
usamos foreach não
precisamos especificar as faixas inicial e final, ou seja, a instrução será realizada a cada
item encontrado
em um array/coleção.

Ex:

[sourcecode language="csharp"]
               string[] nomes = new
string[]{"Paulo","Franco","Leandro","Fernando","Juliano"};

                foreach(string nome in nomes){
                       Response.Write(nome+"<br>");
                }
[/sourcecode]

39 - Operadores e Funções Matemáticas

&      And
&& AndAlso
|      Or
||     OrElse
!=     Diferente
==null é nulo

+      Soma dois valores
-      Subtrai um valor do outro
*      Multiplica dois valores
/      Divide um valor pelo outro
%      Divide um valor por outro e retorna o resto da operação ( ex: 83 % 4 )
+=     Soma o valor e atribui o resultado
-=     Subtrai o valor e atribui o resultado
*=     Multiplica o valor e atribui o resultado
/=     Divide o valor e atribui o resultado
&=     Concatena duas strings e atribui o resultado
Temos também as funções matemáticas pertencentes a classe System.Math:

Math.Round(7.2)                //Arredonda um valor
Math.Max(7,5)                  //Exibe o maior valor dentre dois valores
Math.Min(7,3)                  //Exibe o menor valor dentre dois valores
Math.Floor(6.3)                //Arrendonda um valor sempre para baixo
Math.Sqrt(9)            //Acha a raiz quadrada de um número
Math.Pow(5,3)                  //Faz exponenciação - Eleva o primeiro número ao
segundo número


40 - Instrução Switch

O Switch funciona de maneira similar ao Case, da linguagem VB.
Ex:

[sourcecode language="csharp"]
   string estado = "MG";

   switch(estado){
   case "SP": Response.Write("Viagem para São Paulo"); break;
   case "MG": Response.Write("Viagem para Belo Horizonte"); break;
   case "PR": Response.Write("Viagem para Curitiba"); break;
   default: Response.Write("Vou ficar aqui mesmo"); break;
   }
[/sourcecode]

41 - Enviando Cookies

  HttpCookie meucookie = new HttpCookie("saudacao");            //cria um cookie
chamado saudacao
  meucookie.Value="Ricarco";                                    //Dá um valor ao
Cookie
  //meucookie.Expires.AddYears(1);                              //Definir data de
expiração do Cookie
  //meucookie.Expires = new DateTime(2008,04,03,0,0,0);         //Definir data de
expiração do Cookie
  //meucookie.Domain = "/planetalivre.com.br";          //Dominio do Cookie
  //meucookie.Path = "/cookies";                        //Local onde o cookie será
gravado
  //meucookie.Secure = true;             //Diz se o cookie só deve ser enviado em
conexão segura

  Response.SetCookie(meucookie);                          //Envia o Cookie

Perceba que acima enviamos um cookie com um valor único. Mas também podemos
enviar cookies com chaves, que são
pares de valores. Para enviarmos valores em pares no cookie, fariamos:

[sourcecode language="csharp"]
   meucookie.Values.Add("Nome", "Paulo Luvisoto");
   meucookie.Values.Add("Email", "paulobitfranca@netsite.com.br");
[/sourcecode]
              ou

[sourcecode language="csharp"]
   meucookie["nome"]="Paulo H.";
   meucookie["telefone"]="3652-9854";
[/sourcecode]


      ***** Captando valores de um cookie       *****

[sourcecode language="csharp"]
   HttpCookie cookie = Request.Cookies["saudacao"];
   if (cookie == null) {
       Response.Write("Cookie não encontrado. <br><hr>");
   } else {
      string strCookieValue = cookie.Value.ToString();
      Response.Write(strCookieValue);
   }
[/sourcecode]

Para exibir um valor de um cookie com chaves

[sourcecode language="csharp"]
     string ValorNome = cookie.Values["nome"].ToString();
     Response.Write(ValorNome);
[/sourcecode]

Para testarmos se um cookie possui chaves, poderiamos usar cookie.HasKeys que
retornaria True ou False.


42 - Enviando E-mail através do ASP.NET

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="System.Web.Mail" %>
<script runat="server">

  void page_load(){

     MailMessage email = new MailMessage();
     email.From = "origem@origem.com.br";
     email.To = "destino@destino.com.br";
     email.Cc = "copia@copia.com.br"; //Para enviar cópia
     email.Subject = "Enviando email com ASP.NET";
     email.BodyFormat = MailFormat.Html;
     email.Body = "<b>Curso de ASP.NET em C#</b>";
     email.Attachments.Add(new MailAttachment("C:\\foto.jpg"); //Para enviar anexo
       SmtpMail.SmtpServer = "smtp.seu_provedor.com.br";

     SmtpMail.Send(email);

   }
[/sourcecode]

Nota: caso o seu servidor SMTP exija autenticação, acrescente esses dois campos:

[sourcecode language="csharp"]
email.Fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"] = 1;
email.Fields["http://schemas.microsoft.com/cdo/configuration/sendusername"] =
"seu_username";
email.Fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"] =
"sua_senha";
[/sourcecode]

Outros campos que podem ser úteis:

[sourcecode language="csharp"]
eMail.Fields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"] = 25;
eMail.Fields["http://schemas.microsoft.com/cdo/configuration/sendusing"] = 2;
[/sourcecode]

43 - Determinando quanto tempo a página poderá ficar em Cache na máquina do
cliente:

O Response.Expires diz, em minutos, quanto tempo a página deverá ficar na máquina
do cliente.

Response.Expires=0;                                   //a pagina não será guardada
em cache
Response.Expires=50;                                          //aqui ela ficaria no
cache por 50 minutos
Response.Expires=60*24*30;                                    //aqui ele ficaria no
cache por um mês
Response.ExpiresAbsolute = new DateTime(2007, 04, 03);                //aqui
definimos uma data exata


44 - Banco de Dados - Lendo um banco de dados mdb e exibindo num DataGrid.

       Após inserir um componente DataGrid na página, monte o seguinte código:

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="System.Data" %>

<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">

  void Page_Load(){

     string sql = "select * from clientes";
     OleDbConnection conexao = new OleDbConnection();
     OleDbCommand comando = new OleDbCommand();
     DataSet myDataset = new DataSet();
     OleDbDataAdapter myAdapter = new OleDbDataAdapter();

     conexao.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data
Source=c:\\inetpub\\wwwroot\\php\\dados.mdb";
     conexao.Open();

     myAdapter = new OleDbDataAdapter(sql,conexao);
     myAdapter.Fill(myDataset,"clientes");

     DataGrid1.DataSource = myDataset.Tables["clientes"];
     DataGrid1.DataBind();

     conexao.Close();


   }
[/sourcecode]

Nota: vale lembrar que no ASP.NET podemos usar o método Server.MapPath, para
mapear o caminho de um
arquivo, assim como faziamos no ASP tradicional. Por exemplo, para montar a string de
conexão com o
banco de dados, poderiamos fazer assim:

  conexao.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data
Source="+Server.MapPath("dados.mdb");


45 - Banco de Dados - Lendo um banco de dados mdb e exibindo num DataGrid. (2)

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">

  void Page_Load(){

     string sql = "select * from clientes";
     OleDbConnection conexao = new
OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data
Source=c:\\inetpub\\wwwroot\\php\\dados.mdb");
      OleDbDataReader objDR;
      OleDbCommand Cmd = new OleDbCommand(sql, conexao);

      conexao.Open();

    objDR =
Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

      DataGrid1.DataSource = objDR;
      DataGrid1.DataBind();
      conexao.Close();

  }

</script>
[/sourcecode]

46 - Banco de Dados - Lendo um banco de dados mdb e exibindo num Controle
Repeater.

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">

  void Page_Load(){

      string sql = "select * from clientes";
      OleDbConnection conexao = new OleDbConnection();
      OleDbCommand Cmd = new OleDbCommand(sql, conexao);
      DataSet myDataSet = new DataSet();

     conexao.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data
Source=c:\\inetpub\\wwwroot\\php\\dados.mdb";

      conexao.Open();

      OleDbDataAdapter myAdapter = new OleDbDataAdapter(sql,conexao);
      myAdapter.Fill(myDataSet,"clientes");

      Repeater1.DataSource = myDataSet.Tables["clientes"];
      Repeater1.DataBind();

      conexao.Close();

  }

</script>
<html>
<head>
</head>
<body>
   <form runat="server">
        <asp:Repeater id="Repeater1" runat="server">
        <HeaderTemplate>
        <table width="200">
        <tr bgcolor="#0099CC"><td>
        <font color="#FF0000"><b>Nome</b></font></td>
        <td>
        <font color="#FF0000"><b>Endereço</b></font></td>
        </tr>
        </HeaderTemplate>
        <ItemTemplate>
        <tr bgcolor="#669999">
        <td>
        <%# DataBinder.Eval(Container.DataItem, "codigo") %></td>
        <td>
        <%# DataBinder.Eval(Container.DataItem, "nome") %></td>
        </tr>
        </ItemTemplate>
        <AlternatingItemTemplate>
        <tr bgcolor="#ffdead">
        <td>
        <%# DataBinder.Eval(Container.DataItem, "codigo") %></td>
        <td>
        <%# DataBinder.Eval(Container.DataItem, "nome") %></td>
        </tr>
        </AlternatingItemTemplate>
        <FooterTemplate>
        <th colspan="2" bgcolor="Orange">Fim...</th>
        </table>
        </FooterTemplate>
       </asp:Repeater>
   </form>
</body>
</html>
[/sourcecode]

O controle Repeater permite que criemos um código html que será repitido na página
quantas vezes forem
necessárias. Um controle Repeater poderá ter quatro seções, entre as tags <asp:repeater>
e </asp:repeater>:

HeaderTemplate:         serão os elementos renderizados antes do primeiro registro
encontrado.
ItemTemplate:           serão os elementos renderizados para cada registro encontrado
na fonte de dados.
FooterTemplate:         serão os elementos renderizados após o último registro
encontrado.
AlternatingItemTemplate: é opcional, permite alternar a formatação de cada registro
encontrado
SeparatorTemplate:    Os elementos são renderizados entre cada linha tais como
<BR> , <HR> ou virgulas.


47 - Gravando informações num banco de dados:

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">

  void Gravar(object sender, EventArgs e) {

       string sql = "insert into filmes(titulo,genero,valor)
values(@titulo,@genero,@valor)";
       OleDbConnection conexao = new OleDbConnection();
       OleDbCommand Cmd = new OleDbCommand(sql, conexao);

       conexao.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data
Source=c:\\inetpub\\wwwroot\\php\\dados.mdb";

         Cmd.Parameters.Add(new OleDbParameter("@titulo",txtTitulo.Text));
         Cmd.Parameters.Add(new OleDbParameter("@genero", txtGenero.Text));
         Cmd.Parameters.Add(new OleDbParameter("@valor", txtValor.Text));

         conexao.Open();
         Cmd.ExecuteNonQuery();
         conexao.Close();

         Label1.Text="Dados Gravados com Sucesso";
         Label1.Visible=true;

         txtTitulo.Text="";
         txtGenero.Text="";
         txtValor.Text="";

     }

</script>
<html>
<head>
</head>
<body>
  <form runat="server">
     <p>
        Titulo&nbsp;&nbsp;<asp:TextBox id="txtTitulo"
runat="server"></asp:TextBox>
     </p>
     <p>
        Gênero
        <asp:TextBox id="txtGenero" runat="server"></asp:TextBox>
     </p>
     <p>
        Valor
        <asp:TextBox id="txtValor" runat="server"></asp:TextBox>
     </p>
     <p>
        <asp:Button id="Button1" onclick="Gravar" runat="server"
Text="Gravar"></asp:Button>
     </p>
     <p>
        <asp:Label id="Label1" runat="server" text="Label"
visible="False"></asp:Label>
     </p>
   </form>
</body>
</html>
[/sourcecode]



48 - Gravando informações num banco de dados (2)

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">

  void Page_Load(){

      string nome = "Paulo H.";

    OleDbConnection conexao = new
OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data
Source=c:\\inetpub\\wwwroot\\php\\dados.mdb");
    string comando = "insert into clientes(nome) values('"+nome+"')";
    OleDbCommand Cmd = new OleDbCommand(comando,conexao);

      conexao.Open();
      Cmd.ExecuteNonQuery();
      conexao.Close();

      Label1.Text="Dados Gravados com Sucesso";

  }
</script>
[/sourcecode]

49 - Para contar o número de registros em um banco de dados

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">

  void Contar(object sender, EventArgs e) {

    int intNum = 0;
    OleDbConnection conexao = new
OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data
Source=c:\\inetpub\\wwwroot\\php\\dados.mdb");
    string comando = "select * from clientes";
    OleDbDataReader objDR;

      OleDbCommand Cmd = new OleDbCommand(comando,conexao);

      conexao.Open();

      objDR=Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

      while(objDR.Read()){
        intNum = intNum+1;
      }

      Label1.Text="Registros encontrados: "+intNum;

  }

</script>
<html>
<head>
</head>
<body>
  <form runat="server">
     <p>
        <asp:Button id="Button1" onclick="Contar" runat="server"
Text="Contar"></asp:Button>
     </p>
     <p>
        <asp:Label id="Label1" runat="server" text="Label"></asp:Label>
     </p>
  </form>
</body>
</html>
[/sourcecode]

50 - Banco de Dados - Lendo um banco de dados

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">

  void Page_Load(){

    OleDbConnection conexao = new
OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data
Source=c:\\inetpub\\wwwroot\\php\\dados.mdb");
    string comando = "select * from clientes";
    conexao.Open();
    OleDbCommand objComd = new OleDbCommand(comando,conexao);

    OleDbDataReader objReader;

    objReader = objComd.ExecuteReader();

    while(objReader.Read()){
      Response.Write(objReader.GetValue(1) + "<br>");
    }

    conexao.Close();

   }
[/sourcecode]

51 - Criando um DropDownList:

[sourcecode language="csharp"]
   <form runat="server">
     <asp:DropDownList id="DropDownList1" runat="server">
        <asp:ListItem Value="rosa" Selected="True">Rosa</asp:ListItem>
        <asp:ListItem Value="violeta">Violeta</asp:ListItem>
        <asp:ListItem Value="tulipa">Tulipa</asp:ListItem>
        <asp:ListItem Value="margarida">Margarida</asp:ListItem>
     </asp:DropDownList>
   </form>
[/sourcecode]

O código acima representa um DropDownList com quatro items. O código abaixo
acrescentaria novos itens na
execução:

[sourcecode language="csharp"]
DropDownList1.Items.Add(New ListItem("Cravo","cravo"));
DropDownList1.Items.Add(New ListItem("Orquidea","orquidea"));
[/sourcecode]

A linha abaixo seleciona um item da lista:

[sourcecode language="csharp"]
DropDownList1.SelectedIndex=3;
[/sourcecode]

Os comandos acima também servem para o componente ListBox

Para colocar o item escolhido num componente label, por exemplo, o comando seria:

[sourcecode language="csharp"]
       Label1.Text = DropDownList1.SelectedItem.Value;
[/sourcecode]

52 - Componente AccessDataSource

O componente AccessDataSource existe a partir do ASP.NET 2.0 e é usado para acessar
bancos de dados Access.
O seu funcionamento é extremamente simples. Basta inserir o componente
AccessDataSource e na propriedade
DataFile colocar a localização do arquivo MDB.
O componente AccessDataSource possui ainda quatro propriedades: InsertCommand,
SelectCommand, DeleteCommand e
UpdateCommand que podem ser preenchidos na janela de propriedades ou podem ser
preenchidos em tempo de execução,
via programação.

Por exemplo, para inserir dados através do AccessDataSource, podemos colocar o
código abaixo em um botão:

[sourcecode language="csharp"]
       AccessDataSource.InsertCommand="insert into clientes(nome,telefone)
values('Paulo','3254-8544')";
       AccessDataSource.Insert();
[/sourcecode]

53 - Utilizando o AccessDataSource com o controle Repeater:

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<script runat="server">

  int valor = 0;

  void Page_Load(){
  }
</script>
<html>
<head>
</head>
<body>
  <form runat="server">
     <asp:AccessDataSource id="AccessDataSource1" runat="server"
SelectCommand="SELECT * FROM [clientes]"

DataFile="C:\Inetpub\wwwroot\dotnetsite\App_Data\dados.mdb"></asp:AccessDataSo
urce>
     <asp:Repeater id="Repeater1" runat="server"
DataSourceID="AccessDataSource1">
        <HeaderTemplate>
          ****** Lista de Clientes *****<br />
          <br />
        </HeaderTemplate>
        <ItemTemplate>
          Cod. <%# Eval("codigo")%> - Nome: <%#Eval("nome")%>
          <br />
          <% valor = valor + 1; %>
        </ItemTemplate>
        <SeparatorTemplate>
          ............................<br />
        </SeparatorTemplate>
        <FooterTemplate>
        <%= "Registros encontrados: "+valor %>
        </FooterTemplate>
     </asp:Repeater>
   </form>
</body>
</html>
[/sourcecode]

54 - Acessando banco de dados Firebird através do driver ODBC

O driver ODBC para Firebird deve estar instalado no sistema.

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.Odbc" %>

<script runat="server">
  void Page_Load(){

     OdbcConnection conexao = new
OdbcConnection("DRIVER={Firebird/Interbase(r)
driver};DBNAME=localhost:c:\\banco.fdb;UID=SYSDBA;PWD=masterkey");
    string comando = "select * from clientes";
    conexao.Open();

    OdbcCommand objComd = new OdbcCommand(comando,conexao);
    OdbcDataReader objReader;

    objReader = objComd.ExecuteReader();

    while(objReader.Read()){
      Response.Write(objReader.GetValue(1)+"<br>");
    }

    conexao.Close();
   }
[/sourcecode]

55 - Como criar uma conexão com firebird através do provider .net

Também podemos utilizar o Firebird .NET Data Provider, que pode ser baixado do site
oficial do Firebird.

O primeiro passo é criar, no diretório raiz do servidor, uma pasta chamada "bin". O
ASP.net automaticamente
reconhece todas as dll ali colocadas.

Agora pegamos o arquivo FirebirdSql.Data.FirebirdClient.dll (que faz parte do firebird
.net provider) e o
colocamos na pasta bin. Pronto, com isso o ASP.net já reconhece os componentes.

Agora podemos desenvolver a página a seguir:

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="FirebirdSql.Data.FirebirdClient" %>
<script runat="server">

  void Page_Load(){

    FbConnection conexao = new
FbConnection("User=SYSDBA;Password=masterkey;
Database=C:\\WERK.FDB;DataSource=localhost;Port=3050;Dialect=3");
    conexao.Open();
    FbCommand comando = new FbCommand("select * from clientes",conexao);
    FbDataReader reader = comando.ExecuteReader();

     ListBox1.Items.Clear();

     while(reader.Read()){
       ListBox1.Items.Add(reader.GetValue(0) + " - " + reader.GetValue(1) + " - " +
reader.GetValue(2));
    }

      reader.Close();
    conexao.Close();
   }
[/sourcecode]

56 - Gravando Informações no Banco de Dados Firebird

[sourcecode language="csharp"]
   void Button1_Click(){

     FbConnection conexao = new
FbConnection("User=SYSDBA;Password=masterkey;Database=
C:\\WERK.FDB;DataSource=localhost;Port=3050;Dialect=3");

     FbCommand comando = new FbCommand("insert into
clientes(nome,endereco,cidade)
values(@nome,@endereco,@cidade)", conexao);

    comando.Parameters.Add(new FbParameter("@nome", txtNome.Text));
    comando.Parameters.Add(new FbParameter("@endereco", txtEndereco.Text));
    comando.Parameters.Add(new FbParameter("@cidade", txtCidade.Text));

    conexao.Open();
    comando.ExecuteNonQuery();
    conexao.Close();

    Label1.Text = "Dados Gravados com Sucesso";

    txtNome.Text = "";
    txtEndereco.Text = "";
    txtCidade.text = "";

   }
[/sourcecode]

57 - Exibindo dados do Firebird num DataGrid

[sourcecode language="csharp"]
 void page_load(){

   FbConnection conexao = new
FbConnection("User=SYSDBA;Password=masterkey;Database=C:\\WERK.FDB;Data
Source=
localhost;Port=3050;Dialect=3");
   FbCommand comando = new FbCommand("select * from clientes", conexao);
   conexao.Open();
   FbDataReader reader =
comando.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
  DataGrid1.DataSource = reader;
  DataGrid1.DataBind();
  conexao.Close();

  }
[/sourcecode]

58 - Acesso ao arquivo de sistemas do servidor:

[sourcecode language="csharp"]
//Criar diretório:
System.IO.Directory.CreateDirectory("C:\\Teste");

//Deletar diretório
System.IO.Directory.Delete("C:\\Teste");

//Essa operação acima falhará caso a pasta não esteja vazia. Para poder apagar uma
pasta não vazia,
//definiremos o atributo 'recursive' como 'true', assim:
System.IO.Directory.Delete("C:\\Teste",true);

//Move um diretório (vazio ou não vazio)
System.IO.Directory.Move("C:\\Teste1\\Pasta", "C:\\Teste2\\Pasta");

//Verifica se um diretório existe (retorna true ou false):
System.IO.Directory.Exists("C:\\Teste6");

//Apagar um arquivo:
System.IO.File.Delete("C:\\paulo.txt");

//Copia um arquivo:
System.IO.File.Copy("C:\\teste.xls", "C:\\Teste1\\teste.xls");

//Move um arquivo:
System.IO.File.Move("C:\\teste.xls", "C:\\Teste1\\teste.xls");

//Verifica se um arquivo existe (retorna true ou false):
System.IO.File.Exists("C:\\teste.txt");

//Listando os arquivos de uma pasta:
string[] pasta = System.IO.Directory.GetFiles("C:\\Arquivos");
foreach(string item in pasta){
   Response.Write(item+"<br>");
}

//Listando os arquivos e as sub-pastas de uma pasta:
string[] pasta = System.IO.Directory.GetFileSystemEntries("C:\\Arquivos");
foreach(string item in pasta){
   Response.Write(item+"<br>");
}

//Para listar só os arquivos com extensão '.jpg' e '.jpeg':
string[] pasta = System.IO.Directory.GetFiles("C:\\Inetpub\\wwwroot\\images");
foreach(string item in pasta){
   if (item.EndsWith(".jpeg")|item.EndsWith(".jpg"))
   {
      Response.Write(item+ "<br>");
   }
}
[/sourcecode]

59 - Fazer Upload de Arquivo

Para fazer upload de um arquivo, montaremos um formulário e neste colocaremos um
componente fileupload,
um componente button e um componente label. É importante que o parâmetro 'enctype'
do formulário esteja
marcado como "multipart/form-data". No exemplo abaixo, os arquivos irão para a pasta
"C:\upload\".
Será necessário importarmos o namespace 'System.IO'.

O código abaixo será colocado no botão:

[sourcecode language="csharp"]
     if (FileUpload1.PostedFile.FileName == "")
     {
        Label1.Text = "Escolha um arquivo";
     }
     else
     {
        FileInfo infoarquivo = new FileInfo(FileUpload1.PostedFile.FileName);
        string strCaminho = "C:\\upload\\" + infoarquivo.Name;
        FileUpload1.PostedFile.SaveAs(strCaminho);
        Label1.Text = "Arquivo enviado com sucesso!";
     }
[/sourcecode]


60 - Lendo banco de dados SQLite (Usamos aqui o pacote SQLite.Net)

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ Import Namespace="Finisar.SQLite" %>

<script runat="server">
  void page_load()
  {
     SQLiteConnection conn = new SQLiteConnection();
    conn.ConnectionString = "Data
Source=C:\\locadora.db;Version=2;UTF8Encoding=True;New=False;Compress=True;"
;
    conn.Open();
    SQLiteCommand comando = new SQLiteCommand("select * from FILMES",
conn);
    SQLiteDataReader reader = comando.ExecuteReader();

      while (reader.Read())
      {
         Response.Write(reader.GetValue(1)+"<br>");
      }
      reader.Close();
      conn.Close();
  }

</script>
[/sourcecode]

61 - Gravando no banco de dados SQLite (Usamos aqui o pacote SQLite.Net)

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ Import Namespace="Finisar.SQLite" %>

<script runat="server">
  void page_load()
  {

        String titulo = Server.HtmlEncode("O silêncio dos Inocentes");
      String genero = Server.HtmlEncode("Suspense");
      String valor = Server.HtmlEncode("5.50");

     SQLiteConnection conexao = new SQLiteConnection();
     conexao.ConnectionString = "Data
Source=C:\\locadora.db;Version=2;UTF8Encoding=True;New=False;Compress=True;"
;
     SQLiteCommand comando = new SQLiteCommand("insert into
filmes(titulo,genero,valor) values('"+titulo+"',
'"+genero+"','"+valor+"')", conexao);

      conexao.Open();
      comando.ExecuteNonQuery();
      conexao.Close();

  }

</script>
[/sourcecode]
Nota: a função Server.HtmlEncode() é necessário ao usarmos o SQLite versão 2, para
que as palavras
acentuadas sejam gravadas corretamente no banco de dados.


62 - MySQL com ASP.net

 Aqui usamos a biblioteca Mysql.Data.dll que é parte do pacote MySQL-Connector-net.
Esse pacote pode ser
baixado facilmente no site oficial: www.mysql.com

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="MySql.Data.MySqlClient" %>

<script runat="server">

  void page_load(){

     MySqlConnection conexao = new MySqlConnection("DataSource=localhost;
database=locadora; CharSet=latin1;
username=root; password=963254");
     conexao.Open();
     MySqlCommand comando = new MySqlCommand("select * from filmes",
conexao);
     MySqlDataReader reader = comando.ExecuteReader();

      ListBox1.Items.Clear();

     while (reader.Read())
     {
       ListBox1.Items.Add(reader.GetValue(0) + " - " + reader.GetValue(1) + " - " +
reader.GetValue(2));
     }

      reader.Close();
      conexao.Close();
  }


</script>
[/sourcecode]

63 - Exibindo dados do MySQL em um DataGrid

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="MySql.Data.MySqlClient" %>

<script runat="server">
  void Page_Load()
  {
     MySqlConnection conexao = new MySqlConnection("DataSource=localhost;
database=locadora; CharSet=latin1;
username=root; password=458751");
     conexao.Open();
     MySqlCommand comando = new MySqlCommand("select * from filmes",
conexao);
     MySqlDataReader reader =
comando.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

      DataGrid1.DataSource = reader;
      DataGrid1.DataBind();

      reader.Close();
      conexao.Close();
  }


</script>
[/sourcecode]

64 - Gravando dados no MySQL

[sourcecode language="csharp"]
<%@ Page Language="C#" %>
<%@ import Namespace="MySql.Data.MySqlClient" %>
<script runat="server">

   protected void botao_Click(object sender, EventArgs e)
   {
     MySqlConnection conexao = new MySqlConnection("Data Source=localhost;
CharSet=latin1; database=locadora;
user id=root; password=469531");
     MySqlCommand comando = new MySqlCommand("insert into
filmes(titulo,genero,valor) values(?titulo,
?genero,?valor)", conexao);

      comando.Parameters.Add(new MySqlParameter("?titulo", txtTitulo.Text));
      comando.Parameters.Add(new MySqlParameter("?genero", txtGenero.Text));
      comando.Parameters.Add(new MySqlParameter("?valor", txtValor.Text));

      conexao.Open();
      comando.ExecuteNonQuery();
      conexao.Close();

      Label1.Text = "Dados Gravados com Sucesso";

      txtTitulo.Text = "";
      txtGenero.Text = "";
      txtValor.Text = "";
  }

</script>

[/sourcecode]

65 - Garbage Collector

O método Collect do objeto GC (Garbage Collector) força a ocorrência da coleta de lixo
e conseqüêntemente
liberação de memória.

Porém este método deve ser evitado, pois é preferível deixarmos o próprio Garbage
Collector decidir quando
deve ser feita a coleta de lixo.

Mas quando realmente precisarmos realizar a coleta de lixo através do GC devemos
tomar cuidado com a forma
correta de chamar o método Collect, o que não é uma simples chamada de método.
Veja:

- Chamamos o método Collect
- Precisamos esperar que todos os finalizes sejam rodados, liberando recursos
- Chamamos novamente o método Collect, pois a execução do finalize gera novas
instâncias a serem liberadas

Veja como fica :

        GC.Collect;
        GC.WaitForPendingFinalizers();
        GC.Collect;

				
DOCUMENT INFO
Shared By:
Categories:
Stats:
views:2038
posted:4/14/2010
language:Portuguese
pages:51