Mostrando postagens com marcador class. Mostrar todas as postagens
Mostrando postagens com marcador class. 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

segunda-feira, 27 de maio de 2013

LINQ to Entities

Utilizar LINQ to SQL é fácil,  mas só funciona com banco de dados MS-SQL.  

E se minha necessidade for utilizar o MySQL como banco de dados? Nesse caso teremos que utilizar o LINQ to Entities. O conceito é o mesmo e funciona para qualquer banco de dados.
Nesse caso eu vou utilizar o MySQL 5. 5.0.45.


Criei uma tabela com a seguinte estrutura:

Onde a coluna id  é por padrão incrementada 1 a 1.

Já no Visual Studio, precisamos adicionar uma conexão apontando para o MySQL.
Clique na guia Server Explorer e clique em adicionar conexão.  A janela a seguir irá aparecer:

Escolha MySQL e clique em ok.


Preencha os campos conforme seu banco de dados. No meu caso o nome do banco de dados é Projeto e esta localizada no Localhost. Vou usar o usuário root para acessar.

Após criar a conexão, é necessário adicionar o item ADO.NET Entity Data Model, como abaixo . Vou nomear o arquivo como Banco.edmx e clicar em Add. 



A janela a seguir será apresentada, escolha a opção “Generate from database”  e clique em Next.
Escolha a conexão para o banco de dados. E clique em Next.
Será apresentada a janela a seguir, nessa janela podemos escolher as entidades que vamos utilizar. No meu caso, somente a entidade usuário. Clique em Finish


Pronto, o mapeamento já foi feito e podemos trabalhar com a entidade criada.
Para inserir um registro faremos da seguinte maneira:
Banco bd = new Banco();//Representa o contexto do banco de dados

usuario u = new usuario();
u.nome = "Celso Zequim";
u.email = "czequim@gmail.com";
bd.AddTousuario(u);
bd.SaveChanges();

Ao pressionar F5, podemos ver que o registro foi inserido no Banco de dados:

Para ler essa informação e exibir no console é simples:

var usuarios = from ur in bd.usuario orderby ur.nome select ur;
foreach (usuario usr in usuarios)
{
       Console.Write(usr.nome);
       Console.WriteLine();               
}
           
O resultado é o seguinte:

Simples... e funciona para qualquer banco de dados, como: MySQL, Oracle, Postgres, Firebird... etc. 


:D


terça-feira, 30 de abril de 2013

LINQ x Stored Procedure

LINQ utiliza a Stored Procedure (SP) como sendo um métodos em seu contexto de dados.

No exemplo a seguir vou criar uma SP para listar todos os clientes com o nome Celso Zequim. veja o código:

CREATE PROCEDURE BuscaCliente      @nome varchar(255)     
     
AS
BEGIN
      SELECT * from Cliente where nome = @nome
END
 
No Visual Studio adicione um arquivo do tipo LINQ to SQL, no meu caso vou adicionar com o nome Banco.dbml.




Ao criar o arquivo, adicionei uma nova conexão em Server Explorer apontando para meu banco de dados de testes.  e naveguei até a pasta StoredProcedures


Clique e arraste a StoredProcedures para dentro do arquivo Banco.dbml.
o resultado será o seguitne:


Será adicionado um Método com o nome da SP.

No arquivo Program.cs é só chamar a SP:


   static void Main(string[] args)
   {
       BancoDataContext bd = new BancoDataContext();

  var resultado = bd.BuscaCliente("celso zequim");
  foreach (var r in resultado)
  {
 Console.Write(r.nome);
  }
  Console.ReadKey();

   }


Pressione F5 e veja o Resultado:


segunda-feira, 22 de abril de 2013

Snippet

Snippet ou Fragmento de Código é a forma de invocar códigos pré-estabelecidos pelo desenvolvedor em qualquer parte do sistema.

O Visual Studio já vem com diversos snippet  e um bom exemplo de um snippet que já existe no Visual Studio é o for.

Qualquer palavra que se digita no Visual Studio ele te mostra as possibilidades, algumas delas contém uma descrição dizendo que pode se invocar um snippet. Como no exemplo abaixo: 


É só pressionar duas vezes a tecla TAB que o snippet será invocado. O resultado é o seguinte:

No exemplo acima o Visual Studio adicionou a estrutura do for ao código.
O mesmo acontece com outras palavras, como  foreach, if, switch, etc.

Você pode criar o seu próprio snippet. O Snippet é um arquivo Xml e tem a seguinte estrutura:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
       <CodeSnippet Format="1.0.0">
             <Header>
                    <Title>Exemplo snippet</Title>
                    <Shortcut>exemplo</Shortcut>
                    <Description>Esse código adiciona for, if, while e foreach</Description>
                    <Author>Celso Zequim</Author>
                    <SnippetTypes>
                           <SnippetType>Expansion</SnippetType>
                           <SnippetType>SurroundsWith</SnippetType>
                    </SnippetTypes>
             </Header>
             <Snippet>
              <Declarations>
                     <Literal>
                           <ID>indice</ID>
                           <Default>i</Default>
                           <ToolTip>Indice</ToolTip>
                    </Literal>
                    <Literal>
                           <ID>maximo</ID>
                           <Default>Max</Default>
                            <ToolTip>Máximo Permitido</ToolTip>
                     </Literal>
        <Literal>
        <ID>valor</ID>
                            <Default>valor</Default>
        <ToolTip>Valor para comparação</ToolTip>
        </Literal>
        <Literal>
          <ID>Condicao</ID>
          <Default>condicao</Default>
          <ToolTip>Valor do switch</ToolTip>
        </Literal>
             </Declarations>
             <Code Language="csharp">
        <![CDATA[for (int $indice$ = 0; $indice$ < $maximo$; $indice$++)
                    {
                    $selected$ $end$
                    }
     
      if($valor$ == "")
                    {
                   
                    }
     
        switch ($Condicao$)
            {
                default:
            }
      ]]>
                    </Code>
             </Snippet>
       </CodeSnippet>
</CodeSnippets>

  • Header – Representa as informações exibidas no memento que se posicionar sobre a palavra de atalho,
  • Declarations – Local onde as variáveis que serão utilizadas no código deverão ser declaradas.
  • Code – Qual é o código que será impresso no momento em que o desenvolvedor invocar o snippet.

Repare que existe um código dentro do for, “$selected$ $end$”, esse código indica ao Visual Studio o local que o cursor deverá ficar assim que o desenvolvedor terminar de preencher as variáveis solicitadas.

Salve esse arquivo com a extensão “snippet”, no meu caso eu estou salvando como “exemplo.snippet”.  vá até o menu Tools e clique na opção “Code Snippets Manager”.

A seguinte janela será exibida:

Clique no botão Import e localize o arquivo que deseja importar. No meu caso é o “exemplo.snippet”.
Feito isso é só digitar em algum trecho de código o comando que você colocou em “Shortcut”, no meu caso é a palavra “exemplo”

 Note que quando posicionar sobre a palavra do seu Snippet, o Visual Studio irá lhe exibir as informações que você inseriu no Header e ao pressionar duas vezes a tecla TAB, o resultado será a seguinte:

        static void Main(string[] args)
        {

            for (int i = 0; i < Max; i++)
            {
               
            }

            if (valor == "")
            {

            }

            switch (condicao)
            {
                default:
            }
     
     
        }



Você pode usar o Snippet para adicionar qualquer código de forma rápida.


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

        }