Usando Linq To SQL e MVC: parte II

Postado por: Tiago Lemos em 4th dez, 2008 | Categoria: ASP.NET, C#, Linq, SQL Server, VB

Bom, já estava na hora de finalizar esse post da utilização do MVC com LINQ To SQL.
Depois de mapearmos a tabela a ser utilizada no projeto, já podemos criar consultas, realizarmos inserções, alterações e exclusão de valores.

Listando as informações

Importe a namespace “Mvc.Models” (onde Mvc é o nome da namespace que estou utilizando).

Faça um foreach na classe “tb_cidade” em um ViewData. Escreva o nome da cidade atráves do “c.nome_cidade”.
Bom, esse código foi criado na página “Index.aspx” que é uma View, dentro da pasta Home. (View/Home/Index.aspx), preste atenção que Home é o nosso controle, então será nesse controle que iremos retornar os valores.


<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="Mvc.Views.Home.Index" %>
<%@ Import Namespace="Mvc.Models" %>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
   <h2><%= Html.Encode(ViewData["Message"]) %></h2>
   <p>To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.</p>

   <ul>
     <% foreach (tb_cidade c in (IEnumerable)ViewData.Model)
     { %>
       <li><%= c.nome_cidade %></li>
     <% } %>
   </ul>
</asp:Content>

Bem simples né? Mas como essa informação foi preenchida neste ViewData?

Retornando os dados em um Controller

Devemos retornar os dados no Controller “HomeController.cs” que fica na pasta (Controllers/HomeController.cs).

Primeiro devemos importar a namespace “Mvc.Models”, depois devemos instanciar a classe LINQ To SQL criado anteriormente, neste caso o EstudoDataContext (Estudo.dbml).

Depois devemos montar nossa consulta LINQ.

IQueryable query = (from c in estudoDC.tb_cidades
select c);

Neste caso, estou retornando todos os dados da tabela “tb_cidades” em uma interface IQueryable.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using Mvc.Models;

namespace Mvc.Controllers
{
  [HandleError]
  public class HomeController : Controller
  {
    public ActionResult Index()
    {
      EstudoDataContext estudoDC = new EstudoDataContext();
      IQueryable query = (from c in estudoDC.tb_cidades
                         select c);
      return View(query);
    }
  }
}

Agora sim, ficou fácil entender como conseguimos retornar esses dados para uma View.

Inserção, Alteração e Exclusão de informações

Veja abaixo os exemplos de insert, delete e update:


//Realizando um insert
tb_cidade cidade = new tb_cidade();
cidade.nome_cidade = "São Paulo";
estudoDC.tb_cidades.InsertOnSubmit(cidade);

//Realizando um delete
tb_cidade cidade = estudoDC.tb_cidades.Single(c => c.cidade_pk == 1);
estudoDC.tb_cidades.DeleteOnSubmit(cidade);

//Realizando um update
tb_cidade cidade = estudoDC.tb_cidades.Single(c => c.cidade_pk == 1);
cidade.nome_cidade = "Rio de Janeiro";

//Para qualquer uma das ações acima você deve comitar a alteração
//através do seguinte código
estudoDC.SubmitChanges();

Bem, caso vocês tenham alguma dúvida podem entrar em contato comigo, mas a idéia deste post foi como realmente implementar essas ações usando o MVC e LinqToSQL, e não explicar cada um das linhas detalhadamente.
Espero que tenham gostado. Em breve tem mais.

Executar consultas de Linq To SQL usando LinqPad

Postado por: Tiago Lemos em 1st dez, 2008 | Categoria: ASP.NET, C#, Linq, SQL Server, VB

Essa é uma dica rápida para você que está usando Linq To SQL e não sabe onde testar suas “novas consultas”. O LinqPad é um aplicativo para executar consultas de:

- LINQ To SQL
- LINQ To Objects
- LINQ To XML

Este programa que não precisa ser instalado na sua máquina permite a execução de consultas e ainda vem com cerca de 300 exemplos para auxiliar no aprendizado do LINQ To SQL.

Além de ser uma excelente ferramenta o LINQPad é gratuito para download e uso, mas atenção, ele não é OpenSource.

Para rodar o LINQPad na sua máquina são necessários alguns itens:

  • LINQPad requer .NET Framework 3.5 (Framework 3.5 já vem com Visual Studio 2008 ou Visual C# 2008 Express) .
  • Um banco de dados. LINQPad suporta SQL Express, SQL 2000, SQL 2005, e (com algumas limitações) o SQL 2008.

Espero que tenham gostado desta dica. Em breve irei encerrar o post sobre Usando Linq To SQL e MVC.

Usando Linq To SQL e MVC: parte I

Postado por: Tiago Lemos em 26th nov, 2008 | Categoria: ASP.NET, C#, Linq, SQL Server, VB

Vou mostrar hoje como utilizar Linq To SQL juntamente com o MVC para .NET Framework.

Não irei abordar neste post detalhes do que é Linq To SQL, nem mesmo aspectos relativos ao MVC para .NET, pois, a internet está cheia dessas informações. O principal objetivo deste post é mostrar como realizar o mapeamento de uma tabela, listar as informações, inserir, alterar e excluir registros usando Linq To SQL.

Irei dividir o post em duas partes:

Parte I

  • Criação do projeto;
  • Criação da classe Linq to SQL;
  • Mapeamento do banco;

Parte II

  • Inserção de valores;
  • Atualização;
  • Exclusão;
  • Listagem de informações

Criação do projeto

Bom, vamos começar criando um projeto, no meu caso irei criar um projeto MVC Web application, mas você pode ficar a vontade e criar o projeto que quiser, pois, o processo de utilização do Linq é o mesmo.

Criação de um projeto, neste caso é um MVC Web application

Criação da Classe Linq to SQL

Assim que criarmos o projeto, devemos criar uma classe do tipo Linq to SQL. Para isso, clique com o botão na pasta Models (criada automaticamento com o MVC Web Application, ou se for um projeto comum crie dentro do App Code), Add new item, clique no sub-item Data e escolha um objeto do tipo Linq to SQL Classes. Dê o nome do arquivo de Estudo.dbml.

Mapeamento da tabela do projeto

Assim que criarmos uma classe do tipo Linq to SQL Classes, devemos criar a conexão com banco de dados.

Use o Server Explorer para conectar a base de dados, assim que a conexão for estabelecida, abra o item tables e arraste a tabela que deseja mapear. Para mapear diferentes tabelas basta arrastá-las para o Estudo.dbml (LinqToSQL Classes)

No meu caso, eu mapeie uma tabela que possui a seguinte estrutura:

Nome da Tabela: tb_cidade
Campos: cidade_pk, nome_cidade.

Com isso encerramos a primeira parte. Aguarde pela Parte II em breve, onde iremos listar, inserir, alterar e excluir informações usando LinqToSQL.

Espero que tenham gostado.

C# para iniciantes: Operadores

Postado por: Tiago Lemos em 23rd nov, 2008 | Categoria: ASP.NET, C#

Neste novo artigo da série C# para iniciantes, irei falar sobre Operadores. No C# temos os seguintes tipos de operadores:

  • Atribuição;
  • Aritméticos;
  • Relacionais;
  • Lógicos.

Operadores de Atribuição

Operadores de atribuição são utilizados para setar valores a determinadas váriaveis. No C# possuímos os seguintes operadores de atribuição.

= (Atribuição simples)
+= (Atribuição aditiva)
-= (Atribuição Subtrativa)
*= (Atribuição Multiplicativa)
/= (Atribuição de divisão)
%= (Atribuição de módulo)

Exemplos:

//Atribuição Simples
// Define-se um valor para a variavel i, neste caso 50
int i = 50;

//Atribuição de Adicição
//Este operador "+=" equivale a (i = i + x), portanto o valor de i será 100
int i = 50;
int x = 50;

i += x;

//Atribuição de Subtração
//Este operador "-=" equivale a (i = i - x), portanto o valor de i será 0
int i = 50;
int x = 50;

i -= x;

//Atribuição de Multiplicação
//Este operador "*=" equivale a (i = i * x), portanto o valor de i será 2500
int i = 50;
int x = 50;

i *= x;

//Atribuição de Divisão
//Este operador "/=" equivale a (i = i / x), portanto o valor de i será 1
int i = 50;
int x = 50;

i /= x;

//Atribuição de Módulo ou Resto
//Este operador "%=" equivale a (i = i % x) onde neste será retornado o resto da divisão, portanto o valor de i será 0
int i = 50;
int x = 50;

i %= x;

Operadores Aritméticos

Como o próprio nome sugere, esses operadores são utilizados para realizar cálculos aritméticos. No C# possuímos os seguintes operadores aritméticos:

+ (Adição)
- (Subtração)
* (Multiplicação)
/ (Divisão)
% (Módulo/Resto)

Exemplos:

//Adicição
//A váriavel i possui o valor 60
int i = 50 + 10;

//Subtração
//A váriavel i possui o valor 40
int i = 50 - 10;

//Multiplicação
//A váriavel i possui o valor 500
int i = 50 * 10;

//Divisão
//A váriavel i possui o valor 5
int i = 50 / 10;

//Módulo ou Resto
//A váriavel i possui o valor 0
int i = 50 % 10;

Operadores Relacionais

Os operadores relacionais são utilizados nas expressões relacionais, estas sempre retornam um valor booleano: Verdadeiro ou Falso. O C# possui os seguintes operadores relacionais:

== (Igualdade)
> (Maior)
< (Menor)
<= (Menor igual)
>= (Maior igual)
!= (Diferente)

Exemplos:

int i = 30;
int x = 20;

//Igualdade
//O resultado será Falso
i == x

//Maior
//O resultado será Verdadeiro
i > x

//Menor
//O resultado será Falso
i < x

//Maior ou igual
//O resultado será Verdadeiro
i >= x

//Menor ou igual
//O resultado será Falso
i <= x

//Diferente
//O resultado será Verdadeiro
i != x

Operadores Lógicos

Os operadores lógicos são utilizados para combinar diferentes comparações. Esses são os operadores lógicos do C#:

&& (E)
|| (OU)

Exemplos:

int i = 1;
int x = 3;

//Operador && (E)
//Utilizando o operador && (E), esta condição será Falso
bool resultado = i > x && x < 5;

//Operador || (OU)
//Utilizando o operador || (OU), esta condição será Verdadeiro
bool resultado = i > x || x < 5;

Ainda existem os operadores de Incremento (++) e Decremento (–), estes são responsáveis por adicionar/subtrair o valor 1, a uma determinada váriavel.
Espero que tenham gostado. Em breve tem mais.

Enviando e-mail autenticado no C#

Postado por: Tiago Lemos em 20th nov, 2008 | Categoria: ASP.NET, C#

Bom, pode até parecer estranho, mas eu nunca precisei enviar um e-mail com autenticação, isso até hoje.
Me deparei com este simples problema e acho interessante compartilhar com todos como pode ser feito o envio de e-mails em servidores de SMTP que requerem autenticação.
Utilizando a namespace System.Net.Mail ficou muito simples o envio com autenticação. Veja o exemplo abaixo:


//Crie o email
MailMessage mail = new MailMessage();

//Adicione os endereços de e-mail
mail.From = new MailAddress("teste@teste.com.br");
mail.To.Add("teste@teste.com.br");

//Adicione o conteúdo do e-mail
mail.Subject = "Este é o Assunto";
mail.Body = "Este será o corpo do e-mail.";

//Crie o STMP de acordo com suas configurações
SmtpClient smtp = new SmtpClient("localhost");

//Para autenticar, basta setar o usuário e a senha do servidor de SMTP
smtp.Credentials = new NetworkCredential("usuario", "senha");

//Envie o e-mail
smtp.Send(mail);

Bem simples hein! Espero que tenham gostado.
Em breve tem mais.

C# para iniciantes: Estrutura de dados - Loop ou Repetição

Postado por: Tiago Lemos em 13th nov, 2008 | Categoria: ASP.NET, C#

Continuando a série de post’s para guia de consulta rápida, iremos finalizar a série de estrutura de dados falando sobre estruturas de repetição.

Diferente das estruturas condicionais, onde um determinado código é executado apenas uma vez, as estruturas de repetição tem como objetivo executar um determinado bloco de código até que uma determinada condição seja alcançada.

Bom, existem 4 estruturas de repetição no C#, são elas:

Estrutura de Repetição

For

Toda estrutura For é constituída de uma variável de inicialização, uma condição e o incremento. No exemplo abaixo podemos observar a inicialização: int i = 0, a condição: i < 10 e o incremento i++, sendo o “;” separador desses atributos.
Exemplo:


for (int i = 0; i < 10; i++)
{
   ... código ...
}

While

A estrutura While é bem mais simples que o for, pois, nele não é necessário declarar uma variável de inicialização, nem mesmo o incremento, somente é necessário declarar a condição de parada da repetição. Mas lembre-se que apesar de você não precisar declarar o incremento, você tem que preocupar com a condição, pois, caso a condição não seja falso em algum momento, você irá criar um loop infinito.
Exemplo:


while(i < 10)
{
   ... código ...
}

Do … While

O Do … While é muito semelhante à estrutura While, tendo como principal diferença a inicialização da estrutura, pois no While existe a possibilidade do código não ser executado nenhum vez (lógico que isso será vinculado ao resultado da condição), já no Do … While o código escrito dentro da estrutura será executado pelo menos uma vez, isso porque a verificação é realizada apenas no final da estrutura.
Exemplo:


do
{
   ... código ...
}
while(i != 10);

Foreach

A estrutura Foreach é utilizada para percorrer coleções ou arrays. Sua estrutura é formada pelo tipo de dado: string (porque estamos percorrendo um array de strings), o nome da variável: marca e a lista a ser percorrida: carros.
Exemplo:


string[] carros = {"Mercedes", "Ferrari", "Gol", "Palio"};
foreach (string marca in carros)
{
   Console.WriteLine("{0} ", marca);
}

Bom, com isso fechamos a estrutura de dados no C#. Podemos é claro misturar estruturas condicionais e estruturas de repetições para criar algoritmos cada vez melhor.

Espero que tenham gostado. Até o próximo post.

C# para iniciantes: Estrutura de dados - Condicionais

Postado por: Tiago Lemos em 12th nov, 2008 | Categoria: ASP.NET, C#

Seguindo a idéia de post’s para guia de consulta rápida, irei falar um pouco da estrutura de dados do C#, mais especificamente Estruturas Condicionais.

A criação de algoritimos visá à manipulação de dados para obter algum tipo de informação. Quando estes dados estão organizados de forma coerente, caracterizam uma forma, ou seja, uma estrutura de dados.

Estruturas Condicionais

If Then Else

Exemplo:


if (condição)
{
  ...código...
}elseif(condicao){
  ...código...
}else{
  ...código...
}

No C# existe também o IF-Inline:

Exemplo:


/***
* If-inline é definido da seguinte forma:
* Se condição for VERDADEIRA, então
* retorna valor1, senão
* retorna valor2
***/

int NumeroPar = 2;
int NumeroImpar = 3;

int numero = (NumeroPar > NumeroImpar) ? NumeroPar : NumeroImpar;
int numero = (condicao) ? valor1 : valor2;

Switch/Case

Exemplo:


int Numero = 2;
switch(Numero){
	case 1:
		..código...
	        break;
        case 2:
                ..código...
                break;
        case 3:
                ..código...
                break;
        default:
                ..código...
                break;
}

Estas estruturas sempre são utilizadas quando necessitamos tomar algum fluxo, mediante a uma condição ou um valor pré-definido.

Mas quando utilizarmos cada uma delas? Sempre que nós soubermos os valores das condições devemos utilizar o Switch/Case, já quando necessitarmos realizar alguns testes lógicos ou testes aritiméticos onde o valor não é exatamente conhecido, devemos utilizar o If Then Else.

Na próxima iremos ver estrutura de repetição ou estrutura de loop. Espero que tenham gostado. Em breve tem mais.

C# para iniciantes: Tipos de dados primitivos

Postado por: Tiago Lemos em 11th nov, 2008 | Categoria: ASP.NET, C#

Toda linguagem de programação possui seus tipos de dados primitivos, incluindo o C#. No Java existem somente 8 tipos de dados primitivos : Boolean , Char , byte , short , int , long , float , double.

Mas o que são os tipos de dados primitivos? Tipos de dados primitivos são os dados suportados diretamente pelo compilador. Esses dados possuem palavras chaves para facilitar sua utilização durante a implementação de um sistema.

Por exemplo, a palavra chave string mapeia diretamente o tipo System.String e o bom conhecimento destes tipos auxilia no desenvolvimento e pode impactar no desempenho de seu sistema.

Segue abaixo um tabela com as palavras chaves, tipos associados a cada uma delas e a faixa de valores que cada tipo aceita.

Palavra Chave

Tipo

Faixa de valores

bool

System.Boolean

true ou false

byte

System.Byte

-127 a 128

char

System.Char

U+0000 a U+ffff

decimal

System.Decimal

1,0 × 10-28 a 7,9 × 1028

double

System.Double

±5,0 × 10-324 a ±1,7 × 10308

float

System.Single

±1,5 × 10-45 a ±3,4 × 1038

int

System.Int32

-2.147.483.648 a 2.147.483.647

long

System.Int64

-9,223,372,036,854,775,808 a 9,223,372,036,854,775,807

Object

System.Object

Sbyte

System.Sbyte

0 a 255

Short

System.Int16

-32,768 a 32,767

String

System.String

Uint

System.UInt32

0 a 4,294,967,295

Ulong

System.UInt64

0 a 18,446,744,073,709,551,615

Ushort

System.UInt16

0 a 65,535

Bom, este post segue como um guia de consulta rápido e irei montar mais post nestes formatos em breve.

Espero que tenham gostado e aguardem por mais.

Usando C# com a biblioteca SharpZipLib - Um forma rápida e fácil de compactar arquivos

Postado por: Tiago Lemos em 28th out, 2008 | Categoria: ASP.NET, C#

Está precisando compactar arquivos para a extensão .zip e não sabe como fazer isso?

A SharpZibLib (#ZipLib) é uma biblioteca que permitir compactar arquivos para os formatos: Zip, GZip, Tar e BZip2. É uma biblioteca toda escrita em C#, mas que pode ser utilizada em qualquer linguagem da plataforma .NET. Com essa biblioteca nós podemos compactar arquivos e determinar alguns parâmetros de configuração como por exemplo, nível de compactação, password e outros.

Mas como utilizar essa biblioteca?

Primeiro adicionamos a ICSharpCode.SharpZipLib.dll a pasta bin da solution, recompilamos o projeto e então continuamos com os seguintes códigos:

1 - Importe a biblioteca em sua página

using ICSharpCode.SharpZipLib.Zip;

2 - Crie um arquivo utilizando a classe File (o arquivo deve ter o nome com a extensão .zip). Declare um objeto do tipo ZipOutputStream passando como parâmetro o arquivo que acabamos de criar. Defina o grau de compactação do Zip (1 à 9). Finalize o arquivo e feche o mesmo.

ZipOutputStream zipOutPut = new ZipOutputStream(File.Create("D:/Projetos/Exemplos/CSharp/ZIP/NomeDoArquivo.zip"));
//Compactação level 9
zipOutPut.SetLevel(9);
zipOutPut.Finish();
zipOutPut.Close();

3 - Declare um objeto do tipo ZipFile passando como parâmetro o arquivo zip que foi criado acima. Libere o zip para receber arquivos.

ZipFile zip = new ZipFile("D:/Projetos/Exemplos/CSharp/ZIP/NomeDoArquivo.zip");
//Inicia a criação do ZIP
zip.BeginUpdate();

4 - Após liberar o zip para receber arquivos, basta adicionar o arquivos de qualquer formato ao ZipFile

//Adicionando arquivos previamente criados ao zipFile
string nomeZIP = "C:/temp/NomeArquivo.txt";
zip.NameTransform = new ZipNameTransform(nomeZIP.Substring(0, nomeZIP.LastIndexOf("/")));
zip.Add(nomeZIP);

nomeZIP = "C:/temp/NomeArquivo2.xls";
zip.NameTransform = new ZipNameTransform(nomeZIP.Substring(0, nomeZIP.LastIndexOf("/")));
zip.Add(nomeZIP);

5- Grave as ações realizadas no zip e feche o arquivo

zip.CommitUpdate();
zip.Close();

6 - Faça as alterações no ContentType para devolver o arquivo zip para o usuário

HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Buffer = false;
HttpContext.Current.Response.ContentType = "application/octet-stream";
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=NomeDoArquivo.zip");

7 - Crie um FileStream e um array de Byte, para poder retornar o zip para o usuário

FileStream inStr = null;
byte[] buffer = new byte[1024];
long byteCount;

8 - Leia o arquivo zip que foi criado no FileStream instanciado anteriormente. Percorra o FileStream até o final. Verifique se o usuário está conectado, se estiver escreva o arquivo para usuário e atualize a página.

inStr = File.OpenRead("D:/Projetos/Exemplos/CSharp/ZIP/NomeDoArquivo.zip");
while ((byteCount = inStr.Read(buffer, 0, buffer.Length)) > 0)
{
    if (Context.Response.IsClientConnected)
    {
        Context.Response.OutputStream.Write(buffer, 0, buffer.Length);
        Context.Response.Flush();
    }
}
Response.End();

Espero que todos tenham gostado. Em breve tem mais.

Exportando dados para Word e Excel usando C#

Postado por: Tiago Lemos em 24th out, 2008 | Categoria: C#, HTML, VB

Há algum tempo atrás tive um problema com exportação para Word e Excel, no componente RadGrid do Telerik. O problema estava na exportação dos dados para Word e Excel do Office 2007.

Em busca de uma solução que fosse resolver este problema de exportação, indiferente da versão do Office que o usuário possui em sua máquina, eu e meu Gerente de Projetos utilizamos um artifico do Office em que uma estrutura de tabela (table - HTML) é transformada em tabela para o Word ou para o Excel:

Abaixo a descrição de como pode ser feita essa exportação:

  1. Cria-se uma string vazia;
  2. Escreve na string uma estrutura de tabela em HTML, neste caso a tabela deverá ter os dados a serem exportados;
  3. Alteramos os ContentType e AddHeader da página que irá exportar os dados;
  4. Retorne o valor da string para o usuário.

Abaixo segue um exemplo do código para exportar dados:


     //Primeiro cria uma string
     string tabela = String.Empty;

     //Monte uma estrutura HTML
     tabela += <table>
     tabela += <tr><td>Informação 1</td><td>Informação 2</td></tr>
     tabela += <tr><td>Informação 3</td><td>informação 4</td></tr>
     tabela += </table>

     //Escolha se irá exportar para Word ou Excel
     HttpContext.Current.Response.ContentType = "application/vnd.doc";
     HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=Dados.doc");

     HttpContext.Current.Response.ContentType = "application/vnd.xls";
     HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=Dados.xls");

     //Define o Encoding da página
     HttpContext.Current.Response.ContentEncoding = Encoding.Default;

     //Escreva a string
     HttpContext.Current.Response.Write(tabela);
     HttpContext.Current.Response.End();
     

É uma solução simples que funciona tanto no Office (Word/Excel) 2003 e 2007. O código está escrito em C#, mas pode ser utilizado com VB sem nenhum problema.