Logo Hardware.com.br
cic321
cic321 Membro Junior Registrado
63 Mensagens 1 Curtida

(Solucionado)"Erro de sintaxe(operador faltando)na expressão de consulta"

#1 Por cic321 22/05/2011 - 12:22
Boa tarde! Estou desenvolvendo um programa em vb.net 2010 com banco de dados access 2007. Com cadastramento e consulta, o primeiro formulario com 2 textboxs, 1 pra nome e o outro pra rg e 1 button para inserir no banco de dados. Quando escrevo "sem espaços"(ex: TatianaRodrigues) ele insere sem problemas, mas quando dou espaço (ex: Tatiana Rodrigues) aparece uma mensagem dizendo: "Erro de sintaxe (operador faltando) na expressão de consulta 'Tatiana Rodrigues'".

Meu código:

Imports System.Data.OleDb

Public Class Cadastro

Private Function Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim con As New OleDb.OleDbConnection
Dim cmd As New OleDb.OleDbCommand
Dim gravou As Boolean

con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\BlackCERO\Documents\Vendas.accdb;Persist Security Info=False;"


cmd.Connection = con
cmd.CommandType = CommandType.Text
cmd.CommandText = "insert into vendas(Nome,Rg)values(" & TextBox1.Text & ", " & TextBox2.Text & ")"

cmd.Parameters.Add(New OleDb.OleDbParameter("Nome", OleDbType.VarChar, 50))
cmd.Parameters("Nome").Value = TextBox1.Text
cmd.Parameters.Add(New OleDb.OleDbParameter("Rg", OleDbType.Integer))
cmd.Parameters("Rg").Value = TextBox2.Text

Try
con.Open()
gravou = cmd.ExecuteNonQuery
cmd = New OleDb.OleDbCommand(cmd.CommandText, con)
Catch ex As Exception
MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
con.Close()
End Try
Return gravou

End Function

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Form1.Show()
End Sub
End Class


Alguém sabe me dizer como resolvo esse problema?? = /

Obrigado!
TerraSkilll
TerraSkilll Zumbi Moderador
4K Mensagens 1.2K Curtidas
#2 Por TerraSkilll
23/05/2011 - 09:10
cic321
Não sei qual a função que faz isso em vbnet, mas você precisaria a princípio adicionar aspas ou apóstrofos ao seu parâmetros. Mais ou menos assim:

[CODE=rich]cmd.Parameters.Add(New OleDb.OleDbParameter("Nome", OleDbType.VarChar, 50))
cmd.Parameters("Nome").Value = FuncaoAdicionaAspas(TextBox1.Text)
cmd.Parameters.Add(New OleDb.OleDbParameter("Rg", OleDbType.Integer))
cmd.Parameters("Rg").Value = FuncaoAdicionaAspas(TextBox2.Text)[/CODE]

ou mesmo

[CODE=rich]cmd.CommandText = "insert into vendas(Nome,Rg)values(" & FuncaoAdicionaAspas(TextBox1.Text) & ", " & FuncaoAdicionaAspas(TextBox2.Text) & ")"[/CODE]

Onde está FuncaoAdicionaAspas, adicione a função do VB net que adiciona as aspas ou os apóstrofos de acordo com a necessidade.

Só um comentário: aparentemente, você está fazendo trabalho duplicado. Com o trecho

[CODE=rich]cmd.CommandText = "insert into vendas(Nome,Rg)values(" & FuncaoAdicionaAspas(TextBox1.Text) & ", " & FuncaoAdicionaAspas(TextBox2.Text) & ")"[/CODE]

você não precisaria fazer

[CODE=rich]cmd.Parameters.Add(New OleDb.OleDbParameter("Nome", OleDbType.VarChar, 50))
cmd.Parameters("Nome").Value = FuncaoAdicionaAspas(TextBox1.Text)
cmd.Parameters.Add(New OleDb.OleDbParameter("Rg", OleDbType.Integer))
cmd.Parameters("Rg").Value = FuncaoAdicionaAspas(TextBox2.Text)[/CODE]

pois não precisaria adicionar parametros (cmd.Parameters.Add() sendo que a instrução já contém os valores para estes parâmetros. Até onde sei, a forma 2 (criando os parâmetro) é mais segura.

Abraço.
Contribua para um fórum melhor: pense antes de postar.
"It isn't a contest. Just enjoy the ride." -> Seth Vidal
Hardware.com.br no Youtube!
TerraSkilll
TerraSkilll Zumbi Moderador
4K Mensagens 1.2K Curtidas
#4 Por TerraSkilll
23/05/2011 - 16:25
cic321
Vou tentar te explicar o erro primeiro pra você entender o que possa ser necessário corrigir. Uma instrução insert direto no banco, para a sua tabela, seria:

insert into vendas(Nome,Rg)values(NomeDaPessoa, RgDaPessoa)

O problema é que, quando há um espaço:

insert into vendas(Nome,Rg)values(Nome Da Pessoa, RgDaPessoa)

o SQL entende a Palavra "Da" e "Pessoa" como comandos distintos, ao invés de uma única instrução (o nome completo "Nome Da Pessoa") e tenta executá-los. Por isso você precisa executar o SQL com aspas e/ou apóstrofos em campos de texto.

Baseado no exemplo aqui: http://oddnetwork.org/blog/2008/07/prepared-sql-statements-in-vb-net/

imagino que você deva tentar:

cmd.Connection = con
cmd.CommandType = CommandType.Text
cmd.CommandText = "insert into vendas(Nome,Rg)values(@Nome,@Rg)"

cmd.Parameters.AddWithValue("@Nome", Request.QueryString(TextBox1.Text))
cmd.Parameters.AddWithValue("@Rg", Request.QueryString(TextBox2.Text))


Desculpe não ter uma resposta direta. VB Net não é minha especialidade.

Abraço.
Contribua para um fórum melhor: pense antes de postar.
"It isn't a contest. Just enjoy the ride." -> Seth Vidal
Hardware.com.br no Youtube!
cic321
cic321 Membro Junior Registrado
63 Mensagens 1 Curtida
#5 Por cic321
25/05/2011 - 17:03
TerraSkill, era isso msm =D consegui! Era só trocar o textbox1 por @Nome como vc falou

era trocar:

cmd.CommandText = "insert into vendas(Nome,Rg)values(" & TextBox1.Text & ", " & TextBox2.Text & ")"

cmd.Parameters.Add(New OleDb.OleDbParameter("Nome", OleDbType.VarChar, 50))
cmd.Parameters("Nome").Value = TextBox1.Text
cmd.Parameters.Add(New OleDb.OleDbParameter("Rg", OleDbType.Integer))
cmd.Parameters("Rg").Value = TextBox2.Text

por:

cmd.CommandText = "insert into vendas(Nome,Rg)values(@Nome,@Rg)"

cmd.Parameters.Add(New OleDb.OleDbParameter("@Nome", OleDb.OleDbType.VarChar)).Value = TextBox1.Text
cmd.Parameters.Add(New OleDb.OleDbParameter("@Rg", OleDb.OleDbType.Integer)).Value = TextBox2.Text


Muito obrigado!! Que Deus te abençoee! =D
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal