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 autenticacaoImports System.DataImports System.Data.OleDbImports System.ConfigurationPartial Class Login Inherits System.Web.UI.PageDim 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.Trimcmd.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)
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") = clienteIDSession( "nomeCliente") = nomeClienteSession( "endereco") = enderecoSession( "cidade") = cidadeSession( "estado") = estadoSession( "cep") = cepSession( "email") = emailResponse.Redirect( "Cesta.aspx")Else Response.Redirect( "novoUsuario.aspx") End If Catch ex As ExceptionlblMensagem.Text = "Erro ao acessar os dados : " & ex.Message End Try End SubEnd 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.DataImports System.Data.oledb
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 Withcmd.Parameters.Add(parmNomeCliente) With parmLogin .ParameterName = "login".OleDbType = OleDbType.VarChar .Value = txtLogin.Text.Trim End Withcmd.Parameters.Add(parmLogin) With parmDataAdesao .ParameterName = "dataAdesao".OleDbType = OleDbType.Date .Value = DateTime.Now End Withcmd.Parameters.Add(parmDataAdesao) With parmEndereco .ParameterName = "endereco".OleDbType = OleDbType.VarChar .Value = txtEndereco.Text.Trim End Withcmd.Parameters.Add(parmEndereco) With parmCidade .ParameterName = "cidade".OleDbType = OleDbType.VarChar .Value = txtCidade.text End Withcmd.Parameters.Add(parmCidade) With parmEstado .ParameterName = "estado".OleDbType = OleDbType.VarChar .Value = ddlEstado.SelectedValue.ToString End Withcmd.Parameters.Add(parmEstado) With parmCep .ParameterName = "cep" .OleDbType = OleDbType.VarChar .Value = txtCep.Text.Trim End Withcmd.Parameters.Add(parmCep) With parmTelefone .ParameterName = "telefone" .OleDbType = OleDbType.VarChar .Value = txtTelefone.Text.Trim End Withcmd.Parameters.Add(parmTelefone) With parmEmail .ParameterName = "email" .OleDbType = OleDbType.VarChar .Value = txtEmail.Text.Trim End Withcmd.Parameters.Add(parmEmail) With parmSenha .ParameterName = "senha" .OleDbType = OleDbType.VarChar .Value = Protege.GeraHash(txtSenha.Text.Trim) End Withcmd.Parameters.Add(parmSenha) Try 'abre a conexao e executa a stored procedureconn.Open() cmd.ExecuteNonQuery() Catch ex As ExceptionlblMensagem.Text = "Erro ao acessar os dados : " & vbCrLf & ex.Message & vbCrLf & ex.InnerException.ToStringconn.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()
Session( "clienteID") = codigoClienteSession( "nomeCliente") = txtNome.Text.TrimSession( "endereco") = txtEndereco.Text.TrimSession( "cidade") = txtCidade.TextSession( "estado") = ddlEstado.SelectedItemSession( "cep") = txtCep.Text.TrimSession( "email") = txtEmail.TextSession( "telefone") = txtTelefone.TextlblMensagem.Text = "Informações gravadas com sucesso." Catch ex As ExceptionlblMensagem.Text = "Erro ao acessar os dados : " & vbCrLf & ex.Message & vbCrLf & ex.InnerException.ToString Finallyconn.Close() End Try End SubEnd 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.CryptographyImports System.textPublic Class Protege
'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
|
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()
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 Withcmd.Parameters.Add(parmClienteID) With parmData .ParameterName = "data" .OleDbType = OleDbType.Date .Value = data End Withcmd.Parameters.Add(parmData) With parmValor .ParameterName = "valor" .OleDbType = OleDbType.Decimal .Value = total End Withcmd.Parameters.Add(parmValor) 'abre a conexao e executa a stored procedure con.Open() cmd.ExecuteNonQuery() 'Determine a query que seleciona o identificador do registro inseridocmd = New OleDbCommand("SELECT @@IDENTITY", con)cmd.CommandType = CommandType.Text 'obtem o codigo do pedido que foi incluido na tabela PedidoscodigoPedido = cmd.ExecuteScalar() 'define um objeto datarowDim 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 executadacmd = 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 Withcmd.Parameters.Add(parmPedidoID) With parmProdutoID .ParameterName = "produtoID" .OleDbType = OleDbType.Integer .Value = row( "itemID") End Withcmd.Parameters.Add(parmProdutoID) With parmValorItem .ParameterName = "Valor" .OleDbType = OleDbType.Decimal .Value = row( "preco") End Withcmd.Parameters.Add(parmValorItem) With parmQuantidade .ParameterName = "Quantidade" .OleDbType = OleDbType.Integer .Value = row( "quantidade") End Withcmd.Parameters.Add(parmQuantidade) 'executa a stored procedure e inclui o itens do pedidocmd.ExecuteNonQuery() Next 'fecha a conexão obtem o total e poe na sessãocon.Close()
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