ASP.NET 2005 - Criando uma site completo com carrinho de compras VI


Para acompanhar a introdução sobre a construção do site completo com carrinho de compras veja os artigos já publicados:  

No artigo anterior criamos o carrinho de compras em memória usando um DataSet armazenado  na sessão. Após efetuar algumas compras e exibir o seu carrinho o cliente teria apresentado a seguinte tela:

Pois bem, a partir daqui iremos salvar os dados do DataSet na base de dados afim de ter os dados da compra do usuário persistidos. Quando o usuário clicar no botão Encerrar Compras iremos chamar a rotina atualizaPedidos()

Protected Sub btnEncerrarCompras_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEncerrarCompras.Click
    atualizaPedidos()
End Sub

Esta rotina deverá efetuar as seguintes operações:

Mas perceba que até o presente momento o usuário não esta identificado no site de forma que antes de efetuar qualquer operação o mesmo deverá ser identificado por meio de autenticação. Para tanto vamos criar mais dois formulários relacionados com a identificação e autenticação do cliente:

No menu WebSite opção Add New Item selecione o template Web Form e informe o nome Login.aspx, selecione o code-behind e a master page, e crie o seguinte leiaute:

Vejamos a seguir o código deste formulário:

Imports System.Web.Security 'requerido para a classe autenticacao

Imports System.Data

Imports System.Data.OleDb

Imports System.Configuration
 

Partial Class Login

    Inherits System.Web.UI.Page
 

Dim contador As Integer


Protected
Sub cmdLogin_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles
cmdLogin.Click


Dim
strcon As String =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\home\macoratti\dados\JcmSoft.mdb"

Dim conn As OleDbConnection = New OleDbConnection(strcon)

Dim clienteID As Integer = 0

Dim nomeCliente As String = ""

Dim endereco As String = ""

Dim cidade As String = ""

Dim estado As String = ""

Dim cep As String = ""

Dim email As String = ""

Dim dr As OleDbDataReader = Nothing


Dim
cmd As OleDbCommand = New OleDbCommand("sp_ValidaUsuario"
, conn)

cmd.CommandType = CommandType.StoredProcedure


Dim
Login As OleDbParameter = New OleDbParameter("@Login"
, OleDbType.VarChar, 15)

Login.Value = Me.txtUsuario.Text.Trim

cmd.Parameters.Add(Login)


Dim
Senha As OleDbParameter = New OleDbParameter("@Senha"
, OleDbType.VarChar, 100)

Senha.Value = Protege.GeraHash(Me.txtSenha.Text.Trim)

cmd.Parameters.Add(Senha)


Try

   conn.Open()

   dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)


   
If dr.HasRows Then

         While dr.Read()

           clienteID = dr.Item("clienteID")

           nomeCliente = dr.Item("nome")

           endereco = dr.Item("endereco")

           cidade = dr.Item("cidade")

           estado = dr.Item("estado")

           cep = dr.Item("cep")

           email = dr.Item("email")

         End While

       Session("clienteID") = clienteID

       Session("nomeCliente") = nomeCliente

       Session("endereco") = endereco

       Session("cidade") = cidade

       Session("estado") = estado

       Session("cep") = cep

       Session("email") = email

       Response.Redirect("Cesta.aspx")

   Else

        Response.Redirect("novoUsuario.aspx")

  End If

Catch ex As Exception

   lblMensagem.Text = "Erro ao acessar os dados : " & ex.Message

End Try

End Sub

End Class

 

Neste código eu estou usando o procedimento armazenado - sp_ValidaUsuario : definido a seguir, onde são usados dois parâmetros: login e senha;

SELECT clienteID, nome, login, endereco, cidade, cep, estado, email
FROM clientes
WHERE login=[@Login] And senha=[@Senha];

Neste código também usamos a função GeraHash() que irá gerar um hash da senha de forma a proteger a senha do cliente antes de ser salva no banco de dados. Veremos esta função em detalhes a seguir.

Se o usuário estiver cadastrado e for identificado seus dados serão armazenados na sessão e ele será redirecionado para a página Cesta.aspx caso contrário será considerado um novo usuário e será redirecionado para a página NovoUsuario.aspx.

Vamos agora criar a página NovoUsuario.aspx da mesma forma que o procedimento anterior selecionando o code-behind e a master page com o seguinte leiaute:

O código desta página é descrito abaixo:

Imports System.Data

Imports System.Data.oledb


Partial
Class NovoUsuario

    Inherits System.Web.UI.Page
 

Protected Sub btnSalvar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSalvar.Click


'define a string de conexao e a conexão

Dim strcon As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\home\macoratti\dados\JcmSoft.mdb"

Dim conn As OleDbConnection = New OleDbConnection(strcon)

Dim codigoCliente As Integer = 0


'define a stored procedure que sera executada

Dim cmd As OleDbCommand = New OleDbCommand("sp_IncluiUsuario", conn)

cmd.CommandType = CommandType.StoredProcedure


'define os parametros do procedimento armazenado

Dim parmNomeCliente As New OleDbParameter

Dim parmEndereco As New OleDbParameter

Dim parmCidade As New OleDbParameter

Dim parmEstado As New OleDbParameter

Dim parmCep As New OleDbParameter

Dim parmTelefone As New OleDbParameter

Dim parmEmail As New OleDbParameter

Dim parmLogin As New OleDbParameter

Dim parmSenha As New OleDbParameter

Dim parmDataAdesao As New OleDbParameter


'define o tipo e atribui o valor para cada parâmetro

With parmNomeCliente

.ParameterName = "nome"

.OleDbType = OleDbType.VarChar

.Value = txtNome.Text.Trim

End With

cmd.Parameters.Add(parmNomeCliente)


With
parmLogin

.ParameterName = "login"

.OleDbType = OleDbType.VarChar

.Value = txtLogin.Text.Trim

End With

cmd.Parameters.Add(parmLogin)


With
parmDataAdesao

.ParameterName = "dataAdesao"

.OleDbType = OleDbType.Date

.Value = DateTime.Now

End With

cmd.Parameters.Add(parmDataAdesao)


With
parmEndereco

.ParameterName = "endereco"

.OleDbType = OleDbType.VarChar

.Value = txtEndereco.Text.Trim

End With

cmd.Parameters.Add(parmEndereco)


With
parmCidade

.ParameterName = "cidade"

.OleDbType = OleDbType.VarChar

.Value = txtCidade.text

End With

cmd.Parameters.Add(parmCidade)


With
parmEstado

.ParameterName = "estado"

.OleDbType = OleDbType.VarChar

.Value = ddlEstado.SelectedValue.ToString

End With

cmd.Parameters.Add(parmEstado)

With parmCep

.ParameterName = "cep"

.OleDbType = OleDbType.VarChar

.Value = txtCep.Text.Trim

End With

cmd.Parameters.Add(parmCep)

With parmTelefone

.ParameterName = "telefone"

.OleDbType = OleDbType.VarChar

.Value = txtTelefone.Text.Trim

End With

cmd.Parameters.Add(parmTelefone)

With parmEmail

.ParameterName = "email"

.OleDbType = OleDbType.VarChar

.Value = txtEmail.Text.Trim

End With

cmd.Parameters.Add(parmEmail)

With parmSenha

.ParameterName = "senha"

.OleDbType = OleDbType.VarChar

.Value = Protege.GeraHash(txtSenha.Text.Trim)

End With

cmd.Parameters.Add(parmSenha)

Try

   'abre a conexao e executa a stored procedure

    conn.Open()

    cmd.ExecuteNonQuery()

Catch ex As Exception

    lblMensagem.Text = "Erro ao acessar os dados : " & vbCrLf & ex.Message & vbCrLf & ex.InnerException.ToString

    conn.Close()

     Exit Sub

End Try

 

Try

   'Determine a query que seleciona o identificador do registro inserido

   cmd = New OleDbCommand("SELECT @@IDENTITY", conn)

   cmd.CommandType = CommandType.Text

    'obtem o codigo do pedido que foi incluido na tabela Pedidos

    codigoCliente = cmd.ExecuteScalar()


    
'poe os dados na sessão

    Session("clienteID") = codigoCliente

    Session("nomeCliente") = txtNome.Text.Trim

    Session("endereco") = txtEndereco.Text.Trim

    Session("cidade") = txtCidade.Text

    Session("estado") = ddlEstado.SelectedItem

    Session("cep") = txtCep.Text.Trim

    Session("email") = txtEmail.Text

    Session("telefone") = txtTelefone.Text

    lblMensagem.Text = "Informações gravadas com sucesso."

Catch ex As Exception

   lblMensagem.Text = "Erro ao acessar os dados : " & vbCrLf & ex.Message & vbCrLf & ex.InnerException.ToString

Finally

   conn.Close()

End Try

End Sub
 

End Class

Este código usa o procedimento armazenado sp_IncluiUsuario para incluir um novo cliente na base de pedidos. O procedimento é definido a seguir:

INSERT INTO Clientes ( nome, login, dataAdesao, endereco, cidade, cep, estado, telefone, email, senha )
VALUES (nome, login, dataAdesao, endereco, cidade, cep, estado, telefone, email, senha);

Os parâmetros necessários para a execução do procedimento tem sua definição de tipo , nome e valor na rotina e são incluídos em seguida na coleção de parâmetros.

A função geraHash() e usada a partir da classe Protege. Vamos então criar a classe Protege no nosso projeto. No menu WebSite, opção Add New Item, na janela Templates selecione Class e informe o nome Protege.vb. O arquivo será colocado na pasta App_Code. Em seguida inclua o seguinte código na classe:

Imports System.Security.Cryptography

Imports System.text
 

Public Class Protege


Public
Shared Function GeraHash(ByVal texto As String) As
String


'Cria um objeto enconding para assegurar o padrão

'de encondig para o texto origem

Dim Ue As New UnicodeEncoding()

'Retorna um byte array baseado no texto origem

Dim ByteSourceText() As Byte = Ue.GetBytes(texto)

'Instancia um objeto MD5

Dim Md5 As New MD5CryptoServiceProvider()

'Calcula o valor do hash para o texto origem

Dim ByteHash() As Byte = Md5.ComputeHash(ByteSourceText)

'Converte o valor obtido para o formato string

Return Convert.ToBase64String(ByteHash)

End Function


End
Class

 

Como a função é estática (Shared) não precisamos criar uma instância da classe para usá-la. Por isso no código usamos diretamente:  Protege.GeraHash(txtSenha.Text.Trim)

Após cadastrar o usuário os dados são inseridos na sessão. Note que como precisamos obter o código do cliente e este campo é um campo auto-incremental estamos usando a instrução SELECT @@IDENTITY para recuperar o valor do código do cliente que acabamos de incluir para armazená-lo na sessão.

Com estes formulários concluídos já podemos retomar a rotina atualizaPedidos() que irá gravar os dados na tabela Pedidos e na tabela ItensPedido. Por Falar nisso veja a estrutura destas tabelas abaixo:

Tabela Pedidos:

pedidoID - chave primária AutoNumeração

Tabela itensPedido:

pedidoID e ItemID - chave Pimária

Então a rotina atualizaPedidos deverá primeiro gravar os dados do pedido na tabela Pedidos, note que estamos gravando o código do cliente - clienteID - por isso ele terá que ser primeiro identificado; e como um pedido pode ter muitos itens teremos que para cada item do pedido gravar os dados na tabela itensPedido. Vejamos então código desta bendita rotina:(lembre-se que ela esta na página Cesta.aspx)

Private Sub atualizaPedidos()


 If Session("cesta") Is Nothing Then

    Response.Redirect("Default.aspx")

 End If

'
obtem os valores do pedido

 If Session("ClienteID") Is Nothing Then

    Response.Redirect("login.aspx")

End If
 

'define um objeto connection e um objeto command

Dim con As OleDbConnection = New OleDbConnection(ConfigurationManager.ConnectionStrings("conexaoBD").ToString())

Dim cmd As OleDbCommand


'obtem o total da cesta e defina data do pedido e o id do cliente

Dim clienteID As Integer = Convert.ToInt32(Session("ClienteID"))

Dim total As Decimal = obterDataSetCesta.Tables(0).Rows(0)("Total")

Dim data As DateTime = DateTime.Now


'variavel que irá armazenar o numero do pedido apos sua

'inclusão na tabela pedidos

Dim codigoPedido As Integer


'define a stored procedure que sera executada

cmd = New OleDbCommand("sp_IncluiPedido", con)

cmd.CommandType = CommandType.StoredProcedure


'define os parametros do procedimento armazenado

Dim parmClienteID As New OleDbParameter

Dim parmData As New OleDbParameter

Dim parmValor As New OleDbParameter


'define o tipo e atribui o valor para cada parâmetro

With parmClienteID

.ParameterName = "clienteID"

.OleDbType = OleDbType.Integer

.Value = clienteID

End With

cmd.Parameters.Add(parmClienteID)

With parmData

.ParameterName = "data"

.OleDbType = OleDbType.Date

.Value = data

End With

cmd.Parameters.Add(parmData)

With parmValor

.ParameterName = "valor"

.OleDbType = OleDbType.Decimal

.Value = total

End With

cmd.Parameters.Add(parmValor)

'abre a conexao e executa a stored procedure

con.Open()

cmd.ExecuteNonQuery()

'Determine a query que seleciona o identificador do registro inserido

cmd = New OleDbCommand("SELECT @@IDENTITY", con)

cmd.CommandType = CommandType.Text

'obtem o codigo do pedido que foi incluido na tabela Pedidos

codigoPedido = cmd.ExecuteScalar()

'define um objeto datarow

Dim row As DataRow

'atualiza a tabela itensPedidos com os pedidos da cesta

For Each row In obterDataSetCesta.Tables(0).Rows

   'define a stored procedure que vai ser executada

    cmd = New OleDbCommand("sp_IncluiItensPedido", con)

    cmd.CommandType = CommandType.StoredProcedure

     'define os parametros do procedimento armazenado

     Dim parmPedidoID As New OleDbParameter

     Dim parmProdutoID As New OleDbParameter

     Dim parmValorItem As New OleDbParameter

    Dim parmQuantidade As New OleDbParameter

     'define o tipo e atribui o valor para cada parâmetro

With parmPedidoID

.ParameterName = "pedidoID"

.OleDbType = OleDbType.Integer

.Value = codigoPedido

End With

cmd.Parameters.Add(parmPedidoID)

With parmProdutoID

.ParameterName = "produtoID"

.OleDbType = OleDbType.Integer

.Value = row("itemID")

End With

cmd.Parameters.Add(parmProdutoID)

With parmValorItem

.ParameterName = "Valor"

.OleDbType = OleDbType.Decimal

.Value = row("preco")

End With

cmd.Parameters.Add(parmValorItem)

With parmQuantidade

.ParameterName = "Quantidade"

.OleDbType = OleDbType.Integer

.Value = row("quantidade")

End With

cmd.Parameters.Add(parmQuantidade)

'executa a stored procedure e inclui o itens do pedido

cmd.ExecuteNonQuery()

Next

'fecha a conexão obtem o total e poe na sessão

con.Close()


Session(
"Total") = obterDataSetCesta().Tables(0).Rows(0)("Total")

'guarda o codigo do pedido (PedidoID) na sessão


Session(
"codigoPedido") = codigoPedido

Response.Redirect("confirma.aspx")

End Sub

Neste código estamos usando dois procedimentos armazenados e um instrução SQL para recuperar o código do Pedido (pedidoID) que acabou de ser incluído na tabela Pedidos:

Ao final o cliente é direcionado para  página Confirma.aspx onde deverá confirmar o pedido. Este será o assunto do nosso próximo artigo.

Veja a continuação do artigo em : Site completo com carrinho de compras VII

A vídeo Aula deste artigo esta no Super DVD Vídeo Aulas

Até o próximo artigo .NET 


José Carlos Macoratti