none
UPDATE com MYSQL e ASP RRS feed

  • Discussão Geral

  • Olá, boa tarde!

    Tenho um código que se comunica normalmente com a base MYSQL e carrega os valores em string's e em um determinando momento do código, e deve atualizar a base de dados com + 1 para um contador de visitas. Acontece que na hora em que ele vai efetivamente atualizar, dá o seguinte erro abaixo:

    Microsoft OLE DB Provider for ODBC Drivers error '80040e09'

    [TCX][MyODBC]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2 = 1 where ano = 2017' at line 1

    E e está carregando os valores certinhos, veja: onde está ..."near '2 é que ele está carregando o mês 2 e o = significa que ele vai somar + 1 ao mês do ano de 2017.

    abaixo segue o código:

    totalMes = RsTotalMes(vMes) + 1
    		cnnDB.execute = "update db_mes set "& vMes &" = "& totalMes &" where ano = "& RsTotalMes("ano") &""
    		set RsMes = cnnDB.execute(altera_mes)

    alguém pode me ajudar em como fazer essa atualização?

    abs

    Carlos Henrique

    quarta-feira, 15 de fevereiro de 2017 19:43

Todas as Respostas

  • Parece que a variável vMes está armazenando o número 2 ao invés do nome da coluna no banco de dados. Faça o teste abaixo para comprovar.

    totalMes = RsTotalMes(vMes) + 1
    Response.Write "update db_mes set "& vMes &" = "& totalMes &" where ano = "& RsTotalMes("ano") &""
    		cnnDB.execute = "update db_mes set "& vMes &" = "& totalMes &" where ano = "& RsTotalMes("ano") &""
    		set RsMes = cnnDB.execute(altera_mes)



    João Paulo Gomes

    quarta-feira, 15 de fevereiro de 2017 20:50
  • Olá João,

    Obrigado por responder!

    Então, vamos lá!

    A variável vMes pega o número do mês atual e compara com o banco que são números também, assim: janeiro = 1, fevereiro = 2,...

    a variável total mês recebe o valor total da coluna 2 que no caso é fevereiro e está vazia, ou seja, 0 e então recebe um incremento de + 1. Feito isso, ele continua e busca o ano e a variável RsTotalMes("ano") vai carregar exatamente o ano atual vigente automaticamente e atualizar o dado.

    Eu coloquei a instrução que você me deu acima e retornou o seguinte erro:

    update db_mes set 2 = 1 where ano = 2017

    Microsoft OLE DB Provider for ODBC Drivers error '80040e09'

    [TCX][MyODBC]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2 = 1 where ano = 2017' at line 1

    /combo1/contador/conta1.asp, line 43

    Abaixo, vou colocar toda a página para que entenda melhor e construção do raciocínio do conteúdo.

    <!--#include file="conexao.asp" -->
    
    <%
    Session.LCID = 1046
    
    dim RsRevisitas, RsVisitas, RsMes, RsDia, RsTotalMes, RsTotalDia, RsIn, vSQL
    dim vData, aData, vDia, vMes, vAno, totalMes, totalDia, totalAno, x
    
    vData = FormatDateTime(Date(), 2)
    aData = Split(vData, "/")
    vDia	 = Trim(aData(0))
    vMes	 = Trim(aData(1))
    vAno	 = Trim(aData(2))
    %>
    <%
    '1.2 - aqui estes selects pegarão a quantidade de visitantes por mês e dia respectivamente.
       
    vSQL = "select * from db_mes order by ano desc"
    	set RsTotalMes = cnnDB.execute(vSQL)
    	totalAno = RsTotalMes(1) + RsTotalMes(2) + RsTotalMes(3) + RsTotalMes(4) + RsTotalMes(5) + RsTotalMes(6) +_
    				   RsTotalMes(7) + RsTotalMes(8) + RsTotalMes(9) + RsTotalMes(10) + RsTotalMes(11) + RsTotalMes(12) 
    	vSQL = "select * from db_dia where "& vDia &" = "& vDia &" and mes = "& vMes & " and ano = '" & vAno &"' "
    	set RsTotalDia = cnnDB.execute(vSQL)
    
    '1.3 se o ano atual for maior que o ano que está sendo selecionado, inserimos mais um conjunto de 12 meses no banco. até aqui funciona tudo certinho.
       
    if vAno > RsTotalMes("ano") then
    		for x = 1 to 12
    		
    		vSQL = "Insert into db_dia (mes,ano) values ("& x &", "& vAno &")"
    		set RsIn = cnnDB.execute(vSQL)
    		set RsIn = nothing
    		next
    		
    		vSQL = "insert into db_mes (ano) values("& vAno &")"
    		set RsIn = cnnDB.execute(vSQL)
    
    end if
    
    
    
    'ate aqui vai bem, daqui pra baixo não atualiza o banco. dá o erro descrito na mensagem.
    'aqui ele pegaria os valores das tabelas de acordo com o mês vigente e o dia e o ano, veria qual o registro atual, faria o incremento de
    'mais um e atualizaria. Só que não rola.
        
    		
    		totalMes = RsTotalMes(vMes) + 1
    		Response.Write "update db_mes set "& vMes &" = "& totalMes &" where ano = "& RsTotalMes("ano") &""
    		cnnDB.execute = "update db_mes set "& vMes &" = "& totalMes &" where ano = "& RsTotalMes("ano") &""
    		set RsMes = cnnDB.execute(altera_mes)
    		
    		'totalMes = RsTotalMes(vMes) + 1
    		'cnnDB.execute = "update db_mes set "& vMes &" = "& totalMes &" where ano = "& RsTotalMes("ano") &""
    		'set RsMes = cnnDB.execute(altera_mes)
    		
    		'totalDia = RsTotalDia(vDia) + 1
    		'altera_dia = "update db_dia set "& vDia &" = "& totalDia &" where mes = "& vMes &" and ano = '"& vAno &"' "
    		'set RsDia = cnnDB.execute(altera_dia)
    
    		
    %>	

    quinta-feira, 16 de fevereiro de 2017 11:07
  • Pela sua descrição, provavelmente o correto seria:

    update db_mes set total_mes = 2 where ano = 2017 and mes = 1

    Mas ao invés disso você está tentando atribuir o valor 2 para o valor 1. 

    update db_mes set 2 = 1 where ano = 2017
    

    No lugar de 2= 1, deveria ser o nome da coluna igual ao valor, exemplo: total_mes = 1


    João Paulo Gomes

    quinta-feira, 16 de fevereiro de 2017 11:34
  • Então João, no caso não!

    Veja: a variável "totalmes" vai carregar o valor atual da coluna "2" que é igual a fevereiro do ano de 2017 e vai incrementar +1. Então digamos que neste mês já tivéssemos 535 visitas, agora ele somaria mais 1 e passaria a ter o valor de 536. Vou anexar um print do banco para que entenda melhor.

    abs

    quinta-feira, 16 de fevereiro de 2017 11:48
  • Entendi cara, você usou números nos nomes das tabelas. Essa não é uma boa prática, você tem duas opções:

    1. Renomear as colunas para m1, m2, etc

    2. Alterar a query para ficar assim:

    update db_mes set "2" = 1 where ano = 2017

    Se não funcionar dessa forma, tente assim:

    update db_mes set `2` = 1 where ano = 2017


    João Paulo Gomes


    • Editado John Owl quinta-feira, 16 de fevereiro de 2017 12:25
    quinta-feira, 16 de fevereiro de 2017 12:25
  • Olá João, boa tarde!

    Irmão, seguindo sua sugestão, alterei os nomes das tabelas no banco para m1, m2, m3.... e alterei também as dos dias no banco para d1, d2, d3,...

    Peguei os valores da data, concatenei e foi.

    Graças a Deus e a você pela boa vontade em me ajudar. Vou colocar abaixo o código como ficou para futuras pesquisas. Mais uma vez, obrigado!

    <!--#include file="conexao.asp" -->
    
    <%
    Session.LCID = 1046
    
    dim RsRevisitas, RsVisitas, RsMes, RsDia, RsTotalMes, RsTotalDia, RsIn, vSQL
    dim vData, aData, vDia, vMes, vAno, totalMes, totalDia, totalAno, x
    
    vData = FormatDateTime(Date(), 2)
    aData = Split(vData, "/")
    vDia	 = Trim(aData(0))
    vMes	 = Trim(aData(1))
    vAno	 = Trim(aData(2))
    %>
    <%
    vSQL = "select * from db_mes order by ano desc"
    	set RsTotalMes = cnnDB.execute(vSQL)
    totalano = 0
    
    	totalAno = totalAno + RsTotalMes("m1") + RsTotalMes("m2") + RsTotalMes("m3") + RsTotalMes("m4") + RsTotalMes("m5") + RsTotalMes("m6") +_
    				   RsTotalMes("m7") + RsTotalMes("m8") + RsTotalMes("m9") + RsTotalMes("m10") + RsTotalMes("m11") + RsTotalMes("m12") 
    
    
    	vSQL = "select * from db_dia where "& vDia &" = "& vDia &" and mes = "& vMes & " and ano = '" & vAno &"' "
    	set RsTotalDia = cnnDB.execute(vSQL)
    
    if vAno > RsTotalMes("ano") then
    		for x = 1 to 12
    		
    		vSQL = "Insert into db_dia (mes,ano) values ("& x &", "& vAno &")"
    		set RsIn = cnnDB.execute(vSQL)
    		set RsIn = nothing
    		next
    		
    		vSQL = "insert into db_mes (ano) values("& vAno &")"
    		set RsIn = cnnDB.execute(vSQL)
    
    end if
    'aqui entra uma consulta de cookies para contabilizar apenas um acesso por IP
    if Request.Cookies("IP")("UsuarioIP") = request.servervariables("REMOTE_ADDR") then
    else
    
    'aqui atualiza a tabela mensal
    a=vmes
    b="m"
    mes=b&a		
    		totalMes = RsTotalMes(mes) + 1
    		cnnDB.execute = "update db_mes set "&mes&" = "& totalMes &" where ano = "& RsTotalMes("ano") &""
    
    'aqui atualiza a diaria
    c=vdia
    d="d"
    dia=d&c			
    		totalDia = RsTotalDia(dia) + 1
            cnnDB.execute = "update db_dia set "&dia&" = "& totalDia &" where mes = "& vMes &" and ano = '"& vAno &"' "
        
    Response.Cookies("IP")("UsuarioIP") = request.servervariables("REMOTE_ADDR")
    end if	    
    		
    %>	

    quinta-feira, 16 de fevereiro de 2017 15:33
  • Boa escolha! É um prazer ajudar.

    Se puder, lembre-se de marcar a resposta como útil.



    João Paulo Gomes

    quinta-feira, 16 de fevereiro de 2017 16:38