ERRO DE SINTAXE

FRATA 19/08/2016 18:12:47
#465991
Sempre que edito um cadastro e depois tento salvar, me retorna o seguinte erro:
[Ô]Rum Tome Erro[Ô]
[Ô]Erro de sintaxe (Operador faltando) na expressão de consulta obs = [Ô],

Estou enviando abaixo o pedaço do código que está dando esse problema.
Será que algum colega sabe como resolver?
Antecipadamente agradeço pela atenção.

With cmd
.ActiveConnection = cnnreceitas
.CommandType = adCmdText
.CommandText = [Ô] update receitas set [Ô] & _
[Ô]nome = [ô][Ô] & Text_nome.Text & [Ô][ô],[Ô] & _
[Ô]endereco = [ô][Ô] & Text_endereco.Text & [Ô][ô],[Ô] & _
[Ô]numero = [ô][Ô] & Text_numero.Text & [Ô][ô],[Ô] & _
[Ô]complemento = [ô][Ô] & Text_complemento.Text & [Ô][ô],[Ô] & _
[Ô]bairro = [ô][Ô] & Text_bairro.Text & [Ô][ô],[Ô] & _
[Ô]cidade = [ô][Ô] & Text_cidade.Text & [Ô][ô],[Ô] & _
[Ô]cep = [ô][Ô] & Text_cep.Text & [Ô][ô],[Ô] & _
[Ô]estado = [ô][Ô] & Text_estado.Text & [Ô][ô][Ô] & _
[Ô]obs = [ô][Ô] & Text_obs.Text & [Ô][ô][Ô] & _
[Ô]where cod = [Ô] & Text_cod.Text & [Ô];[Ô]
.Execute

vok = MsgBox([Ô]Alterações salvas com sucesso![Ô], vbOKOnly, [Ô]Alterar receita[Ô])
OMAR2011 19/08/2016 19:28:50
#465994
Observe estes dois.
[Ô]estado = [ô][Ô] & Text_estado.Text & [Ô][ô][Ô] & _
[Ô]obs = [ô][Ô] & Text_obs.Text & [Ô][ô][Ô] & _
Diferente dos demais.
KERPLUNK 19/08/2016 23:56:31
#466012
Resposta escolhida
Veja bem, você já está usando comandos para execução de queries, porque não usar também os parâmetros e acabar DE VEZ com esse problema de concatenação? Sei que você vai simplesmente copiar o que eu vou colocar aqui, mas eu peço que tente entender o que está sendo feito. Cada parâmetro, corresponde à um campo que receberá dados vindos de caixas de texto. Você está concatenando tudo em um comando SQL, tudo bem, isso é normal para iniciantes, mas deve ser melhorado assim que possível. Os últimos dois campos, você está concatenando e não está deixando um espaço depois da vírgula e nem. Isso fará com que o comando fique assim:

update tabela set campo1 = [ô]valor[ô]campo2=[ô]valor2[ô]where cod=4

Veja que esse comando não está com a sintaxe correta e essa é a razão do seu erro. Com isso você deve estar pensando: [Ô]Porque simplesmente não disse isso?[Ô]. E a resposta é que quero que você realmente entenda o que está fazendo, para que não incorra nos mesmos erros futuramente. No caso de iniciantes, como acredito ser o seu, eu sugiro colocar todo esse conteúdo concatenado em uma variável, isso facilita a depuração, pois você pode ver mais claramente o que está errado, ficando assim:

Dim comandoSQL As String
comandoSQL = [Ô] update receitas set [Ô] & _
[Ô]nome = [ô][Ô] & Text_nome.Text & [Ô][ô],[Ô] & _
[Ô]endereco = [ô][Ô] & Text_endereco.Text & [Ô][ô],[Ô] & _
[Ô]numero = [ô][Ô] & Text_numero.Text & [Ô][ô],[Ô] & _
[Ô]complemento = [ô][Ô] & Text_complemento.Text & [Ô][ô],[Ô] & _
[Ô]bairro = [ô][Ô] & Text_bairro.Text & [Ô][ô],[Ô] & _
[Ô]cidade = [ô][Ô] & Text_cidade.Text & [Ô][ô],[Ô] & _
[Ô]cep = [ô][Ô] & Text_cep.Text & [Ô][ô],[Ô] & _
[Ô]estado = [ô][Ô] & Text_estado.Text & [Ô][ô], [Ô] & _
[Ô]obs = [ô][Ô] & Text_obs.Text & [Ô][ô] [Ô] & _
[Ô]where cod = [Ô] & Text_cod.Text & [Ô];[Ô]
With cmd
.ActiveConnection = cnnreceitas
.CommandType = adCmdText
.CommandText = comandoSQL
.Execute
End With

Observe que a query em si está separada e você pode ver o conteúdo dela antes de ser executada, facilitando em muito a detecção e correção de eventuais erros.

Agora, o melhor mesmo seria o uso de parâmetros. Eles tornam o código muito mais [Ô]limpo[Ô] e previnem em definitivo esse tipo de erro, além de acabar com uma falha de segurança colossal, chamada SQL Injection. O uso de parâmetros, aplicado ao seu caso, pode variar um pouco devido à peculiaridades de cada banco de dados mas a idéia é a mesma:

Dim comandoSQL As String
comandoSQL = [Ô] update receitas set [Ô] & _
[Ô]nome = ?,[Ô] & _
[Ô]endereco = ?,[Ô] & _
[Ô]numero = ?,[Ô] & _
[Ô]complemento = ?, [Ô] & _
[Ô]bairro = ?,[Ô] & _
[Ô]cidade = ?,[Ô] & _
[Ô]cep = ?,[Ô] & _
[Ô]estado = ?,[Ô] & _
[Ô]obs = ? [Ô] & _
[Ô]where cod = ?;[Ô]
With cmd
.ActiveConnection = cnnreceitas
.CommandType = adCmdText
.CommandText = comandoSQL
.Parameters.Append .CreateParameter([Ô]@Nome[Ô], adVarWChar, adParamInput, 255, Text_nome.Text)
.Parameters.Append .CreateParameter([Ô]@Endereco[Ô], , , , Text_endereco.Text)
.Parameters.Append .CreateParameter([Ô]@Numero[Ô], , , , Text_numero.Text)
[ô]e o mesmo para todos os demais campos, na mesma ordem em que aparecem na query
.Execute
End With

Repare que os parâmetros são adicionados na mesma ordem e podem até mesmo ser limitados por tipo e tamanho, como é o caso do parâmetro [Ô]Nome[Ô], onde limito o valor como sendo de no máximo 255 caractéres e é especificamente do tipo [Ô]adVarWchar[Ô]. Neste link, tem mais exemplos disso e você pode pesquisar sobre isso no MSDN que vai encontrar bastante coisa.
FRATA 20/08/2016 10:51:26
#466032
Prezado KERPLUNK!
Obrigado pela sua resposta. Funcionou perfeitamente!
Parabéns pela sua explanação e pelo seu conhecimento avançado.
Sua resposta foi muito didática e bem elaborada.
Parabéns e obrigado!
Vou encerrar o tópico.
FRATA 20/08/2016 10:53:19
#466033
Prezado OMAR2011.
Obrigado pela sua colaboração.
Tópico encerrado , respostas não são mais permitidas