sábado, 30 de julho de 2011

Função Case no Mysql

Função Case Mysql

Assim como a função CASE é necessária quando estamos programando, ela também é muito útil em consultas SQL.
Temos duas sintaxes para a função:
Sintaxe 1 - compara a expressão especificada (valor) com um conjunto de expressões (WHEN) e retorna o valor especificado (THEN). Se nenhuma comparação for válida ele retorna o valor especificado determinado pelo ELSE. Não é obrigatória a utilização do ELSE, caso ele não seja especificado e não seja encontrada nenhuma correspondência entre os valores o retorno será NULL.
CASE valor
WHEN comparação THEN retorno (repetir para cada comparação)
[ELSE retorno]
END
Ex.:
SELECT
CASE contrato
WHEN 1 THENCLT
WHEN 2 THENPJ
ELSEInválido
END;
FROM programadores p;
Sintaxe 2 – Determina seu retorno utilizado expressões booleanas. A primeira condição verdadeira determina o resultado. Caso nenhuma condição seja atendida, o retorno vem do ELSE e se ele não for especificado o resultado é NULL.
Ex.:
CASE
WHEN condition THEN retorno (repetir para cada condição)
[ELSE retorno]
END
Ex.:
SELECT id_programador,
CASE
WHEN salario <= 1000 THENAumento 10%
WHEN salario >1000 AND salario < 5000 THENAumento 5%
ELSEAumento 2%
END
FROM programadores p;
A utilização de ambas as sintaxes não estão restritas apenas ao SELECT. Segue abaixo, a aplicação da segunda sintaxe na atualização do salário do programadores.
UPDATE
programadores
SET
salario = salario +
CASE
WHEN
salario <= 1000 THEN ((salario*10)/100)
WHEN salario >1000 AND salario < 5000 THEN ((salario*5)/100)
ELSE ((salario*2)/100)
END;



Att,
Leonardo Rocha

domingo, 24 de julho de 2011

DATABASE - Validando dados

DATABASE - Validando dados

string sql04 = "select LOGIN_EMAIL from TABLE_USUARIO where LOGIN_EMAIL='" + TxtEmail.Text+"'";
SqlConnection connection = new SqlConnection("Data Source=localhost;Initial Catalog=DB;Integrated Security=True");
SqlCommand execc = new SqlCommand(sql04, connection);
connection.Open();

object result = execc.ExecuteScalar();
if (result != null)

{
MsgEmail.Text ="Email já cadastrado!";
}
if (result == null) { //ação a ser realizada}





Att,
Leonardo Rocha.

domingo, 10 de julho de 2011

Enviando E-mail

System.Net.Mail;



using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net.Mail;

Após isso, vamos criar um método do tipo void, ou seja, não terá retorno, para enviar o email. Veja a seguir a declaração do método com seus parâmetros:

/// <summary>
/// Classe Envia Email - Variáveis
/// </summary>
/// <param name="from">Remetente</param>
/// <param name="recepient">Destinatário</param>
/// <param name="cc">Com Cópia</param>
/// <param name="bcc">Com Cópia Oculta</param>
/// <param name="subject">Assunto</param>
/// <param name="body">Corpo da Mensagem</param>

public void EnviaEmail(string from, string recepient, string cc, string bcc, string subject, string body)
{
}

Ok, agora vamos atribuir as variáveis criadas aos valores que serão passados usando as classes do System.Net.Mail:

public void EnviaEmail(string from, string recepient, string cc,
string bcc, string subject, string body)

{
//instancio a classe MailMessage, responsável por atribuir
 //os valores para as variáveis declaradas no método

MailMessage email = new MailMessage();

//endereço do remetente, chamo o método From que recebe uma nova
 //instância de MailAdress passando como parâmetro a variável from

email.From = new MailAddress(from);
 //destinatário, uso método Add, já que posso enviar para várias pessoas

email.To.Add(new MailAddress(recepient));
 //faço uma verificação, se houver cc e bcc, envio

if (cc != "")

{email.CC.Add(new MailAddress(cc));
 }
 if (bcc != "")
 {
 email.Bcc.Add(new MailAddress(bcc));
 }
 //defino o assunto
 email.Subject = subject;
 //defino o corpo da mensagem
 email.Body = body;
 //defino que o formato do texto será HTML
 email.IsBodyHtml = true;
 //minha prioridade de envio será normal
 email.Priority = MailPriority.Normal;
 //instancio o SMTP passando o host configurado no IIS
 SmtpClient smtp = new SmtpClient("exemplo.server.com");
 //envio o email por meio do método Send, passando como
 //parâmetro a variável instanciada da classe MailMessage
 smtp.Send(email);
 }
Nosso método está pronto. Agora abra o modo design da página Default.aspx, criada por padrão, e insira os campos referentes ao envio de email dessa forma:

Ordem: txtDe, txtPara, txtCc, txtBcc, txtAssunto, txtTexto, btnEnviar e lblMsg.

Dê dois cliques no botão Enviar e digite o seguinte código:
 protected void btnEnviar_Click(object sender, EventArgs e)
 {
//instancio a classe de envio de email
 EnvioEmail email = new EnvioEmail();
 //chamo o método EnviaEmail, passando os textboxes como parâmetros
 email.EnviaEmail(txtDe.Text, txtPara.Text, txtCc.Text, txtBcc.Text, txtAssunto.Text, txtTexto.Text);
 }

Essa é a forma básica de enviar emails com ASP.NET. Este exemplo só irá funcionar corretamente se o seu domínio estiver usando o SMTP configurado no IIS (Internet Information Services) e autenticado. Dito isto, não adianta eu rodar a aplicação e clicar no botão de Enviar, já que minha máquina não está configurada e o intuito desse artigo é apenas de mostrar como é simples criar um método para enviar email. Podemos configurar o SMTP pelo Web.config, arquivo de configuração de nossa aplicação.



Faça o seguinte método para enviar um email com anexo: crie um botão com o nome Anexar e ID btnAnexar, dê dois cliques nele e digite o seguinte código (antes não se esqueça de usar o namespace System.Net.Mail):

protected void btnAnexar_Click(object sender, EventArgs e)
 {
 //instancio a classe MailMessage
 MailMessage email = new MailMessage();
 //endereço do remetente, chamo o método From que recebe uma nova
 //instância de MailAdress passando como parâmetro um email de exemplo
 email.From = new MailAddress("envioemail@exemplo.com.br");
 //destinatário, uso método Add, já que posso enviar para várias pessoas
 email.To.Add(new MailAddress("wellingtonbalbo@gmail.com"));
 //defino o assunto
 email.Subject = "Teste de envio com sucesso!";
 //defino o corpo da mensagem
 email.Body = "body";
 //uso o método Attachments para anexar arquivos, lembrando que anexar
 //quantos arquivos quiser, desde que seja dada a permissão a este usuário
 email.Attachments.Add(new Attachment("C:\\teste01.txt"));
 email.Attachments.Add(new Attachment("C:\\teste02.txt"));
 email.Attachments.Add(new Attachment("C:\\teste03.txt"));
 //instancio o SMTP passando o host configurado no IIS
 SmtpClient smtp = new SmtpClient("127.0.0.1");
 //envio o email por meio do método Send, passando como
 //parâmetro a variável instanciada da classe MailMessage
 smtp.Send(email);
 }



Att,
Leonardo Rocha.

QueryString + Session

QueryString + Session

private void LoadForm(string p_id)

{
session["sess_id"] = p_id;


protected void CheckBox1_CheckedChanged1(object sender, EventArgs e)

{string sSqlatualiza = "update TB_CONTATO_OFFLINE set Status='Mensagem lida!' where ID_CONTATO_OFFLINE=" + session["sess_id"].tostring();

SqlConnection cn =
new SqlConnection("Data Source=localhost;Initial Catalog=DB;Integrated Security=True");
SqlDataAdapter da = new SqlDataAdapter(sSqlatualiza, cn);
try

{

respostaEnvioLabel.Text = "Dados Atualizados com sucesso";

respostaEnvioLabel.Visible = true;
}
 

 
catch (Exception ex)

{

respostaEnvioLabel.Text = "Ocorreu um erro ao atualizar:" + ex.Message;
respostaEnvioLabel.Visible = true;
}




Att,
Leonardo Rocha

sábado, 9 de julho de 2011

Trabalhando com um projeto em três camadas

Trabalhando com Stored Procedures no .NET

Procedures são recursos interessantes e amplamente utilizandos no desenvolvimento de aplicativos por vários motivos. O principal destes motivos é que, uma procedure é um código independente que fica pré-compilado no servidor de banco de dados, assim, retiramos a onerosidade de processamento da aplicação e a passamos para o servidor sendo que, a aplicação, apenas recebe o resultado do processamento destas procedures e continua seu fluxo de execução.

Bom estou trabalhando com a linguagem C# da plataforma .NET para efetuarmos uma inserção de usuário no banco de dados e, posteriormente, apresentar na tela se o registro foi inserido com sucesso ou não. Este exemplo é baseado no modelo em camadas.
Bom vamos lá, mãos a obra. Vamos então criar o projeto. Após criar as camadas, as classes de cada camada e configurar as referências das mesmas, sua Solution Explorer deve se parecer com aquela apresentada na Figura 1: 

Figura 1: Solution Explorer da Solution UsuarioProcedure

Com nosso projeto criado e configurado, vamos então a implementação das classes. Vamos começar a trabalhar da camada mais baixa para a camada mais alta, ou seja, implementaremos em primeira instância a classe clsDados.cs. A Listagem 1 apresenta o código desta classe.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
 
namespace Core.DAL
{
    public class clsDados
    {
        #region ------------------ ATRIBUTOS DA CLASSE DADOS -------------------
 
        private static string stringConexao = @"Data Source=FABRÍCIO-PC;Initial Catalog=db_Teste;User ID=sa;Password=shell";
        private static SqlConnection conexaoDecup = new SqlConnection(stringConexao);
        #endregion
 
        #region ------------------ MÉTODOS ------------------
 
        ///
        /// Este método encerra a conexão com o Banco de Dados.
        ///
        public SqlConnection fechaConexao()
        {
            if (conexaoDecup.State == ConnectionState.Open)
            {
                conexaoDecup.Close();
            }
            return conexaoDecup;
        }
 
        ///
        /// Este método verifica o status da conexão com o Banco de Dados. Caso esta esteja fechada, o método abre a conexão.
        ///
        public SqlConnection abreConexao()
        {
            if (conexaoDecup.State == ConnectionState.Closed)
            {
                conexaoDecup.Open();
            }
            return conexaoDecup;
        }
 
        #endregion
    }
}


Listagem 1: Fonte da classe clsDados

Novamente não entrar nos detalhes da implementação da classe por não ser o objetivo aqui, entretanto, algumas características da mesma precisam de um pouco mais de nossa atenção. Primeiramente, as linhas abaixo:

private static string stringConexao = @"Data Source=FABRÍCIO-PC;Initial Catalog=db_Teste;User ID=sa;Password=shell";
private static SqlConnection conexaoDecup = new SqlConnection(stringConexao);


Nas linhas acima criamos uma variável e um objeto respectivamente: stringConexao e conexaoDecup. Como podemos notar, stringConexao recebe a string de conexão com a base SQL Server. Em seguida, o objeto conexaoDecup estabelece a conexão com a base através do construtor da classe SqlConnection.
Outro aspecto importante a ressaltar neste código é a criação de dois métodos – fechaConexao() e abreConexao(). Estes métodos serão os responsáveis por abrir a conexão com a base de dados e fechá-la em um momento posterior respectivamente.
Como já foi dito, o foco deste artigo é apresentar a utilização das procedures em conjunto com a linguagem C#.

Para apresentar esta funcionalidade, iremos realizar uma inserção de registro no banco utililzando uma procedure. A estrutura da tabela onde o registro será inserido pode ser visualizada na Figura 2:

Figura 2: Estrutura da tabela sobre a qual a procedure trabalhará

Bom, agora que conhecemos a estrutura da tabela tbUsuarios já possuímos as informações necessárias para criarmos nossa procedure. Para isso, na base de dados expanda a guia Programmability. Em seguida, clique com o botão direito sobre a pasta Stored Procedure e selecione a opção New Stored Procedure, conforme apresenta a Figura 3:

Figura 3: Criando uma nova Stored Procedure


Ao selecionar esta uma opção, uma nova query será criada com algumas sugestões do SQL Server para criar a procedure. Limpe as sugestões do SQL Server de modo que sua tela fique semelhante a Figura 4.
Figura 4: Tela de criação da procedure limpa
Vamos então criar a procedure. A Listagem 3 apresenta o código da SP (Stored Procedure) de inserção do usuário:

CREATE PROCEDURE ____Inserir_Usuario
 
 -- Parâmetros de entrada da procedure
 @NomeUsuario VARCHAR(100),
 @EmailUsuario VARCHAR(100),
 @UsuarioUsuario VARCHAR(20),
 @SenhaUsuario VARCHAR(10)
 
AS
BEGIN
 
 -- Inserindo o registro no banco
 INSERT INTO dbo.tbUsuarios(Nome, Email, Usuario, Senha)
 VALUES(@NomeUsuario, @EmailUsuario, @UsuarioUsuario, @SenhaUsuario)
 
END
GO
Listagem 3: Código fonte da SP de Inserção

O código da SP dispensa muitos comentários pois é relativamente simples. O que este trecho que código faz é simplesmente alocar quatro variáveis (parâmetros): @NomeUsuario, @EmailUsuario, @UsuarioUsuario e @SenhaUsuario. Estes parâmetros receberão os valores provenientes do método C# e os passarão o segundo bloco do código para inserção na SP. Como já mencionado no início deste artigo, as procedures ficam pré-compiladas no servidor de banco de dados, portanto, precisamos agora compilar a SP. Para isso, basta ir até o menu superior do SQL Server Management Studio e clicar na opção “Execute” ou simplesmente selecionar o código da SP e pressionar F5. Se tudo ocorreu bem, você deverá visualizar uma tela semelhante a apresentada na Figura 5:

Figura 5: Sucesso no processo de compilação da SP


Muito bem, criada a tabela de usuários onde iremos inserir o registro, criada e compilada a procedure que fará a inserção e criada e implementada a classe de acesso a dados na camada DAL, vamos agora até a camada de negócios (BLL) e implementar o método responsável por chamar a SP e passar os parâmetros para a mesma. A Listagem 4 apresenta o código da classe clsUsuario.cs.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using Core.DAL;
using System.Net;
 
namespace Core.BLL
{
    public class clsUsuario
    {
 
        ///
        /// Método que recebe os valores do formulário e os insere através da procedure na tabela tbUsuarios.
        ///
        ///
        ///
        ///
        ///
        ///
        public int inserirUsuario(string _nome, long _mail, string _user, string _senha)
        {
            clsDados objetoDados = new clsDados();
 
            SqlCommand cmdAjuda = new SqlCommand("____Inserir_Usuario", objetoDados.abreConexao());
            cmdAjuda.CommandType = CommandType.StoredProcedure;
 
            cmdAjuda.Parameters.AddWithValue("@NomeUsuario", _mail);
            cmdAjuda.Parameters.AddWithValue("@EmailUsuario", _nome);
            cmdAjuda.Parameters.AddWithValue("@UsuarioUsuario", _user);
            cmdAjuda.Parameters.AddWithValue("@SenhaUsuario", _senha);
 
            try
            {
                int nLinhas;
                nLinhas = cmdAjuda.ExecuteNonQuery();
                return nLinhas;
            }
            catch (SqlException ex)
            {
                throw new Exception("Erro encontrado: " + ex.Message);
            }
            finally
            {
                objetoDados.fechaConexao();
            }
        }
 
    }
}

Listagem 4: Código fonte da classe clsUsuario

Os aspectos importantes na Listagem 4 são os seguintes:

SqlCommand cmdAjuda = new SqlCommand("____Inserir_Usuario", objetoDados.abreConexao());
cmdAjuda.CommandType = CommandType.StoredProcedure;



Nas linhas acima um objeto do tipo SqlCommand é criado e, é passado ao construtor deste objeto o nome da SP (____Inserir_Usuario) e o método que abre a conexão com o banco (objetoDados.abreConexao()); Na linha inferior, apenas dizemos ao objeto que ele deverá executar um procedimento do tipo StoredProcedure.


cmdAjuda.Parameters.AddWithValue("@NomeUsuario", _mail);
cmdAjuda.Parameters.AddWithValue("@EmailUsuario", _nome);
cmdAjuda.Parameters.AddWithValue("@UsuarioUsuario", _user);
cmdAjuda.Parameters.AddWithValue("@SenhaUsuario", _senha);



Nas linhas acima associamos cada valor que está vindo como parâmetro para o método inserirUsuario com o parâmetro que a SP está esperando. Vale a pena frisar que os valores passados para os parâmetros da SP devem ser do mesmo tipo, caso contrário a procedure não conseguirá inserir os dados.
Finalmente, no bloco do try temos a execução através do método executeNonQuery() do objeto cmdAjuda e, por extensão, da procedure. A informação importante aqui é que o método executeNonQuery() retornará o número de linhas afetadas pela procedure, assim, atribuímos o retorno da execução da procedure à variável inteira nLinhas para que possamos verificar posteriormente o sucesso ou falha da execução da procedure.
Ok, para finalizar temos que testar nosso aplicativo de cadastro certo? Muito bem, vamos então até a camada de visualização/apresentação e criarmos nossa interface. O modelo sugerido por mim é aquele apresentado na Figura 6: 

Figura 7: Campos preenchidos com as informações solicitadas



Att,
Leonardo Rocha.

Chamando uma procedure C# - .net

Chamando uma procedure para inserção de dados no Banco de Dados.




using System.Data;
using System.Data.SqlClient;

//Evento do botão inserir
protected void btnInserir_Click(object sender, EventArgs e)
{
string connectionString = "Data Source=ServidorDoBanco;Initial Catalog=NomeDoBanco;User Id=Usuario;Password=Senha;";
SqlConnection conn = new SqlConnection(connectionString);

try
{
/*Inserindo dados em uma tabela usando StoredProcedure*/
SqlCommand cmd = new SqlCommand("NomeDaStoredProcedure", conn);
cmd
.CommandType = CommandType.StoredProcedure;
conn
.Open();

//Aqui você passa os valor dos controles da página como parâmetro da StoredProcedure
cmd
.Parameters.Add("@parametro1DaStoredProcedure", SqlDbType.VarChar).Value = TextBox1.Text;
cmd
.Parameters.Add("@parametro2DaStoredProcedure", SqlDbType.VarChar).Value = TextBox2.Text;
//Comando para executar a StoredProcedure
cmd
.ExecuteNonQuery();
lblRetorno
.Text = "Dados inseridos com sucesso!";
}
catch
{
lblRetorno
.Text = "Failed to connection to DataSource!";
}
finally
{
//Independente do que aconteça,mesmo se houver exceções na hora do cadastro
//é importante fechar a conexão
conn
.Close();
}
}

Att,
Leonardo Rocha.

Função case - Sql server

Função case - Sql server 

 
select Nome,Status =case when cd_status = 'SOL' then 'Solicitado'
when cd_status = 'ABE' then 'Aberto'
when cd_status = 'DUP' then 'Duplicado'
else 'NA'
end from tbCliente




Att,
Leonardo Rocha.

Procedure - Valida inserção, update e delete.

Procedure - Valida inserção, update e delete. 

CREATE PROCEDURE sp_malotes

@codmalote    int,
@numerolacre  varchar(15),          
@origem       varchar(50),
@destino      varchar(50),
@operacao     nchar(1),
@novocodigo   int output,
@retorno    nvarchar(50) output

AS

if lower(@operacao) = 'i' -- inserir um registro

begin
if exists(select numerolacre from tb_malote where numerolacre = @numerolacre) 
begin
select @retorno = 'Numero lacre JÁ EXISTENTE.'

return (@retorno)
end

  else

begin

   select @retorno = ''
begin transaction
insert into tb_malote (numerolacre,  origem, destino )
      values(@numerolacre, @origem, @destino )

set @novocodigo = @@identity --variavel global do SQL SERVER que retorna o ultimo valor de um campo(identity)
end
end

else

if lower(@operacao) = 'u' -- alterar um registro

begin
select @retorno = ''  

begin transaction

update tb_malote set numerolacre = @numerolacre,
origem =  @origem,destino = @destino       
where codmalote = @codmalote

end

else

if lower(@operacao) = 'd'  -- excluir um registro
 begin 
select @retorno = ''

    begin transaction

    delete from tb_malote where codmalote = @codmalote

  end

if @@error <> 0

begin

   rollback transaction

   return(1)

end

else

begin

   commit transaction

   return(0)

end


Att,
Leonardo Rocha.