Mostrando postagens com marcador object. Mostrar todas as postagens
Mostrando postagens com marcador object. Mostrar todas as postagens

quinta-feira, 24 de outubro de 2013

Objeto para String - Serializar

Imagine que você tem um objeto e queira guardar ele em  banco de dados ou em um arquivo XML no seu estado atual.
Para isso precisaremos serializar o objeto jogando o valor para uma string.

Temos o seguinte objeto:
public class usuario
{

    public string nome;
    public string email;
    public bool ativo;
}


Precisaremos criar dois métodos, um que pega um determinado objeto e o transforma em string o outro fará o inverso.

  public static string ParaString<T>(this T valor)
  {
      XmlSerializer xml = new XmlSerializer(valor.GetType());
      StringWriter retorno = new StringWriter();
      xml.Serialize(retorno, valor);
      return retorno.ToString();
  }
  public static object ParaObjeto(string valor, Type tipo)
  {
      XmlSerializer xml = new XmlSerializer(tipo);
      var valor_serealizado = new StringReader(valor);
      return xml.Deserialize(valor_serealizado);
  }



Vou criar uma instância dessa classe com o nome de u.
usuario u = new usuario();
       u.nome = "Celso";
       u.email = "czequim@gmail.com";
       u.ativo = true;
já temos o nosso objeto criado agora precisamos serealizar.
string retorno = ParaString<usuario>(u);

O conteúdo da variável retorno será:
<usuario xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <nome>Celso</nome>
  <email>czequim@gmail.com</email>
  <ativo>true</ativo>
</usuario>

Agora se você tem esse valor em uma string e quiser fazer o inverso, transformar esse xml em um objeto. É só chamar o segundo método.
usuario Objeto =(usuario) ParaObjeto(retorno, u.GetType());


Simples assim. :D

Se for um List o processo é o mesmo.
Veja o exemplo:
List<usuario> usuarios = new List<usuario>();

     for (int i = 0; i < 10; i++)
     {
usuario u = new usuario();
       u.nome = "Celso";
u.email = "czequim@gmail.com";
       u.ativo = true;           
     }
           

     string retorno = ParaString<List<usuario>>(usuarios);          
           
           
     List< usuario> Objeto =(List<usuario>) ParaObjeto(retorno, usuarios.GetType());


simples assim também.... :D

quarta-feira, 17 de abril de 2013

Gerando Excel - Básico


Criar um arquivo Excel através do C# parece ser um bicho de 7 cabeças. Mas não é.
Basta utilizar a dll da Microsoft chamada “Microsoft.Office.Interop.Excel”. Sua utilização é muito simples, basta entender como o Excel funciona.

O Excel se divide em 3 partes:
  • Workbook – Representa o arquivo Excel
  • Worksheet – Representa uma pasta de trabalho
  • Cell – Pode conter uma informação, texto números, etc.


Um Workbook  pode conter N pastas de trabalhos  e uma pasta de trabalho contem N informações.

Nesse exemplo eu vou demonstrar como criar um arquivo excel e preencher algumas células. 

using Microsoft.Office.Interop.Excel;
namespace ExemploConsole
{
    class Program
    {
        static void Main(string[] args)
        {

            Application excel = new Application();
            Workbook wb = excel.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
            Worksheet ws = (Worksheet)wb.Worksheets.get_Item(1);

            ws.Name = "Nome da Pasta";
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    Microsoft.Office.Interop.Excel.Range ce = (ws.Cells[i + 1, j + 1] as Microsoft.Office.Interop.Excel.Range);
                    int linha = i + 1;
                    int coluna = j + 1;
                    ce.Value2 = "Valor: " + linha + " x " + coluna;
                }

            }
            wb.SaveAs("c:\\temp\\excelTeste.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

            excel.Quit();

        }
    }
}




Como pode ser visto no código acima, eu criei um workbook (wb) e um worksheet (ws).  

Fiz dois loops para adicionar informações em 10 linhas e em 10 colunas e por fim, salvei o arquivo. 

Veja o resultado:



Esse exemplo é muito útil para quem deseja criar um relatório simples em Excel.


segunda-feira, 15 de abril de 2013

Upload e Download de arquivo com LINQ


Fazer um upload de um arquivo qualquer para o banco de dados através do LINQ é muito fácil.


Criei em meu banco de dados uma tabela chamada documento, com os seguintes campos:
Tipo de dados:
Id – Uniqueidentifier
Nome – Varchar(max)
Arquivo – Image

Adicionei ao projeto um arquivo do tipo LINQ to SQL  com o nome de Banco.dbml  e adicionei a tabela documento.

Feito isso, precisamos criar a página que irá enviar o arquivo. No meu caso é a Default.aspx. veja como ficou o código:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="ExemploWeb._default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:FileUpload ID="UpArquivo" runat="server" />

        <br />

        <asp:Button ID="BtnEnviar" Text="Enviar" runat="server"
            onclick="BtnEnviar_Click"  />
    </div>
    </form>
</body>
</html>


O controle “asp:FileUpload” é necessário para fazer o upload e o controle do tipo Button que irá realizar toda mágica.  Repare que eu adicionei um evento chamado onClick e apontei para a função “BtnEnviar_Click”.  Essa função deverá ser criada no arquivo Default.aspx.cs. Veja abaixo:

       protected void BtnEnviar_Click(object sender, EventArgs e)
        {
            if (UpArquivo.HasFile && UpArquivo.PostedFile.ContentLength > 0)
            {

                byte[] _arquivo = UpArquivo.FileBytes;

                BancoDataContext bd = new BancoDataContext();
                documento doc = new documento();
                doc.id = Guid.NewGuid();
                doc.nome = UpArquivo.FileName;
                doc.arquivo = _arquivo;
                bd.documentos.InsertOnSubmit(doc);
                bd.SubmitChanges();

            }
        }

No exemplo acima eu armazenei o  arquivo, em formato de bytes, na variável _arquivo. Após armazenar o arquivo  foi criado um Contexto do meu banco de dados, dei o nome de bd. Esse contexto vem do LINQ e é responsável pela ligação do C# com o SQL.

Criei uma nova instancia do objeto documento e atribuir os valores, id, nome e arquivo.
O método InsertOnSubmit é responsável por guardar o objeto em cache até executar o submit, que é o método SubmitChanges, Até esse momento o registro ainda não existe no banco de dados.

Veja como ficou:
Clicando no botão “Escolher arquivo” a seguinte janela será exibida:

Vou escolher esse arquivo PDF e clicar em open.


Feito isso é só clicar em enviar.  O resultado já pode ser visto no banco de dados. 


Para realizar o Download do arquivo basta colocar esse trecho de código no evento do botão download, que pode ser criado exatamente como o botão enviar.
protected void BtnDownload_Click(object sender, EventArgs e)
        {
            BancoDataContext bd = new BancoDataContext();
            var arquivos = from c in bd.documentos select c;
            foreach (documento arquivo in arquivos)
            {
                Response.AddHeader("Content-Disposition", "attachment; filename=" + arquivo.nome);
                Response.ContentType = "application/x-zip-compressed";

                if (arquivo.arquivo != null)
                    Response.BinaryWrite(arquivo.arquivo.ToArray());
            }

        }







sexta-feira, 12 de abril de 2013

Criptografar senha

Aqui vai uma dica de como criptografar uma senha.

Eu particularmente utilizo um método um pouco peculiar mas que já vi várias pessoas utilizando.
No exemplo abaixo eu concateno  usuário e senha criando um Hash com essa informação. veja o exemplo:


using System.Security.Cryptography;


public static string AcertaSenha(string _login, string _senha)
{
    StringBuilder senha = new StringBuilder();

    MD5 md5 = MD5.Create();
    byte[] entrada = Encoding.ASCII.GetBytes(_login + "//" + _senha);
    byte[] hash = md5.ComputeHash(entrada);
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < hash.Length; i++)
    {
senha.Append(hash[i].ToString("X2"));
    }
    return senha.ToString();
}

Se eu passar o usuário "celso" e a senha "12345" o resultado será:
321F8F2C95B3AE3F5B9DAD4B58CF1819

em outra situação, se eu passar o usuário "CELSO" e a senha "12345" o resultado será:
5B105E94EB8276DB9738A92AFF8A490F


:)

quarta-feira, 10 de abril de 2013

Sessão - ASP.Net

As vezes precisamos manter algumas informações na memória para utilizar em qualquer lugar do site e
enviar informações por post ou query string nem sempre é a solução. A solução nesse caso é a utilização da sessão.

Sempre que acessamos um  site automaticamente u ma sessão é criada.

Podemos manter qualquer tipo de informação na sessão, texto, valores, imagens.  por exemplo:

Session["Nome"] = "Celso Zequim";

Para resgatar o valor da sessão é simples:

string nome =(string) Session["Nome"];

Esse valor estará disponível em qualquer página do site.

também é possível incluir um objeto na sessão.  por exemplo:

Criei um objeto para guardar o nome e o email do usuário logado no sistema.

public class UsuarioLogado
{

    public string Nome;
    public string email;
    public UsuarioLogado() { }
}

no arquivo Global.asax.cs indiquei no inicio da sessão qual é o objeto a ser carregado.
protected void Session_Start(object sender, EventArgs e)
{
    UsuarioLogado usuario = new UsuarioLogado();
    Session["UsuarioLogado"] = usuario;
}

ou seja, toda vez que alguém acessar o site, automaticamente será criado um objeto UsuarioLogado na sessão.
para atribuir um valor a esse objeto é só seguir o exemplo:

UsuarioLogado usuario = (UsuarioLogado)Session["UsuarioLogado"];
usuario.Nome = "Celso";
usuario.email = "czequim@gmail.com";







terça-feira, 9 de abril de 2013

DropDownList e Grid com LINQ


Recebi alguns emails questionando como trabalhar com DropDownList e GridView utilizando o Linq como fonte de dados.

Não tem muito segredo.

Veja o exemplo abaixo. 
Criei uma tabela em meu banco de dados com alguns campos.

Criei um arquivo no Visual Studio do tipo Linq to SQL, chamado de Banco.dbml e adicionei a tabela aluno.  Tenho um artigo escrito com maiores detalhes sobre o linq.

No arquivo Default.aspx adicionei o DropDownList:

<form id="form1" runat="server">
    <div>
        <asp:DropDownList ID="DDLalunos" runat="server" />
    </div>
</form>

Já no arquivo Default.aspx.cs eu indiquei como o controle será carregado:

BancoDataContext bd = new BancoDataContext();
DDLalunos.DataSource = (from c in bd.Alunos orderby c.nome select c).ToList();

DDLalunos.DataValueField = "id";
DDLalunos.DataTextField = "nome";

DDLalunos.DataBind();

Nesse exemplo eu estou listando os alunos ordenando por nome e atribuindo ao DataSource.
Feito isso será necessário indicar qual é apresentado ao usuário final e o campo que conterá o valor a ser enviado quando ocorrer o submit.

Neste caso eu estou dizendo que o valor a ser passado é a coluna ID e o valor apresentado para o usuário final é a coluna NOME.  

O DataBind é responsável por carregar essa informações indicadas anteriormente.
Ao executar, o resultado será como abaixo:


Eu posso indicar outra coluna para ser o valor apresentado ao usuário final:
BancoDataContext bd = new BancoDataContext();
DDLalunos.DataSource = (from c in bd.Alunos orderby c.nome select c).ToList();

DDLalunos.DataValueField = "id";
DDLalunos.DataTextField = "email";

DDLalunos.DataBind();


Veja o resultado:

No caso do GridView é a mesma coisa.

No arquivo Default.aspx eu adicionei a chamada o Grid

<form id="form1" runat="server">
    <div>
<asp:GridView ID="GDVAlunos" runat="server" AutoGenerateColumns="true" />
    </div>
</form>

No arquivo Default.aspx.cs indiquei qual é a fonte de dados e chamei o método DataBind();

GDVAlunos.DataSource = (from c in bd.Alunos orderby c.nome select c).ToList();
GDVAlunos.DataBind();

Veja o Resultado:





sexta-feira, 5 de abril de 2013

MVC 4.0 - Como Utilizar


O MVC (Model-View-Controller ou Modelo-Visão-Controlador) nada mais é que separar o desenvolvimento em camadas.
São três:

  •  Model - Representa os dados;
  •  View - Representa a visualização dos dados;
  •  Controller - Manipula requisições dos usuários.


Para criar um projeto utilizando MVC é simples.
*Para os exemplos que seguem, vou utilizar o Visual Studio 2012. Disponível no link "Install Visual Studio Express 2012 for Web"

Abra o Visual Studio e clique em New Project


 A janela a seguir será exibida. Selecione o item ASP.NET MVC 4 Web Application, localizado dentro de Web. Vou dar o nome do projeto como ExemploMVC.


Após o Visual Studio criar o projeto, a estrutura será essa, como na imagem abaixo:

 Se você pressionar F5, o projeto compilará e exibirá a seguinte janela:
Essa página é um controller padrão criado como exemplo.

Para criar um novo Controller é simples, clique com o botão direito sobre a pasta Controllers e vá em “Add->Controller...”

Vou dar o nome do controle como sendo “Exemplo”, veja na imagem abaixo:


Essa é a estrutura padrão de um controle:





Eu vou modificar o retorno do método Index para facilitar a demonstração:
public class ExemploController : Controller
{

public string Index()
{
return "Exemplo MVC";
}

}

Ao pressionar F5 e chamar o controle na url, veja o resultado:

Eu posso criar outros métodos, veja o exemplo abaixo:
public string nome(string valor)
        {
            return "Nome:" + valor;
        }
Nesse exemplo o método nome irá imprimir na tela o valor passado pelo usuário. Veja o resultado





Para adicionar uma View a esse controle é muito simples, primeiro você deve dizer que seu método irá retornar uma view. Como abaixo:
public ActionResult ExemploView()
        {
            return View();
        }

Após criar o método, clique com o botão direito dentro do método e clique em Add View, como no exemplo abaixo:



A janela a seguir será exibida, é interessante utilizar o mesmo nome do método para a View, isso ajuda na manutenção.


Na guia “Solution Explorer” é possível visualizar o local onde a View foi criada. Veja na imagem abaixo:




O conteúdo padrão do arquivo ExemploView.cshtml é o abaixo:
@{
    ViewBag.Title = "ExemploView";
}

<h2>ExemploView</h2>

Ao executar e chamar o controle exemplo e o método ExemploView, veja o resultado. A propriedade ViewBag.Title é responsável pelo texto exibido na barra de títulos.


 Para passar um parâmetro digitado pelo usuário do controller para a view é muito simples, veja o exemplo:
public ActionResult ExemploView(string nome)
        {
ViewBag.texto = "Olá " + nome;           
return View();
        }
Você deve criar um método que receba esse valor, no exemplo acima é uma string, nome.

Existe um controle dinâmico da view que é construído com o nome que você quiser. Nesse exemplo eu criei uma propriedade com o nome texto e disse que ela tem o valor “Olá  “ concatenado com o valor digitado pelo usuário.

No arquivo ExemploView.cshtml eu tenho que dizer que essa informação será exibida.
@{
    ViewBag.Title = "ExemploView";
}

<h2>ExemploView</h2>

@ViewBag.texto

Pressione F5 para ver o resultado:

Para adicionar um Model e trabalhar com esse tipo de camada é mais simples ainda.  Clique com o botão direito sobre o item Models e depois vá em Add-> Class



Adicionei uma classe com o nome de produto e inclui os itens: id, nome, tipo e valor.
public class produto
    {
        public int ID { get; set; }
        public string nome { get; set; }
        public string tipo { get; set; }
        public decimal valor { get; set; }
    }

Para criar um controle utilizando essa classe será necessário criar um DbContext apontando para ela. Veja o exemplo:

    public class ProdutoContexto : DbContext
    {
        public DbSet<produto> produtos { get; set; }
    }

Agora é necessário criar um controle apontando para essa classe. Veja abaixo:



No exemplo acima eu criei o controle com o nome de produto e em template disse que ele terá leitura, escrita e uma camada view.
Apontei para o model produto que criamos anteriormente e o contexto que foi criado dentro desse model. 


Pressione F5 e chame o controle na URL.  Como no exemplo abaixo:

Ao clicar no link Create New a tela a seguir será exibida:



Preencha os campos, clique em gravar e veja o resultado.

Essas informações ficam gravadas na memória, pois o Model esta apontando para o um objeto e não para o banco de dados.

Em principio eu tive um pouco de trabalho para entender como funcionava o MVC,  agora tudo ficou mais fácil e ágil.

Estou trabalhando com MVC junto com LINQ, é sensacional. Vale a pena tentar.
Em breve vou postar um exemplo utilizando com LINQ.

Utilizei como referência a própria documentação do Visual Studio e também o site http://www.asp.net/mvc