Conectando C# ao MySQL

julho 29, 2009 by admin · Leave a Comment
Filed under: .Net, Banco de Dados, MySQL, Programação 

Quem está habituado a programar C# normalmente utiliza SQL Server como banco de dados, uma vez que ela está integrada no Visual Studio e, por isso mesmo, existe grande facilidade em trabalhar com as duas ferramentas.

Por vezes existem projetos em que se torna conveniente (por várias razões) utilizar outro tipo de base de dados. Seja que banco de dados for, a sua integração é sempre diferente do SQL Server.

Neste caso vou mostrar como fazer a integração entre o C# e o MySQL.

Supondo que já existe uma instalação do MySQL na máquina, precisamos instalar um intermediário entre o C# e a base de dados. Neste caso necessitamos instalar o MySQL Connector NET.

Download

A versão 5.2 já tem suporte ao Visual Studio 2008, mas eu vou utilizar a última versão (6.0).

Instalamos o Connector Net 6.0.

Devemos já ter uma base de dados com uma tabela (users por exemplo), em que os campos da tabela são: id, nome, email.

Como exemplo criamos um projecto Windows Forms Application.

Antes de mais nada, devemos fazer uma referência à classe que vai ligar o C# ao MySQL. Para isso vamos ao painel Solution Explorer, na raiz do projeto, clicamos com o lado direito do mouse e selecionamos Add Reference.

Na primeira divisória (.NET) selecionamos a referência MySQL.Data e damos OK.

Não esquecer: incluir no início do código as classes:

using System.Data;

using MySql.Data.MySqlClient;

Sem adicionar a referência à MySQL.Data, a classe MySql.Data.MySqlClient não será reconhecida.

Para exemplificar fazemos um formulário de inserção de dados (nome e e-mail) na base de dados.

No form colocamos duas caixas de texto, uma para o nome (txtNome) e outra para o e-mail (txtMail) e um botão que terá a ação de inserir os dados na base de dados.

Vamos então definir, em primeiro lugar, o dataset e a string de conexão à base de dados.

private MySqlConnection bdConn; //MySQL
private MySqlDataAdapter bdAdapter;
private DataSet bdDataSet; //MySQL

Na ação do botão:

//Definição do dataset
bdDataSet = new DataSet();
 //Define string de conexão
bdConn = new MySqlConnection("Persist Security  Info=False;server=localhost;database=rfidapp;uid=root;server=localhost;database=rfidapp;uid=root;pwd=''");

Neste caso a base de dados não tem password.

//Abre conecção
 try{
        bdConn.Open();
}
catch{
 MessageBox.Show("Impossível estabelecer conexão");
}
//Verifica se a conexão está aberta
if (bdConn.State == ConnectionState.Open)
{
        //Se estiver aberta insere os dados na BD
MySqlCommand commS = new MySqlCommand("INSERT INTO regists VALUES('',\\'" + txtNome + "\\',\\'" + txtMail + "\\')", bdConn);
commS.BeginExecuteNonQuery();
}

Tome atenção na sintaxe do SQL para o MySQL (INSERT) que é um pouco diferente do C#/SQL Server.

Neste momento o formulário deverá inserir dados no BD.

Fonte: Imasters

Acesso básico a dados com LINQ to SQL

maio 14, 2009 by admin · Leave a Comment
Filed under: .Net, Programação 

O desenvolvimento de aplicações para acesso a banco de dados usando a plataforma .NET não sofreu grandes alterações desde o seu lançamento. Geralmente você começa definindo o seu banco de dados, tabelas, relacionamentos, em seguida parte para a definição das classes de forma a procurar representar o domínio do seu negócio e finalmente usa os mesmos conceitos abstratos básicos de programação: definindo objetos Connection, objetos Command, objetos datareader, objetos dataset etc.

Muitos desenvolvedores já têm sua biblioteca de funções prontas ou usam recursos de terceiros ou mesmo da Microsoft, como os Data Application Blocks.

Ficamos tão acostumados como uma forma de escrever código que, muitas vezes, não percebemos que temos novos recursos à disposição, que irão garantir um melhor desempenho e manutenção. Afinal, se está funcionando, é o que importa, pensamos…

A partir da versão 3.0, e consolidada na versão 3.5 da plataforma .NET, temos um leque de novas funcionalidades que nos dão um ganho muito grande de produtividade. Uma delas, o foco deste artigo, é o LINQo SQ tL.

Neste artigo eu vou mostrar como usar os novos recursos do LINQ to SQL para efetuar o mapeamento para tabelas de um banco de dados SQL Server e, em seguida, usar os recursos da linguagem LINQ de forma  ter um código enxuto e eficiente. Bem diferente da forma como estávamos acostumados a fazer.

Vou criar uma aplicação web, mas poderia ser uma aplicação windows forms, e usando a linguagem VB .NET, vou efetuar o mapeamento OR/M para uma tabela Alunos do banco de dados Teste.mdf criado no SQL Server 2005 Express Edition, sem usar o assistente e o descritor objeto Relacional disponível, dessa forma podemos entender um pouco melhor como as coisas funcionam.

Como não é objetivo deste artigo, eu não vou mostrar como criar o banco de dados e a tabela no Visual Web Developer 2008 Express, mas essa é uma tarefa bem simples. Se você tiver dúvidas, consulte as referências para maiores detalhes.

Abaixo temos o banco de dados Teste.mdf e a tabela Alunos definida com os campos: id, nome e email, onde o campo id é uma chave primária do tipo identity;

Logo depois temos a tabela exibindo alguns dados que eu incluí para usar no projeto deste artigo.

O banco de dados será copiado na pasta App_Data.

Em seguida defina o arquivo web.config a string de conexão usada para acessar o banco de dados Teste.mdf:

<connectionStrings>
 <add name="connectionStringAlunos"
connectionString="Data
Source=.\SQLEXPRESS;AttachDbFilename='C:\Documents and
Settings\macoratti\_
   Meus documentos\Visual Studio 2008\Projects\linq_Entities\linq_Entities\App_Data\Teste.mdf';_
   Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
</connectionStrings>

Observe que temos o nome connectionStringAlunos a string de conexão usada.

Nota: Na sua máquina local a string de conexão pode ser diferente, atente para este detalhe.

No exemplo deste artigo eu vou usar o Visual Web Developer 2008 Express Edition, que já dá suporte ao LINQ to SQL e permite efetuar o mapeamento objeto relacional.

Abra o VWD 2008 e crie um novo web site a partir do menu File-> New web site com o nome de acessoLINQ usando a linguagem VB .NET;

A seguir a partir no menu Web Site -> Add New Item, selecione o template Class e informe o nome LINQ.vb e clique em Add; (o arquivo será copiado na pasta App_Code).

Antes de iniciar, clique com o botão direito do mouse sobre o nome do projeto e selecione Add Reference e, a partir da janela Add Reference, inclua a referência a System.Data.Linq;

Agora vamos criar a classe que vai efetuar o mapeamento OR/M com a tabela Alunos do nosso banco de dados. Veja o código a seguir:

Imports System
Imports System.Data.Linq.Mapping

<Table(name:="Alunos")> _
Public Class aluno

    Private _id As Integer
    Private _nome As String
    Private _email As String

 <Column(IsPrimaryKey:=True, IsDbGenerated:=True)> _
    Public Property Id() As Integer
        Get
            Return _id
        End Get
        Set(ByVal value As Integer)
            _id = value
        End Set
    End Property

    <Column(CanBeNull:=True)> _
    Public Property Nome() As String
        Get
            Return _nome
        End Get
        Set(ByVal value As String)
            _nome = value
        End Set
    End Property

    <Column(CanBeNull:=True)> _
    Public Property Email() As String
        Get
            Return _email
        End Get
        Set(ByVal value As String)
            _email = value
        End Set
    End Property

End Class

Definimos a classe aluno mapeada para a tabela Alunos e definimos três propriedades:

  • Id()
  • Nome()
  • Email()

Cada uma delas sendo mapeada para a coluna correspondente da tabela Alunos;

Com isso já teremos o acesso via entidade criada no mapeamento.

A classe aluno representa a tabela Alunos do banco de dados.

Vamos agora criar a interface na página Default.aspx. Inclua a partir da ToolBox os seguintes componentes nesta página:

  • TextBox – ID=txtNome
  • Button – ID=btnProcurar
  • GridView – ID=gdvAlunos

Defina o seguinte leiaute na página:

Agora vamos definir o código associado ao evento Click do botão Procurar:

 Protected Sub btnProcurar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnProcurar.Click

  Dim conexao As String = ConfigurationManager.ConnectionStrings("connectionStringAlunos").ConnectionString.ToString
  Dim db As New DataContext(conexao)
  Dim tAlunos As Table(Of aluno)
        tAlunos = db.GetTable(Of aluno)()
        gdvAlunos.DataSource = tAlunos.Where(Function(a) a.Nome.Contains(txtNome.Text))
        gdvAlunos.DataBind()

 End Sub

1. Obtemos a string de conexão a partir do arquivo web.config:

 Dim conexao As String = ConfigurationManager.ConnectionStrings("connectionStringAlunos").ConnectionString.ToString

2. Criamos uma instância da classe DataContext usando a conexão obtida;

Dim db As New DataContext(conexao)

3. Definimos um objeto tAlunos do tipo Table(Of )

     
Dim tAlunos As Table(Of aluno)

4. Obtemos a tabela ALunos a partir do contexto criado através do método GetTable<> que referencia o nome da classe aluno e não nome da tabela;

tAlunos = db.GetTable(Of aluno)()

5. Usamos uma expressão lambda onde selecionamos os nomes contidos na tabela a partir da expressão informada no TextBox txtNome;

tAlunos.Where(Function(a) a.Nome.Contains(txtNome.Text))

Executando o projeto, se nada for informado na caixa de texto, todos os dados da tabela serão exibidos:

Informando um critério qualquer teremos:

Observe que não nos preocupamos em definir objetos connection, commands, datareaders ou datasets apenas instanciamos um contexto a partir do qual tivemos acesso, a partir da classe mapeada para a tabela, aos dados usando uma consulta LINQ.

O código ficou mais enxuto e tivemos menos trabalho. E isso sem usar o assistente; com ele o trabalho de gerar a classe não seria necessário. Devemos portanto conhecer os novos recursos para saber avaliar quando usá-los para obtermos um produto final mais refinado.

Aguarde novos artigos sobre o assunto…

Pegue o projeto completo aqui:  acessoLINQ.zip

Referências:

Fonte: Imasters

ASP .NET – Filtrando e exibindo dados XML com LINQ

maio 7, 2009 by admin · Leave a Comment
Filed under: .Net, Programação 

O LINQ to XML é um provedor de dados LINQ que é implementado no namespace System.Xml.LINQ a partir da versão 3.5 da plataforma .NET. Ele fornece um modelo de programação que permite ler, construir e escrever dados XML.

Você pode usar LINQ To XML para realizar consultas LINQ sobre dados no formato XML que podem ser retornados do arquivo de sistemas, de uma URL HTTP remota, de um web service ou partir de qualquer XML em memória existente.

O objetivo será acessar uma fonte de dados XML exibindo o seu conteúdo em uma página ASP .NET e filtrar informações com base em um critério usando LINQ to XML.

Abaixo temos a tela de apresentação inicial da aplicação e ao lado o filtro aplicado usando como critério a cidade selecionada no controle dropdownlist.

Eu vou usar o Visual Web Developer 2008 Express Edition (VWD 2008) no exemplo deste artigo.

Vamos abrir o VWD 2008 e no menu File selecionar New Web Site selecionando o template ASP .NET Web Site, a linguagem C# , informar o nome LINQ_xml e clicar no botão OK;

Com o web site criado, vamos definir uma fonte de dados XML no projeto. Primeiro, devemos criar a pasta App_Data clicando com o botão direito do mouse sobre o nome do projeto e selecionando add ASP .NET Folder -> App_Data;

A seguir, clique com o botão direito sobre a pasta App_Data e selecione Add New Item;

A seguir, selecione o template XML File, informe o nome Clientes.xml e clique no botão Add;

A seguir, no editor XML que será aberto, defina a estrutura do arquivo XML conforme abaixo:

<?xml version="1.0" encoding="utf-8" ?>

<Clientes>

 <Cliente>
    <Nome>Macoratti</Nome>
    <Cidade>Brasilia</Cidade>
    <Idade>37</Idade>
 </Cliente>

 <Cliente>
    <Nome>Jessica</Nome>
    <Cidade>Santos</Cidade>
    <Idade>19</Idade>
 </Cliente>

 <Cliente>
    <Nome>Jefferson</Nome>
    <Cidade>Marilia</Cidade>
    <Idade>17</Idade>
 </Cliente>

 <Cliente>
    <Nome>Janice</Nome>
    <Cidade>Campinas</Cidade>
    <Idade>13</Idade>
 </Cliente>

</Clientes>

Agora, vamos criar a interface com o usuário usando o formulário Default.aspx.

Selecione a página Default.aspx e, no modo de Design a partir do menu Table -> Insert Table, inclua uma tabela com quatro linhas e duas colunas e inclua os seguintes componentes :

  • Button : ID =butGetXML
  • Button : ID = butFiltraXML
  • DropDownList : ID = ddlCidade
  • Literal : ID = litXMLDados

O leiaute do formulário web pode ser visto abaixo:

Vamos definir o código no arquivo Default.aspx.cs (code-behind).

A primeira coisa a fazer é declarar os namespaces para acessar os recursos do XML e do LINQ:

using System.Xml.Linq;
using System.Xml;

No evento Load da página vamos verificar se ocorre um postback e chamar a rotina carregaDLL para preencher o controle dropdownlist;

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            carregaDLL();
    }

O código da rotina carregaDLL() é dado a seguir. Estamos instanciando um XmlDocument e usando o seu método Load para carregar o arquivo XML;

protected void carregaDLL()
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(Server.MapPath("App_Data/Clientes.xml"));
        XmlNodeList nodeList = doc.SelectNodes("Clientes/Cliente");

        foreach (XmlNode node in nodeList)
            ddlCidade.Items.Add(new ListItem(node.SelectSingleNode("Cidade").InnerText));
    }

Agora no evento Click do botão Filtrar XML temos o seguinte código:

 protected void butFiltraXML_Click(object sender, EventArgs e)
    {
    XDocument xmlDoc = XDocument.Load(Server.MapPath("App_Data/Clientes.xml"));

  var clientes = from cliente in xmlDoc.Descendants("Cliente")
                              where cliente.Element("Cidade").Value == ddlCidade.SelectedItem.ToString()
                             select new
                             {
                                Nome = cliente.Element("Nome").Value,
                                Cidade = cliente.Element("Cidade").Value,
                                Idade = cliente.Element("Idade").Value,
                             };

        litXMLDados.Text = "";
foreach (var cliente in clientes)
        {
            litXMLDados.Text = litXMLDados.Text + "Nome  : " + cliente.Nome + "<br />";
            litXMLDados.Text = litXMLDados.Text + "Cidade: " + cliente.Cidade + "<br />";
            litXMLDados.Text = litXMLDados.Text + "Idade : " + cliente.Idade + "<br /><br />";
        }

        if (litXMLDados.Text == "")
            litXMLDados.Text = "Nada encontrado.";
    }

Neste código, estamos usando uma consulta LINQ para filtrar as informações do arquivo Clientes.xml. Observe que estamos usando o item selecionado do controle DropDownList para filtrar as informações por cidade selecionada.

A seguir temos o código do evento Click do botão – Exibir XML – que obtém as informações do arquivo xml e as exibe;

protected void butGetXML_Click(object sender, EventArgs e)
    {
  XDocument xmlDoc = XDocument.Load(Server.MapPath("App_Data/Clientes.xml"));

    var clientes = from cliente in xmlDoc.Descendants("Cliente")
                             select new
                             {
                                   Nome =  cliente.Element("Nome").Value,
                                   Cidade = cliente.Element("Cidade").Value,
                                   Idade = cliente.Element("Idade").Value,
                             };

        litXMLDados.Text = "";
  foreach (var cliente in clientes)
        {
            litXMLDados.Text = litXMLDados.Text + "Nome  : " + cliente.Nome + "<br />";
            litXMLDados.Text = litXMLDados.Text + "Cidade: " + cliente.Cidade + "<br />";
            litXMLDados.Text = litXMLDados.Text + "Idade : " + cliente.Idade + "<br /><br />";
        }

        if (litXMLDados.Text == "")
            litXMLDados.Text = "Nada encontrado.";
    }

Aqui, novamente, usamos uma consulta LINQ para selecionar informações do arquivo Clientes.xml.

Note que o código é bem simples, principalmente usando os recursos do LINQ to XML.

Pegue o projeto completo aqui: LINQ_xml.zip

Fonte: Imasters

Crie Arquivos .ZIP com ASP.NET

abril 14, 2009 by admin · Leave a Comment
Filed under: .Net, Programação 

Neste artigo vou mostrar como criar arquivos .ZIP e como descompactar utilizando o ASP.net. Imagem de exemplo do exemplo deste artigo.Imagem de exemplo do exemplo deste artigo.

Um pouco de conhecimento antes de programarmos

Arquivos .zip é um formato muito conhecido. Em Matemática, um dos modos de se obter uma compressão de arquivos, é através de Transformada de Fourier. A compressão e compactação são importantíssimas para conseguirmos informações em tempos menores de transmissão, de forma mais barata possível.

Qual a diferença entre Compressão e Compactação?

A principal diferença entre os dois termos é que compactação não há perda de informação, enquanto que na compressão há perda. O Formato .MP3 é um exemplo de Compressão, pois há perda de informação, embora nossos ouvidos não notem muito. Mesmo entre os Mp3, temos aqueles com maior qualidade (menos perda) e os de menores qualidades (maior perda).

Entre os métodos mais conhecidos de compactação estão:

  • Codificação por carreira
  • Codificação por Shannon-Fano
  • Codificação de Huffman (muito utilizado para compactar texto)
  • Codificação de Lempel-Ziv-Welch (LZW)
  • Codificação aritmética

Entre os métodos mais conhecidos de compressão estão:

  • Redução do domínio
  • Redução do espaço de quantização
  • Codificação preditiva
  • Codificação por sub-bandas
  • Codificação por transformadas
  • Quantização vetorial

Pré-requisitos

Este artigo foi montado nas configurações abaixo. Não foi testado em outros ambientes.

  • Framework ASP.NET 2.0 com VB.net
  • Visual Studio 2005.

Mãos a obra

Clique aqui para dar download no projeto de exemplo.

Primeiro, crie uma solução no seu VisualStudio. Adicione um novo projeto Web, e referencie a Biblioteca SharpZLib.

Caso você esteja usa utilizando a versão Express, crie um novo website, e coloque ICSharpCode.SharpZipLib.dll na pasta /bin.

Em seguida, vamos criar uma página chamada zip.ASPX.

Compactando Diretório Inteiro

Para compactar o diretório, você terá que informar o diretório de origem e o arquivo de destino.


''' <summary>
    ''' Evento do botão, gerar diretório
    ''' </summary>
    Protected Sub btnGerar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGerar.Click
        gerarZipDiretorio(txtOrigem.Text, txtDestino.Text)
        subInitDescompactarArquivos()
    End Sub

    ''' <summary>
    ''' Este método gera um zip, a partir de um diretório
    ''' </summary>
    ''' <param name="sDiretorioOrigem">
    ''' Diretório que será zipado
    ''' </param>
    ''' <param name="sDiretorioDestino">
    ''' Diretório que receberá o arquivo zipado
    ''' </param>
    ''' <remarks>
    ''' </remarks>
    Public Sub gerarZipDiretorio(ByVal sDiretorioOrigem As String, ByVal sDiretorioDestino As String)

        Dim sz As New FastZip()
        Dim sArquivoZip As String = String.Empty

        ' Aqui vou criar um nome do arquivo, com 6 caracteres randômicos.
        ' O Guid é um método do .net que gera string aleatórias únicas, baseada na hora e no
        ' endereço MAC na máquina gerada.
        sArquivoZip = "MeuZip" & Left(Guid.NewGuid.ToString, 6) & ".zip"

        ' Só um tratamento para garantir mais estabilidade
        If Right(sDiretorioOrigem, 1) <> "\" Then
            sDiretorioOrigem = sDiretorioOrigem & "\"
        End If

        ' Só um tratamento para garantir mais estabilidade
        If Right(sDiretorioDestino, 1) <> "\" Then
            sDiretorioDestino = sDiretorioDestino & "\"
        End If

        If Not Directory.Exists(sDiretorioDestino) Then
            lblErro.Text = "O Diretório de Destino informado não existe: <br />" & sDiretorioDestino
            Exit Sub
        End If

        If Not Directory.Exists(sDiretorioOrigem) Then
            lblErro.Text = "O Diretório de Origem informado não existe: <br />" & sDiretorioOrigem
            Exit Sub
        End If

        sz.CreateZip(sDiretorioDestino & sArquivoZip, sDiretorioOrigem & "" & "\", True, "", "")

        ' Aqui eu habilito o download do arquivo.
        ' Muito útil se você quiser salvar em diretórios protegidos
        ' Ou não acessível pela raíz do seu projeto web.
        HttpContext.Current.Response.TransmitFile(sDiretorioDestino & sArquivoZip)

        ' "Limpo" o objeto
        sz = Nothing

    End Sub

Obs.:

Você pode definir uma senha para seu .zip, utilizando a propriedade “password”.

Compactando Somente um Arquivo

Para compactar somente um arquivo, você terá que informar o arquivo a ser compactado, e o diretório de destino.


    ''' <summary>
    ''' Evento do botão gerar Arquivo
    ''' </summary>
    Protected Sub btnGerarArquivo_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGerarArquivo.Click
        gerarZipArquivo(txtArquivoOrigem.Text, txtArquivoDestino.Text)
        subInitDescompactarArquivos()
    End Sub

    ''' <summary>
    ''' Este método gera um zip, a partir de um diretório
    ''' </summary>
    ''' <param name="sArquivoOrigem">
    ''' Arquivo que será zipado
    ''' </param>
    ''' <param name="sDiretorioDestino">
    ''' Diretório que receberá o arquivo zipado
    ''' </param>
    ''' <remarks>
    ''' </remarks>
    Public Sub gerarZipArquivo(ByVal sArquivoOrigem As String, ByVal sDiretorioDestino As String)

        Dim sz As New FastZip()
        Dim sArquivoZip As String = String.Empty

        ' Aqui vou criar um nome do arquivo, com 6 caracteres randômicos.
        ' O Guid é um método do .net que gera string aleatórias únicas, baseada na hora e no
        ' endereço MAC na máquina gerada.
        sArquivoZip = "MeuZip" & Left(Guid.NewGuid.ToString, 6) & ".zip"

        ' Só um tratamento para garantir mais estabilidade
        If Right(sDiretorioDestino, 1) <> "\" Then
            sDiretorioDestino = sDiretorioDestino & "\"
        End If

        If Not Directory.Exists(sDiretorioDestino) Then
            lblErroArquivo.Text = "O Diretório de Destino informado não existe: <br />" & sDiretorioDestino
            Exit Sub
        End If

        If Not File.Exists(sArquivoOrigem) Then
            lblErroArquivo.Text = "O Arquivo de Origem informado não existe: <br />" & sArquivoOrigem
            Exit Sub
        End If

        ' Crio um arquivo do tipo stream, aprontando para o meu zip de destino.
        Dim strmZipOutputStream As ZipOutputStream
        strmZipOutputStream = New ZipOutputStream(File.Create(sDiretorioDestino & sArquivoZip))

        ' Seto o nível de compressão (0->Sem compressão / 9-> Compressão Máxima)
        strmZipOutputStream.SetLevel(9)

        ' Leio o arquivo de origem
        Dim strmFile As FileStream = File.OpenRead(sArquivoOrigem)
        Dim abyBuffer(strmFile.Length - 1) As Byte

        strmFile.Read(abyBuffer, 0, abyBuffer.Length)

        ' Aqui eu trato para pegar somente o arquivo, sem os diretórios
        ' O split é um método que separa a string, de acordo com um caractere, no meu caso "\"
        ' Cada indice da minha matriz é um diretório, e o ultimo é o arquivo
        Dim sAuxArquivo As String() = Split(sArquivoOrigem, "\")

        ' Crio uma variável, adicionando o meu Arquivo ao Zip
        ' Com ubound, eu pego o ultimo índice da minha matriz, que é o nome do meu arquivo.
        Dim objZipEntry As ZipEntry = New ZipEntry(sAuxArquivo(UBound(sAuxArquivo)))

        ' Seto a data de criação
        objZipEntry.DateTime = DateTime.Now

        ' Informo o tamanho do stream. (Do meu arquivo a ser zipado)
        objZipEntry.Size = strmFile.Length

        ' Fecho meu stream para liberar memória
        strmFile.Close()

        ' Adiciono no objeto para gerar o zip.
        strmZipOutputStream.PutNextEntry(objZipEntry)
        strmZipOutputStream.Write(abyBuffer, 0, abyBuffer.Length)

        ' "Limpo" o objeto
        strmZipOutputStream.Finish()
        strmZipOutputStream.Close()

        ' Aqui eu habilito o download do arquivo.
        ' Muito útil se você quiser salvar em diretórios protegidos
        ' Ou não acessível pela raíz do seu projeto web.
        HttpContext.Current.Response.TransmitFile(sDiretorioDestino & sArquivoZip)

    End Sub

Descompactando um arquivo .zip

Para descompactar um arquivo .zip você terá que informar o arquivo, e o diretório de destino.



    Protected Sub btnDescompactar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDescompactar.Click
        descompactarZip(txtArquivoParaDescompactar.Text, txtDescompactarArquivos.Text)
    End Sub

    ''' <summary>
    ''' Sub que descompacta um arquivo .zip apra um diretório
    ''' </summary>
    ''' <param name="sArquivoZip">
    ''' Arquivo para ser descompactado
    ''' </param>
    ''' <param name="sDiretorioParaDescompactar">
    ''' Diretório para ser descompactado
    ''' </param>
    ''' <remarks></remarks>
    Private Sub descompactarZip(ByVal sArquivoZip As String, ByVal sDiretorioParaDescompactar As String)

        Dim oMeuZip As New FastZip

        ' Se o arquivo não existe eu aviso o usuário
        If Not File.Exists(sArquivoZip) Then
            lblErroDescompactar.Text = ("Arquivo zip não existe: " & sArquivoZip)
            Exit Sub
        End If

        ' Se o arquivo não for zip, eu aviso o usuário
        If LCase(Right(sArquivoZip, 3)) <> "zip" Then
            lblErroDescompactar.Text = ("Arquivo não é do formato .zip: " & sArquivoZip)
            Exit Sub
        End If

        ' Se o arquivo não for zip, eu aviso o usuário
        If Not Directory.Exists(sDiretorioParaDescompactar) Then
            lblErroDescompactar.Text = ("Diretório para descompactar os arquivos não existe: " & sDiretorioParaDescompactar)
            Exit Sub
        End If

        ' "Deszipo" o arquivo, sem nunca sobrescrever
        oMeuZip.ExtractZip(sArquivoZip, sDiretorioParaDescompactar, FastZip.Overwrite.Never)

        lblErroDescompactar.Text = "Arquivo Descompactado com sucesso!!!!!"
    End Sub

Para você testar!

Para que você possa testar, colocamos um formulário, e um código de inicialização da página.

Formulário:


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Criar Arquivos Zip em Asp.Net</title>
    <style type="text/css">
    body, input{
    font-family: verdana;
    font-size: 10px;
    }

    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <strong>Este exemplo utiliza componentes de terceiros. Verifique o termo de uso.
                .</strong>
            <br />
            <br />
            <fieldset>
                <legend>Criar Arquivo Zip do Diretório Inteiro </legend>
                <table style="border: none;">
                    <tr>
                        <td>
                            Diretório de Origem:
                        </td>
                        <td>
                            <asp:TextBox ID="txtOrigem" runat="server" Columns="60"></asp:TextBox>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            Diretório de Destino:
                        </td>
                        <td>
                            <asp:TextBox ID="txtDestino" runat="server" Columns="60"></asp:TextBox>
                        </td>
                    </tr>
                    <tr>
                        <td colspan="2">
                            <asp:Button runat="server" ID="btnGerar" Text="Gerar Zip do Diretório inteiro" />
                            <asp:Label runat="server" ID="lblErro" Font-Bold="true" ForeColor="red"></asp:Label>
                        </td>
                    </tr>
                </table>
            </fieldset>
            <br />   <br />
            <fieldset>
                <legend>Criar Arquivo Zip de um único Arquivo </legend>
                <table style="border: none;">
                    <tr>
                        <td>
                            Arquivo para ser "zipado":
                        </td>
                        <td>
                            <asp:TextBox ID="txtArquivoOrigem" runat="server" Columns="60"></asp:TextBox>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            Diretório de Destino:
                        </td>
                        <td>
                            <asp:TextBox ID="txtArquivoDestino" runat="server" Columns="60"></asp:TextBox>
                        </td>
                    </tr>
                    <tr>
                        <td colspan="2">
                            <asp:Button runat="server" ID="btnGerarArquivo" Text="Gerar Zip de um único Arquivo" />
                            <asp:Label runat="server" ID="lblErroArquivo" Font-Bold="true" ForeColor="red"></asp:Label>
                        </td>
                    </tr>
                </table>
            </fieldset>
        </div>
        <br />   <br />
        <fieldset>
            <legend>Descompactar Arquivo .ZIP </legend>
            <table style="border: none;">
                <tr>
                    <td>
                        Arquivo para ser "deszipado":
                    </td>
                    <td>
                        <asp:TextBox ID="txtArquivoParaDescompactar" runat="server" Columns="60"></asp:TextBox>
                    </td>
                </tr>
                <tr>
                    <td>
                        Diretório para arquivos serem descompactados :
                    </td>
                    <td>
                        <asp:TextBox ID="txtDescompactarArquivos" runat="server" Columns="60"></asp:TextBox>
                    </td>
                </tr>
                <tr>
                <td colspan="2">
                <asp:Button runat="server" ID="btnDescompactar" Text="Descompactar arquivo zip" />
                <asp:Label ID="lblErroDescompactar" runat="server" Font-Bold="true" ForeColor="red"></asp:Label>
                </td>
                </tr>
            </table>
        </fieldset>
    </form>
</body>
</html>

Inicialização da Página


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If Not Page.IsPostBack Then
            ' Aqui eu dou um valor inicial, só para te ajudar a começar com um teste
            txtDestino.Text = Server.MapPath("") & "\Destino\"
            txtOrigem.Text = Server.MapPath("") & "\Origem\"

            ' Arquivo
            txtArquivoDestino.Text = Server.MapPath("") & "\Destino\"
            txtArquivoOrigem.Text = Server.MapPath("") & "\Origem\Figura.jpg"

            ' Descompactar
            txtDescompactarArquivos.Text = Server.MapPath("") & "\Descompactar\"
            subInitDescompactarArquivos()
        End If

    End Sub

    ''' <summary>
    ''' Sub só para demonstação, para você poder dezipar um arquivo, depois de enviá-lo
    ''' </summary>
    ''' <remarks></remarks>
    Protected Sub subInitDescompactarArquivos()
        Dim sArquivos As String()
        Dim sArquivo As String

        ' Seleciono todos os arquivos do tipo zip.
        sArquivos = Directory.GetFiles(txtArquivoDestino.Text, "*.zip")

        For Each sArquivo In sArquivos
            txtArquivoParaDescompactar.Text = sArquivo
            Exit For
        Next

    End Sub

Considerações finais

É possível também trabalhar com arquivos .tar, Gzip e BZip2 de forma análoga.

Fonte: Imasters

Integrando controles de validação no GridView

abril 14, 2009 by admin · Leave a Comment
Filed under: .Net, Programação 

O controle GridView é usado para exibir dados no formato tabular além de fornecer as funcionalidades para incluir, alterar e excluir registros do banco de dados relacionado. Durante a alteração ou inclusão de dados, geralmente temos que efetuar a validação dos mesmos antes de salvar no banco de dados. Este artigo mostra como você pode integrar os controles de validação com o controle Gridview de forma dinâmica em tempo de execução.

Os controles de validação que a ASP .NET disponibiliza são:

  1. RequiredFieldValidator
  2. RangeValidator
  3. RegularExpressionValidator
  4. CompareValidator
  5. CustomValidator

O que vamos mostrar é como os controles de validação podem ser criados dinamicamente em tempo de execução e serem integrados com qualquer controle de entrada de dados, no caso o GridView.

As ferramentas usadas neste artigo são:

  • Visual Web Developer 2008 Express Edition (VWD2008);
  • SQL Server 2005 Express Edition (você pode usar o Microsoft Access);

Abra o VWD2008 e no menu File selecione New Web Site;

A seguir, faça o seguinte:

  • Selecione o template ASP .NET Web Site;
  • Selecione File System em Location;
  • Selecione a linguagem Visual Basic em Language (note que poderíamos usar C#);
  • Informe o nome do web site em uma pasta local. No exemplo eu estou informando: validaGridView
  • Tecle o botão OK;

Na janela Solution Explorer selecione o formulário web Default.aspx e a partir da Caixa de Ferramentas (ToolBox) faça o seguinte:

    • Arraste e solte o controle GridView na área de Design;
    • Defina a propriedade AutoGenerateColumns do GridView como false;
    • Defina uma formatação padrão ao GridView;

Vamos criar agora o banco de dados Clientes.mdf no SQL Server que será usado neste artigo.

No menu WebSite selecione Add New Item;

A seguir, na janela Add New Item, selecione o template SQL Server Database, informe o nome Clientes.mdf e clique em Add;

Nota: Será apresentada uma caixa de diálogo solicitando a sua confirmação para copiar o arquivo para a pasta App_Data; Confirme;

Abra a pasta App_Data e clique no arquivo Clientes.mdf para abrir o DataBase Explorer;

Expanda os objetos do DataBase e clique com o botão direito sobre o objeto Tables e selecione Add New Table;

Vamos definir a tabela Contatos com a seguinte estrutura da seguinte forma:

  • No editor, você digita o nome da Coluna, define o seu tipo e define se a coluna permite valores Nulls;
  • A seguir, define a coluna clienteID como sendo a chave primária do tipo identidade (identity), com isso ela será auto-incremental;
  • Para encerrar, você clica no ícone para Salvar e informa o nome Contatos;
  • Defina os campos: clienteID, nome, sexo, idade, cidade e email; (A coluna sexo permitirá os valores M e F)

Vamos incluir alguns dados na tabela. Na janela DataBase Explorer clique com o botão direito sobre o nome da tabela Contatos recém-criada e selecione Show Table Data. A seguir, informe alguns dados, conforme mostra a figura a seguir:

Com isso já temos o nosso banco de dados Clientes.mdf e a nossa tabela Contatos. Vamos continuar. Selecione o formulário web Default.aspx, acione o modo Design e selecione o controle GridView.

Tecle F4 para abrir a janela de propriedades e defina na propriedade DataKeyNames o campo clienteID. Selecione o GridView, acione a GridView Tasks e selecione a opção Edit Columns. Inclua 5 colunas BoundField no GridView e defina as seguintes propriedades para cada uma delas:

HeaderText Nome Sexo Idade Cidade Email
DataField nome sexo idade cidade email

Conforme a figura abaixo:

Inclua uma coluna CommandField, defina seu tipo de comando como Edit/Update e traduza os textos pertinentes (se desejar);

Agora converta todos os campos vinculados (BoundField) no GridView para TemplateField, para isso, selecione o campo em Selected Fields e clique no link Convert this field into a TemplateField.

Volte a selecionar o GridView e em GridView Tasks clique no link Edit Templates.

Defina cada campo convertido como TemplateField da seguinte forma:

1. A seção ItemTemplate deverá possui um controle Label vinculado coluna de nome correspondente. Ex: coluna Nome -> Bind(“nome”)

2. A seção EditItemTemplate deverá possuir um controle TextBox vinculado à coluna de nome correspondente. Ex: Coluna Nome -> Bind(“Nome”)

Em seguida, a partir da ToolBox, na guia Validation, para a coluna Nome, inclua o controle RequiredFieldValidator e defina as seguintes propriedades:

  • ErrorMessage = Informe o nome;
    • ControlToValidate = TextBox1;

Os demais controles de validação serão definidos via código. A seguir temos quais os controles iremos usar para cada uma das colunas:

Nome RequiredFieldValidator
Sexo CustomValidator
Idade RangeValidator
cidade RequiredFieldValidator
Email RegularExpressionValidator

Dessa forma, temos o controle de validação definido para Nome em tempo de desenho e os demais controles iremos definir em tempo de execução via código.

Agora, temos que efetuar a vinculação do controle GridView com a nossa fonte de dados: a tabela Contatos do banco de dados Clientes.mdf.

Como vamos fazer isso via código, vamos criar um método chamado vinculaGrid() no arquivo Default.aspx.vb com o seguinte código:

Private Sub vinculaGrid()

 Dim
conn As String = "Data
Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Clientes.mdf;Integrated
Security=True;User Instance=True"

        Dim sql As String = "Select * from Contatos order by Nome"
        Dim da As SqlDataAdapter = New SqlDataAdapter(sql, conn)
        Dim dt As DataTable = New DataTable()

        da.Fill(dt)

        GridView1.DataSource = dt
        GridView1.DataBind()
    End Sub

Lembrando que devemos declarar no início do arquivo os imports:

Imports System.Data.SqlClient

Imports System.Data

Para chamar o método acima, vamos usar o evento Load da página da seguinte forma:

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
            vinculaGrid()
        End If
    End Sub

Executando o projeto neste momento, iremos obter:

O próximo passo é habilitar a edição e o cancelamento da edição, pois se você clicar no link Edita irá ocorrer um erro.

Lembre-se de que o nosso GridView não foi gerado usando um assistente e por isso não possui os eventos para edição e cancelamento ativos. Vamos ativá-los…

No evento RowEditing do controle GridView informe o código abaixo para permitir a edição:

Protected Sub GridView1_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) _
                   Handles GridView1.RowEditing
                           GridView1.EditIndex = e.NewEditIndex
        vinculaGrid()
    End Sub

Para permitir o cancelamento do evento acima, vamos incluir o código abaixo no evento RowCancelingEdit:

Protected Sub
GridView1_RowCancelingEdit(ByVal sender As Object, ByVal e As
System.Web.UI.WebControls.GridViewCancelEditEventArgs) _
Handles GridView1.RowCancelingEdit
        GridView1.EditIndex = -1
        vinculaGrid()
    End Sub

Executando o projeto neste momento e a seguir clicando no link Edita iremos conseguir efetuar a edição dos dados. Para a coluna Nome, como já temos o controle de validação definido, ao tentar informar um nome em branco obteremos o resultado abaixo:

Precisamos então definir os demais controles de validação e, para isso, vamos usar o evento RowDataBound do controle GridView.

Para a coluna Sexo iremos usar o controle CustomValidator, que é usado para validar uma entrada de forma customizada no lado do cliente ou do servidor. No exemplo iremos usar uma validação JavaScript do lado do cliente. Lembre-se de que a coluna Sexo deve aceitar somente os valores M, para masculino, e F, para feminino.

Primeiro vamos definir criar o código que define o controle em tempo de execução no servidor:

Depois verificamos se a linha é do tipo DataRow, ou seja, é uma linha de dados e não de cabeçalho;

A seguir verificamos se EditIndex é igual ao índice da linha atual (RowIndex) para em seguida definir via código o controle CustomValidator;

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) _
Handles GridView1.RowDataBound

If e.Row.RowType = DataControlRowType.DataRow Then

'Verificando se EditIndex é igual a Row Index atual

'então vincula os controles de validação a linha particular

If GridView1.EditIndex = e.Row.RowIndex Then

'Coluna Sexo- definindo o CustomValidator

Dim cv As CustomValidator = New CustomValidator

cv.ID = "CustomValidator1"

cv.ControlToValidate = "TextBox2"

cv.ErrorMessage = "Informação inválida"

cv.SetFocusOnError = True

cv.ValidateEmptyText = True

cv.ClientValidationFunction = "validaSexo"

e.Row.Cells(1).Controls.Add(cv)

End If

End If

End Sub
  • No código acima criamos uma instância da classe CustomValidator e definimos um ID para esta instância;
  • A seguir especificamos o controle que será validado, no caso o controle TextBox2;
  • Definimos a mensagem de erro em ErrorMessage.

Fonte: Imasters

Construindo aplicações ricas de internet com Adobe Flex 3 e ASP.NET

abril 14, 2009 by admin · 1 Comment
Filed under: .Net, FLEX, Programação 

Utilizarei o Visual Studio 2008 com o SQL Server 2005 e o banco de dados Northwind, porém os mesmos passos podem ser seguidos no Visual Studio 2005 com o SQL Server 2000.

Crie um novo projeto Web no Visual Studio, logo em seguida clique com o botão direito sobre a solução e escolha Add / New Item.

Na janela que se abrirá, selecione o Item DataSet e atribua o nome DsTerritorio.

Com o DataSet criado, clique com o botão direito dentro da janela do DataSet, escolha Add / TableAdapter, abrirá uma janela solicitando qual conexão com o banco de dados será utilizado para a construção do TableAdapter, crie a conexão com o SQL Server e salve com o nome NorthwindConn e clique em Next.

Na próxima janela selecione como o TableAdapter acessará o banco de dados, as opções possíveis são: SQL statements, criar nova Stored Procedure ou utilizar uma Stored Procedure já existente no banco de dados.

Deixe a opção Use SQL statements marcada e clique em Next.

A próxima janela é onde se insere o código SQL para o retorno dos dados, porém você pode utilizar o Query Builder, que é a ferramenta visual para construção de instruções SQL, portanto clique no botão Query Builder.

Após clicar no botão Query Builder, aparecerão duas janelas, a janela do próprio Query Builder e a janela de Add Table, a segunda janela já com as tabelas existentes no banco de dados.

Procure e selecione a tabela Region, em seguida, clique em Add. A tabela Region aparecerá no Query Builder.

Clique em Close, em seguida, selecione as duas colunas da tabela Region (RegionID e RegionDescription). Agora clique em Execute Query.

Se o resultado do Execute Query for igual à figura acima, clique em Ok. A próxima janela solicitará nomes para os métodos de Fill e Return que por padrão são Fill e GetData respectivamente.

Para a tabela Region, deixe os nomes sugeridos e clique em Next. A próxima janela exibirá o sumário da criação do TableAdapter. Clique em Finish.

Agora já é possível visualizar o TableAdapter dentro do DataSet dsTerritorio.

Ainda dentro do DataSet dsTerritorio, crie outro TableAdapter. Novamente, clique com o botão direito dentro do DataSet, escolha Add / TableAdapter, escolha a conexão com a base de dados, também escolha Use SQL statements.

Na janela do Query Builder, adicione a tabela Territories, selecione todas as colunas. Na linha RegionID, insira o parâmetro @RegionID na coluna Filter. O parâmetro será responsável por aplicar o filtro de qual região o SQL retornará os territórios.

Na janela de definições dos métodos, acrescente a expressão ByRegionID, após Fill e GetData. Dessa maneira apenas pelo nome do método é possível saber que um parâmetro chamado RegionID é esperado.

Agora que concluiu a criação do DataSet dsTerritorio, crie o DataSet dsVendedor, e dentro dele crie um TableAdapter com o SQL abaixo.

SELECT  EmployeeTerritories.EmployeeID,
        Employees.FirstName + ' ' + Employees.LastName AS FullName,
        EmployeeTerritories.TerritoryID
FROM Employees INNER JOIN EmployeeTerritories
        ON Employees.EmployeeID = EmployeeTerritories.EmployeeID
WHERE (EmployeeTerritories.TerritoryID = @TerritoryID)

Acrescente ByTerritoryID na definição dos métodos Fill e GetData.

Após clicar em Finish, o TableAdapter criado estará com os nomes DataTable1 e DataTable1TableAdapter, altere-os para Employee e EmployeeTableAdapter.

Crie um novo DataSet chamado dsCliente, e também crie um novo TableAdapter com o código abaixo.

SELECT  Customers.CustomerID, Customers.CompanyName, CustomerEmployee.EmployeeID
FROM (SELECT CustomerID, EmployeeID
        FROM Orders
        GROUP BY CustomerID, EmployeeID) AS CustomerEmployee INNER JOIN
        Customers ON CustomerEmployee.CustomerID = Customers.CustomerID
WHERE (CustomerEmployee.EmployeeID = @EmployeeID)

Para os nomes dos métodos Fill e GetDate, não esqueça de adicionar ByEmployeeID em ambos.

Como no TableAdapter de vendedores, os nomes deste TableAdapter também não estão corretos, altere-os para Customers e CustomersTableAdapter respectivamente.

Para concluir a construção dos DataSets, crie mais um chamado dsPedido e também crie um novo TableAdapter com o código abaixo.

SELECT OrderID, CustomerIR, EmployeeID, OrderDate, ShippedDate,
        ShipName, ShipAddress, ShipCity, Shipcountry
FROM Orders
WHERE (CustormerID = @CustomerID) AND
        (EmployeeID = @EmployeeID)

Acrescente ByCustomerIDEmployeeID aos métodos Fill e GetData e clique em Finalizar.

Agora crie o último TableAdapter chamado OrderDetails conforme a figura abaixo.

Após a criação de todos os DataSets (Território, Vendedor, Cliente e Pedido) o projeto deve estar conforme a figura abaixo.

Copie os seguintes arquivos do diretório de instalação do WebOrb (por padrão em c:\inetpub\wwwroot\weborb30) para o diretório do projeto .NET.

/weborb.config
/bin/weborb.dll
/WEB-INF

Adicione o código XML abaixo ao web.config do projeto .NET.

<configuration>
 <system.web>
   <httpHandlers>
     <add verb="*" path="weborb.aspx" type="Weborb.ORBHttpHandler"/>
     <add verb="*" path="codegen.aspx" type= "Weborb.Management.CodeGen.CodegeneratorHttpHandler"/>
   </httpHandlers>
 </system.web>
</configuration>

É preciso referenciar o weborb.dll ao projeto, para isso no Solution Explorer do Visual Studio, clique duas vezes sobre a opção My Project, em seguida clique em References e depois em Add / References?

Clique na aba Browse, localize o diretório Bin do projeto, selecione o arquivo weborb.dll e clique em OK, salve o projeto e feche a janela My Project.

Clique com o botão direito sobre a solução e escolha Add / New Item, porém escolha Class e dê o nome de csFlex.vb.

Nesta classe serão criados os métodos de chamada e retorno dos DataSets e TableAdapters criados anteriormente, através desses métodos é que a comunicação entre o .NET e o Flex ocorrerá.

Insira o código abaixo ao arquivo csFlex.vb

Imports Weborb.Service

Public Class csFlex

    Public Function getRegion() As DataTable
        Return New dsTerritorioTableAdapters.RegionTableAdapter().GetData()
    End Function

    Public Function getTerritories(ByVal RegionID As String) As DataTable
        Return New dsTerritorioTableAdapters.TerritoriesTableAdapter().GetDataByRegionID(RegionID)
    End Function

    Public Function getEmployee(ByVal TerritoryID As String) As DataTable
        Return New dsVendedorTableAdapters.EmployeeTableAdapter().GetDataByTerritoryID(TerritoryID
    End Function

    Public Function getCustomers(ByVal EmployeeID As String) As DataTable
        Return New dsClienteTableAdapters.CustomersTableAdapter().GetDataByEmployeeID(EmployeeID)
    End Function

    Public Function getOrders(ByVal CustomerID As String, ByVal EmployeeID As String) As DataTable
        Return New dsPedidoTableAdapters.OrdersTableAdapter().GetDataByCustomerIDEmployeeID(CustomerID, EmployeeID)
    End Function

    Public Function getOrderDetails(ByVal OrderID As String) As DataTable
        Return New dsPedidoTableAdapters.OrderDetailsTableAdapter().GetDataByOrderID(OrderID)
    End Function

End Class

Salve e feche o arquivo csFlex, agora compile o projeto. Caso o Visual Studio sinalize algum erro, volte e execute os passos novamente.

Antes de criar a interface no Adobe Flex, crie a aplicação Web no Internet Information Services (IIS) com o nome do projeto, verifique se ao acessar o endereço através do navegador uma página em branco é exibida.

Agora já com a aplicação web configurada no IIS, abra o Adobe Flex Builder 3, adicione um novo projeto (File / New / Flex Project).

Agora defina o nome do Projeto, se a opção Use default location estiver marcada, desmarque-a e localize o endereço do projeto .NET e dentro da pasta do projeto crie uma nova pasta chamada FlexSrc. O Project location do Flex deve ficar como a figura abaixo. A opção de Application type deixe marcado Web Application, e em Server technology selecione ASP.NET. Clique em Next.

Na próxima janela, na opção Server selecione Use Internet Information Services (IIS), em Web application root informe o diretório raiz da aplicação web definida no IIS e no campo Web application URL informe o endereço da aplicação no IIS. Após clicar no botão Validate Configuration, na parte superior da janela o Flex Builder deve ser informar: “The web application root and URL are valid”, caso apareça outra mensagem, os endereços informados não estão corretos, corrija antes de prosseguir.

Na mesma janela, um pouco abaixo está definida a pasta bin-debug como local a serem salvos os arquivos Flex compilados, deixe o nome que o Builder sugeriu e clique Next.

Na última janela de configuração do projeto Flex, é possível definir qual a pasta onde o Flex Builder salvará os arquivos fontes, bem como qual o nome do primeiro arquivo do projeto a ser criado.

Deixe os campos preenchidos como o Builder sugeriu e clique em Finish. Após alguns segundos o Adobe Flex Builder 3 exibirá o arquivo ArtigoFlex.mxml pronto para o início da construção da interface da aplicação.

Porém antes começar a codificar é necessário incluir um argumento de compilação ao projeto, pois sem esse argumento o Flex não conseguirá acessar os métodos construídos na classe csFlex. Para incluir o argumento, clique com o botão direito sobre o nome do projeto no Flex Navigator e em seguida clique em Properties. Com a janela de propriedades aberta, clique sobre a opção Flex Compiler, e insira o argumento após o argumento ?locale en_US

-services c:\Inetpub\wwwroot\weborb30\web-inf\flex\services-config.xml

Após inserir o argumento services, clique em OK.

Agora com o projeto corretamente configurado e pronto para comunicar com o .NET é possível iniciar a construção da interface, para tanto crie um painel, entre as tags , com o título Painel de Vendas, esse painel terá um tamanho ajustável conforme as dimensões do navegador do cliente, para isso configure as propriedades left, right, top e bottom, todos com o valor 10.

<mx:Panel layout="absolute" left="10" right="10" top="10" bottom="10" title="Painel de Vendas">
</mx:Panel>

É possível verificar como o projeto está ficando, bastar clicar no Play.

Dentro do painel, crie um canvas na cor cinza.

<mx:Canvas height="42" left="0" top="0" right="0" backgroundColor="#F3F3F3" borderStyle="none" borderThickness="1" borderColor="#C2BEBE">

</mx:Canvas>

Dentro do canvas coloque os labels e comboboxs que serão utilizados para selecionar região, território, vendedor e cliente, coloque também dentro do canvas o botão consultar.

<mx:Label y="12" text="Região" horizontalCenter="-348"/>
<mx:ComboBox y="10" id="cbRegion" labelField="RegionDescription" width="89" horizontalCenter="-274"></mx:ComboBox>
<mx:Label y="12" text="Território" horizontalCenter="-194"/>
<mx:ComboBox y="10" id="cbTerritory" labelField="TerritoryDescription" width="89" horizontalCenter="-114"></mx:ComboBox>
<mx:Label y="12" text="Vendedor" horizontalCenter="-32"/>
<mx:ComboBox y="10" id="cbEmployee" labelField="FullName" width="89" horizontalCenter="49"></mx:ComboBox>
<mx:Label y="12" text="Cliente" horizontalCenter="124"/>
<mx:ComboBox y="10" id="cbCustomer" labelField="CompanyName" width="89" horizontalCenter="198"></mx:ComboBox>
<mx:Button y="10" label="Consultar" width="119" horizontalCenter="310" id="btConsultar"/>

A propriedade horizontalCenter define qual a distância em pixel que um objeto está do centro da página, valores negativos representam objetos a esquerda do centro da tela e valores positivos representam objetos a direita, os valores definidos garantem que os objetos estarão sempre centralizados.

labelField é a propriedade que define qual o campo que será exibido como label do combobox. O Adobe Flex trabalha de maneira diferente do .NET quando o assunto é combobox ou dropdownlist, pois no .NET é possível definir apenas dois valores ao dropdownlist, o datatextfield e o datavalueFfeld, já no Adobe Flex só se define qual será o valor de exibição do combobox, labelField, pois cada linha de opção do combobox é um objeto com propriedades. Essas propriedades são as colunas que retornaram do banco de dados, logo você não tem acesso a somente duas colunas como dropdownlist, você tem acesso a todas as colunas que retornaram do banco de dados.

A propriedade Y define qual a distância que o objeto tem do topo do componente ao qual ele está pertencendo, neste caso, y=”12″ diz ao Flex que o label está a 12 pixel do topo do canvas.

Após o canvas inclua um datagrid onde serão exibidos os pedidos resultantes da consulta ao banco de dados.

<mx:DataGrid id="dgPedido" right="10" left="10" top="55" bottom="10">
<mx:columns>
        <mx:DataGridColumn headerText="Detalhes" width="85"/>
        <mx:DataGridColumn headerText="Data Pedido" dataField="OrderDate"/>
        <mx:DataGridColumn headerText="Data Entrega" dataField="ShippedDate"/>
        <mx:DataGridColumn headerText="Entregue para" dataField="ShipName"/>
        <mx:DataGridColumn headerText="Endereço" dataField="ShipAdress"/>
        <mx:DataGridColumn headerText="Cidade" dataField="ShipCity"/>
        <mx:DataGridColumn headerText="País" dataField="ShipCountry"/>
</mx:columns>
</mx:DataGrid>

Para fazer a comunicação entre a interface Flex e a aplicação server-side .NET utilize o componente RemoteObject do Adobe Flex 3.

<mx:RemoteObject id="roNet" destination="GenericDestination"
        source="ArtigoFlex.csFlex" showBusyCursor="true"
        fault="faultHandler(event)" >

        <mx:method name="getRegion" result="gotRegion(event)" />
        <mx:method name="getTerritories" result="gotTerritories(event)" />
        <mx:method name="getEmployee" result="gotEmployee(event)" />
        <mx:method name="getCustomers" result="gotCustomers(event)" />
        <mx:method name="getOrders" result="gotOrders(event)" />
        <mx:method name="getOrderDetails" result="gotOrderDetails(event)" />

</mx:RemoteObject>

A propriedade destination deve sempre ser “GenericDestination” para a comunicação através do weborb, a propriedade source deve ser preenchida com o nome do projeto .NET e a classe que será acessada, então neste caso será “ArtigoFlex.csFlex”.

A propriedade showBusyCursor seta se será exibido ou não o relógio como cursor do mouse enquanto alguma requisição ao .NET estiver sendo feita. E finalmente, fault define qual função será disparada caso algum erro ocorra durante alguma requisição do .NET.

Os métodos (

A propriedade result define qual função será disparada após o retorno da requisição ao .NET.

É necessário agora construir as funções, faultHandler, gotRegion, gotTerritories, gotEmployee, gotCustomers, gotOrders e gotOrderDetails. As funções são escritas na linguagem Action Script 3.0

<mx:Script>
        <![CDATA[
                import mx.rpc.events.ResultEvent;
                import mx.controls.Alert;
                import mx.rpc.events.FaultEvent;
        ]]>
</mx:Script>

Nesta parte do código além do bloco das tags de inicio e fim de script, também estão declaradas as importações das bibliotecas ResultEvent, Alert e FaultEvent que serão utilizadas logo mais.

Agora crie a função faultHandler

private function faultHandler(event:FaultEvent):void
{
        Alert.show(event.fault.faultString, "Erro");
}

A função faultHandler recebe um parâmetro do tipo FaultEvent que será exibido para o usuário através do Alert.show quando algum erro ocorrer durante a requisição ao .NET.

Agora crie os métodos de preenchimento dos valores do combobox região.

private function bindRegion():void
{
        roNet.getRegion();
}

private function gotRegion(event:ResultEvent):void
{
        cbRegion.dataProvider = event.result;
        cbRegion.selectedIndex = 0;
        bindTerritories();
}

No código acima foram criadas duas funções, bindRegion e gotRegion. A função bindRegion chama o método getRegion do remote object roNet.

Após o retorno da requisição ao método roNet.getRegion, a função gotRegion é disparada recebendo um parâmetro do tipo ResultEvent que contém o retorno do método getRegion, o retorno é associado como dataProvider do combobox cbRegion, em seguida é selecionado o índice zero dos dados retornados. Após a seleção do índice, a função bindTerritories() é disparada.

private function bindTerritories():void
{
        roNet.getTerritories(cbRegion.selectedItem.RegionID);
}

private function gotTerritories(event:ResultEvent):void
{
        cbTerritory.dataProvider = event.result;
        cbTerritory.selectedIndex = 0;
        bindEmployee();
}

Assim como a função bindRegion, bindTerritories chama um método do remote object roNet, porém agora o método chamado é o getTerritories, esse método espera como parâmetro o código da região, por isso o parâmetro informado é o cbRegion.selectedItem.RegionID. RegionID é uma propriedade que o dataProvider do cbRegion passou a ter após a atribuição do event.result. Abaixo estão as demais funções para a preparação dos comboboxs.

private function bindEmployee():void
{
        roNet.getEmployee(cbTerritory.selectedItem.TerritoryID);
}

private function gotEmployee(event:ResultEvent):void
{
        cbEmployee.dataProvider = event.result;
        cbEmployee.selectedIndex = 0;
        bindCustomers();
}       

private function bindCustomers():void
{
        roNet.getCustomers(cbEmployee.selectedItem.EmployeeID);
}

private function gotCustomers(event:ResultEvent):void
{
        cbCustomer.dataProvider = event.result;
        cbCustomer.selectedIndex = 0;
}

Para que quando o usuário acesse a aplicação os comboboxs já sejam preenchidos é necessário definir a propriedade creationComplete na tag mx:Application.

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="bindRegion()">

Com essa propriedade definida, depois de criada a aplicação, a função bindRegion será disparada iniciando assim a população de todos os comboboxs, pois eles estão aninhados.

Também é preciso configurar os comboboxs para que depois de alterada a seleção de um dos filtros, os outros sejam alterados também, para isso será utilizada a propriedade change.

<mx:ComboBox y="10" id="cbRegion" labelField="RegionDescription" width="89" change="bindTerritories()" horizontalCenter="-274"></mx:ComboBox>
<mx:ComboBox y="10" id="cbTerritory" labelField="TerritoryDescription" width="89" change="bindEmployee()" horizontalCenter="-114"></mx:ComboBox>
<mx:ComboBox y="10" id="cbEmployee" labelField="FullName" width="89" change="bindCustomers()" horizontalCenter="49"></mx:ComboBox>

Agora faça a população da datagrid,

private function bindOrders():void
{
        roNet.getOrders(cbCustomer.selectedItem.CustomerID,cbEmployee.selectedItem.EmployeeID);
}

private function gotOrders(event:ResultEvent):void
{
        dgPedido.dataProvider = event.result;
}

Para que a função bindOrders seja disparada ao clicar o botão Consultar, defina a propriedade click do botão btConsultar.

<mx:Button y="10" label="Consultar" width="119" click="bindOrders()" horizontalCenter="310" id="btConsultar"/>

Para finalizar o projeto, crie a estrutura para exibir os detalhes dos pedidos. Para isso crie uma TitleWindow, em File / New / MXML Component, defina o nome de orderDetails, baseado em TitleWindow

Utilize o código abaixo para a TitleWindow orderDetails.

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="730" height="420" title="Detalhes do Pedido" showCloseButton="true" close="{PopUpManager.removePopUp(this)}">
<mx:Script>
        <![CDATA[
                import mx.managers.PopUpManager;
                import mx.events.CloseEvent;
        ]]>
</mx:Script>
<mx:DataGrid left="10" right="10" top="10" bottom="10" id="dgOrderDetails">
<mx:columns>
        <mx:DataGridColumn headerText="Cód." dataField="ProductID"/>
        <mx:DataGridColumn headerText="Produto" dataField="ProductName"/>
        <mx:DataGridColumn headerText="Preço Un." dataField="UnitPrice"/>
        <mx:DataGridColumn headerText="Qtde" dataField="Quantity"/>
        <mx:DataGridColumn headerText="Desconto" dataField="Discount"/>
        <mx:DataGridColumn headerText="Total" dataField="Total"/>
</mx:columns>
</mx:DataGrid>  
</mx:TitleWindow>

Crie as funções para a população da TitleWindow orderDetails dentro do script do arquivo ArtigoFlex.mxml

import mx.managers.PopUpManager;

public function bindOrderDetails():void
{
        roNet.getOrderDetails(dgPedido.selectedItem.OrderID);
}

private function gotOrderDetails(event:ResultEvent):void
{
        var popUp:orderDetails = orderDetails(PopUpManager.createPopUp(this, orderDetails, true));
        PopUpManager.centerPopUp(popUp);
        popUp.dgOrderDetails.dataProvider = event.result;                                              
}

Altere a primeira coluna da datagrid dgPedido para o código abaixo para inserir o botão para exibir os detalhes do pedido.

<mx:DataGridColumn headerText="Detalhes" width="85">
<mx:itemRenderer>
<mx:Component>                                          
        <mx:HBox width="100%" height="100%" horizontalAlign="center">
                <mx:Button y="10" width="80" label="Detalhes" click="outerDocument.bindOrderDetails()" id="btDetalhes"/>
        </mx:HBox>                      
</mx:Component>
</mx:itemRenderer>                              
</mx:DataGridColumn>

Salve o projeto e execute, o resultado deve ser como o das figuras abaixo.

Baixe o código fonte completo.

Divirta-se.

Publicado originalmente em http://www.igormusardo.com.br

Fonte: Imasters

.NET – Invocação de objetos Remotos (Remoting)

fevereiro 2, 2009 by admin · Leave a Comment
Filed under: .Net, Programação 

O .NET Remoting suporta a comunicação de objetos distribuídos pela utilização da representação binária ou SOAP do fluxo de dados.

Sendo mais direto: O .NET Remoting proporciona que seus aplicativos tenham comunicação com sistemas remotos utilizando protocolos de comunicação.

Uma das vantagens é que podemos aproveitar os recursos de um projeto desktop (Windows Forms) em um projeto web usando o .NET Remoting, efetuando troca de informações entre os processos através de métodos e funções. Dessa forma temos que os objetos distribuídos representam serviços que uma camada de componentes oferece para uma camada de apresentação do sistema. Lembre-se que para que a troca de informações seja possível, os objetos devem ser serializáveis.

Os 3 componentes principais do .NET Framework Remoting são:

  1. Remotable Object
  2. Remote Listener Application – (escuta requisições para o Remote Object)
  3. Remote Client Application – (efetua requisições para o Remote Object)

O Remote Object é implementado em uma classe que deriva de System.MarshalByRefObject .

Portanto o Remotable Object é qualquer objeto fora do domínio da aplicação. Qualquer objeto pode ser transformado em um objeto remoto a partir da classe MarshalByRefObject. (Um objeto remoto é derivado da classe MarshalByRefObject)

A classe MarshalByRefObject permite acesso a objetos através de limites de domínio do aplicativo em aplicativos que suporte o Remoting.

Um domínio de aplicativo é uma partição em um processo do sistema operacional onde um ou mais aplicativos residem. Objetos no mesmo domínio do aplicativo se comunicam diretamente. Objetos em domínios diferentes aplicativos se comunicam por transporte de cópias dos objetos através de limites de domínio de aplicativo, ou usando um proxy para trocar mensagens.

MarshalByRefObject é a classe base para objetos que se comunicam através de limites de domínio de aplicativo, trocar mensagens usando um proxy. Objetos que não herdam de MarshalByRefObject são implicitamente empacotados por valor. Quando um aplicativo remoto referencia um pacote por valor de objeto, uma cópia do objeto é passada através de limites de domínio de aplicativo.

Objetos que não herdem de MarshalByRefObject são chamados de Non-Remotable Objects.

A seguir temos um fluxo básico da arquitetura .NET Remoting:

Quando um cliente chama um método remoto, ele não chama o método diretamente, ele recebe um proxy para o objeto remoto e o utiliza para invocar o método em um Remote Object.

Desde que o proxy recebe a chamada do método do cliente, ele codifica a mensagem usando um formato apropriado (Binary Formatter ou SOAP Formatter).

Formatters são usados para codificar e decodificar mensagens antes que elas sejam transportadas pelo Canal.

Existem dois tipos de formatadores suportados:

  • Binary Formatter – (System.RunTime.Serialization.Formatters.Binary) – os dados possuem um tamanho menor;
  • SOAP Formatter – (System.RunTime.Serialization.Formatters.Soap) – dados no formato texto baseado em arquivos XML que podem ser lidos;

A configuração dos formatadores e dos canais é feita através de arquivos de configuração como arquivos XML.

A seguir ele efetua a chamada para o servidor usando um canal selecionado (TcpChannel ,HttpChannel).

Canais são usados para transportar mensagens entre objetos Remotos, sendo assim objetos responsáveis pelo tratamento dos protocolos de rede e formatos de serialização.

Um canal pode ser implementado pela chamada do método ChannelServices.RegisterChannel ou pela utilização do arquivo de configuração, mas deve ser registrado antes dos objetos.

Quando um canal é registrado, ele automaticamente inicia a escuta para as requisições do cliente em uma porta especificada. Pelo menos um canal deve ser registrado antes que um Remote Object possa ser chamado.

Existem dois tipos de canais :

  • canal HTTP – transporta mensagens para e a partir de objetos remotos usando o protocolo SOAP;
  • canal TCP – usa o formato binário para serializar todas as mensagens para um fluxo binário e transporta o fluxo para uma URL de destino usando o protocolo TCP;

O canal do lado do servidor recebe a requisição do proxy e encaminha para o Servidor no sistema remoto que localiza e invoca os métodos do objeto Remoto.

Quando a execução do método remoto é completada, qualquer resultado da chamada é retornado de volta ao cliente.

Antes de uma instância do objeto de um tipo Remotable poder ser acessado, ele precisa ser criado e inicializado pelo processo chamado Activation que pode ser classificado em dois modelos: Client-Activated Objects e Server-activated Objects.

A diferença entre client-activated e server-activated é que o primeiro não é realmente criado quando faz a sua instanciação, ao invés disso, ele é criado somente quando necessário.

Por padrão .NET Framework vem com dois formatadores: Binary Formatter or SOAP Formatter e dois canais : TcpChannel ,HttpChannel

Trabalhando com .NET Remoting

1- Criando o Remotable Type

No código abaixo temos um exemplo da criação de um objeto remoto no VB .NET que envia a hora atual para a aplicação cliente usando o Framwork Remoting.

Note que a classe RemoteTime é derivada de MarshalByRefObject e, que no interior da classe, ele possui o método getTime() o qual retorna a hora atual de um Remote Object.

Imports System
Public Class RemoteTime
   Inherits MarshalByRefObject

   Private currentTime As String = ""

   Public Function getTime() As String
          currentTime = DateTime.Now.ToShortTimeString()
          Return "Hora do servidor remoto : " & currentTime
   End Function 

End Class 

Crie uma aplicação do tipo Class Library no VB .NET e salve com o nome de RemoteTime.vb; em seguida compile o arquivo em um library usando a linha de comando do NET Framework com a seguinte sintaxe:

vbc /t:library RemoteTime.vb

Após isso você irá obter o arquivo RemoteTime.dll .

2- Criando o Remote Listener Application

Agora temos que criar um objeto Listener para permitir que os objetos do domínio da outra aplicação possam criar instâncias do nosso objeto RemoteTime remotamente.

Quando da criação do objeto Listener temos que escolher e registrar o canal para o tratamento do protocolo de rede e do formato de serialização e registrar o Tipo no .NET Remoting de forma que ele possa usar o canal para escutar as requisições para o Tipo.

No exemplo a seguir vamos criar uma aplicação listener chamada TimeListener que irá atuar como um objeto Listener para o Tipo Remoto RemoteTime.

A classe Listener TimeListener precisa estar habilitada a encontrar o arquivo TimeListener.exe.config para carregar a configuração para a classe RemotableType.

Vamos criar uma aplicação do tipo console no VB 2008 Express com o nome TimeListener;

A seguir copie o código abaixo no arquivo TimeListener.vb;

Imports System
Imports System.Runtime.Remoting

Public Class TimeListener
     Public Shared Sub Main()
             RemotingConfiguration.Configure("TimeListener.exe.config")
             Console.WriteLine("Escutando requisições do cliente. Para sair pressione ENTER...")
             Console.ReadLine()
      End Sub
End Class

A seguir temos que criar um arquivo de configuração adicional para fornecer a informação da comunicação para o objeto listener.

O arquivo de configuração é um arquivo padrão XML onde podemos especificar o modo de ativação (Activation Mode) , o tipo Remoto (Remote Type) , Canal , porta para comunicação , etc.

Vemos abaixo o arquivo XML TimeListener.exe.config:

<configuration>
   <system.runtime.remoting>
     <application>
       <service>
       <wellknown mode="Singleton" type="RemoteTime, RemoteTime" objectUri="RemoteTime.rem" />
      </service>
       <channels>
        <channel ref="http" port="9090" />
       </channels>
   </application>
    </system.runtime.remoting>
</configuration>

Vamos compilar o arquivo TimeListener.vb usando a ferramenta de linha de comando da plataforma .NET. O comando é o seguinte:

vbc /r:RemoteTime.dll TimeListener.vb

Após compilar você deve obter o arquivo TimeListener.exe.

Criando o aplicação CLiente

3- Criando o Remote Client Application

A aplicação cliente que faz a chamada ao método do objeto Remoto é muito fácil de criar no VB .NET.

Crie uma nova aplicação do tipo Console no VB .NET com o nome Client e copie o código abaixo no arquivo Client.vb;

Imports System
Imports System.Runtime.Remoting

Public Class Client
   Public Shared Sub Main()
         RemotingConfiguration.Configure("Client.exe.config")
        Dim remoteTimeObject As New RemoteTime()
        Console.WriteLine(remoteTimeObject.getTime())
End Sub
End Class

A aplicação cliente cria uma instância do Tipo remoto RemoteTime e chama o método getTime() ; além disso ela usa o arquivo de configuração cliente.exe.config para obter a informação da comunicação para o Remoting Framework.

Temos então que criar um arquivo de configuração adicional para fornecer a informação da comunicação para o objeto Client.

<configuration>
    <system.runtime.remoting>
      <application>
       <client>
              <wellknown type="RemoteTime, RemoteTime" url="http://localhost:9090/RemoteTime.rem" />
       </client>
     </application>
  </system.runtime.remoting>
</configuration>

Compile o arquivo Client.vb usando a ferramenta da linha de comando do NET Framework SDK. O comando é o seguinte:

vbc /r:RemoteTime.dll Client.vb

Iremos obter o arquivo Client.exe.

Compilando e rodando a aplicação

Já temos os arquivos necessários para colocar para funcionar o nosso exemplo de aplicação usando o .NET Remoting. Então vamos lá…

Crie uma nova pasta chamara SRC e ponha os três arquivos que criamos nesta pasta:

  1. RemoteTime.vb
  2. TimeListener.vb
  3. Client.vb

Inclua os dois arquivos de configuração na mesma pasta:

  1. TimeListener.exe.config
  2. Client.exe.config

Lembre-se de que os arquivos já foram compilados usando a ferramenta de linha de comando do .NET Framework SDK. Os comandos usados foram:

vbc /t:library RemoteTime.vb

vbc /r:RemoteTime.dll TimeListener.vb

vbc /r:RemoteTime.dll Client.vb

Nota: Você deve fornecer o caminho físico para cada arquivo na compilação. Ex: se os arquivos estiverem na pasta c:\SRC , você deverá informar:

vbc /r:c:\SRC\RemoteTime.dll c:\SRC\TimeListener.vb

Após compilar os arquivos fontes deveremos obter os 3 arquivos na pasta SRC: RemoteTime.dll, TimeListener.exe e Client.exe

Rodando a aplicação

Agora crie duas novas pastas com o nome Server e Client respectivamente:

- Copie os arquivos : RemoteTime.dll , TimeListener.exe and TimeListener.exe.config para a pasta Server;

- Copie os arquivos: RemoteTime.dll , Client.exe and Client.exe.config para pasta Client;

Abra um prompt de comando na pasta Server e digite : TimeListener

Você deverá obter uma janela exibindo a mensagem : Escutando requisições do cliente. Para sair pressione ENTER…

Abra um prompt de comando na pasta Client e digite Client;

Você deverá obter a hora atual do objeto remoto.

Nota: Se você obtiver uma exceção relativa à segurança do IIS, você deverá configurar o IIS.

Pronto! Você acabou de criar o seu primeiro programa usando .NET Remoting com sucesso.

Tutorial C#: Introdução às Console Applications

dezembro 22, 2008 by admin · Leave a Comment
Filed under: .Net, Programação 

Na continuidade dos tutoriais de C#, decidi hoje introduzir uma novidade. As Console Application. Até agora os tutoriais foram sobretudo orientados às Windows Applications, mas hoje será relacionado com as Console Application.

Certamente muitos de vós estão a suspirar pelos tutoriais mais difíceis, mas como estes tutoriais ainda são de iniciação, servem sobretudo para aprender as noções básicas sobre C# para quem não sabe este tipo de linguagem.

Dito isto, vamos então começar a programar.
Vamos dar uma ajuda a muita gente, o tema do tutorial é sobre tabuada. O código que será escrito serve para no fim apresentar a tabuada de um número inteiro entre 1 e 9. O número será escolhido pelo utilizador.
Como se trata de uma Console Application, é necessário escolher essa opção.

- Crie um novo projecto e escolha Console Application

Irá poder verificar que agora já não existe nenhum lugar para colocar “botões”, “textbox” e outros elementos gráficos. Pois nas Console Application a apresentação dos resultados é tipo “DOS”.

O código deve ser escrito dentro das chavetas do static void.

Vamos criar duas variáveis de inteiros.

Uma variável para “guardar” o número que o utilizador escolher, e uma variável para contar o número de vezes que já foi feito o cálculo, isto é, como a tabuada acaba aos “10”, é necessário o programa saber quando acaba.

- Crie a variável int numero e int contador

Não se esqueça de atribuir o valo 0 (zero) às variáveis.

int numero = 0 ;
int contador = 0;

Enquanto nas Windows Application tem botões e textbox para inserir números, nas Console Application isso não acontece.

Neste caso, para poder “aparecer” algo no ecrã da console, e para escrever o número terá de usar a classe Console.

Vamos então permitir ao utilizador inserir um número.

- Para isso escreva Console e de seguida coloque um ponto (.)

Irá verificar que surgiram bastantes opções para a classe.

- Neste caso vamos usar a WriteLine (Console.WriteLine)

Como o próprio nome indica, “linha para escrever”.

Com este código podemos acrescentar a pergunta que queremos que seja mostrada.

Para isso coloque:

* Console.WriteLine (“Introduza o número da tabuada que quer saber?”);

Como já foi explicado em tutoriais anteriores, não se esqueça de colocar as aspas, pois é uma string.

Se pressionar o CTRL + F5, o resultado deverá ser igual à imagem seguinte.

Agora é necessário fazer com que o programa saiba qual foi o número que o utilizador introduziu.

Para isso teremos de acrescentar o seguinte código.

- numero = Int32.Parse(Console.ReadLine());

Este código faz o seguinte:

  • Atribui à variável numero, o valor inserido pelo utilizador.
  • Converte o número introduzido num inteiro (Int32.Parse).
  • O Console.ReadLine faz com que o programa “leia a linha”

Agora que o programa já “sabe” o número que foi introduzido, vamos fazer com que a validação seja feita.

Como foi mencionado no início, o utilizador só poderá introduzir um valor entre 1 e 10.

Para esta validação, vamos precisar do if e do else.

A lógica de pensamento é:

Se o número for igual ou inferior a 0 ou o número for superior a 10

O programa avisa que o número está fora do permitido.

Senão

Elabora a tabuada enquanto não atingir 10 resultados

Apresenta os números referentes à tabuada.

- A expressão “ou” em C# escreve-se com o código ||

O código será:

if (numero <= 0 || numero > 10)

{

Console.WriteLine(”O número inválido. Fora do intervalo”);

}

else

while (contador <= 10)

{

Console.WriteLine(numero + ” x ” + contador + ” = ” + numero * contador);

contador = contador + 1;

}

Uma nota importante é o facto de se a primeira validação (se o número está entre os parâmetros permitidos) estiver correcta, ele “saltará” para o While.

No While verifica se já foram atingidos todos os ciclos (10). Ao apresentar os resultados, e como o faz individualmente, indica ao contador que foi contabilizado mais um número (contador = contador +1).

Assim, o resultado apresentado será:

O número introduzido (variável numero) vezes (*) o variável contador.

Como deve ter reparado, no código para apresentar o resultado o código tem:

(…) numero + ” x ” + contador + ” = ” + (…)

Isto serve exclusivamente para adicionar texto entre variáveis para que seja possível o resultado ficar igual a 8 x 1 = 8.

8 (variável numero) x 1 (variável contador) = 8.

- Pressione as teclas CTRL + F5

E o resultado final será:

Apesar de todos sabermos a tabuada (penso eu), este tutorial serviu exclusivamente para apresentar o código em Console Application. Os tutoriais seguintes serão orientados às Windows Application.

Na próxima semana o tema será base de dados, em que o objectivo é fazer uma simples ligação entre o programa e uma base de dados. Também servirá para dar início à construção de um pequeno programa, para funcionar como o nosso gestor de CDs ou Livros.

Tutorial C# – II

dezembro 8, 2008 by admin · Leave a Comment
Filed under: .Net, Programação 

Hoje vamos começar a trabalhar com variáveis e estruturas de decisão (if/else). O tutorial de hoje será simples, e visa somente em escrevermos três números, e o programa irá “dizer” qual o maior.

Em programação as variáveis fazem sempre parte da estrutura do código. No tutorial de hoje vamos a começar a trabalhar com este aspecto importantíssimo na programação.

Recomendo a leitura a todos que estão começando ou querendo começar no C#.

Fonte: PeopleWare

Introdução ao C#

dezembro 5, 2008 by admin · Leave a Comment
Filed under: .Net, Programação 

Nos dias de hoje existe uma infinidade de linguagens de programação, e em alguns casos escolher/trocar uma é uma tarefa difícil, principalmente pelo fanatismo que os programadores de cada linguagem possuem.

Eu acredito esse fanatismo em alguns casos ser algo normal, afinal é o famoso “puxa a sardinha para o seu lado”, porém é preciso deixar claro que não existe uma “linguagem perfeita”.

Eu por exemplo, programo em algumas linguagens, apesar de simpatizar e ter a maior experiência em Java, não acho que ela seja a melhor, o que penso é que tudo depende do contexto.

Sendo assim, hoje vamos falar um pouco do C#, que é uma linguagem da Microsoft, e que tem crescido muito no mercado. Achei no site do Peopleware, co-irmão português, um bom tutorial introdutório e recomendo a leitura a todos que estão começando ou querendo começar no C#.

Fonte: PeopleWare

Próxima Página »

SEO Powered by Platinum SEO from Techblissonline