none
Error de sintaxis (falta operador) en la expresión de consulta '='UFE391'.

    Question

  • Que tal amigos, soy nuevo en el foro.

     He llegado aquí gracias a un inconveniente.. soy principiante en la programacion, y estaba creando un programa tipico de base de datos con Acces 2007 y VB 2008 Express..

    Haciendo el boton "Buscar" de mi formulario , corro el programa y cuando hago click en dicho botón me sale:

    Error de sintaxis (falta operador) en la expresión de consulta '='UFE391'.

    Es una búsqueda por patente (de un camión).

    Les paso el codigo para ver si pueden ayudarme:


    Imports System.Data.OleDb
    Public Class Form1

        Dim CN As New OleDb.OleDbConnection("PROVIDER=MICROSOFT.ACE.OLEDB.12.0; DATA SOURCE=C:\Users\Andrés\Documents\BDCAMIONES.accdb")

        'PROCEDIMIENTO PARA MOSTRAR TABLA'

        Sub mostrar()
            Dim DA As New OleDb.OleDbDataAdapter("select * from camiones", CN)
            Dim DS As New DataSet
            DA.Fill(DS, "CAMIONES")
            DataGridView1.DataSource = DS.Tables("CAMIONES")
        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            'LLAMO EL PROCEDIMIENTO'
            mostrar()

        End Sub

        Sub BUSCAR_COD()

            Dim CMD As New OleDb.OleDbCommand("SELECT * FROM CAMIONES WHERE='" & CBODOM.Text & "'", CN)

            Dim DR As OleDb.OleDbDataReader

            CN.Open()
            DR = CMD.ExecuteReader


            If DR.Read Then
                CBOBAHIA.Text = DR(2)
                TXTCONDUCTOR.Text = DR(3)
                TXTREPARACIONES.Text = DR(4)
                CBOMARCA.Text = DR(5)
                TXTRESPONSABLE.Text = DR(6)
                CBOMANTEN.Text = DR(7)
            Else
                MsgBox("ERROR")
            End If
            CN.Close()

        End Sub
        Private Sub BTNBUSCAR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNBUSCAR.Click
            BUSCAR_COD()
        End Sub
    End Class

    Lo que está en negrita es donde me marca el error. CBODOM es el combobox donde escribo la búsqueda (DOM=DOMINIO).

    Calculo que es algo muy simple, espero puedan ayudarme.

    Un saludo!!

    Tuesday, November 06, 2012 8:57 PM

Answers

  • Hola Amig(@) Pumiita:

    Tal cual como lo indica Oscar Emilio existen muchos huecos en tu codigo, como puntos importantes el No usar parametros para las consultas.

    La instruccion SQL que intentas ejecutar esta mal definida ya que haces:

    "SELECT * FROM CAMIONES WHERE='" & CBODOM.Text & "'", CN)

    Cuando una consulta SQl de seleccion condicional debe de tener un Columna fija en la cual se buscara el o los valores a Filtrar.

    Algo como esto:

    "SELECT * FROM Camiones WHERE NombreDeTuColumna = ValorABuscar"

    Te recomiento este curso Online gratis para SQLBasico:

    Curso SQL desde cero online

    Ahora para que entiendas las razones del porque hemos sido tan insistentes en usar parametros en tus consultas de Accion SQL, te dejo estos dos Articulos de la propia libreria de Microsoft para que te convenzas por ti mismo de las razones y ventajas del porque usar parametros:

    Parámetros de los comandos de adaptadores de datos

    Cómo: Proteger ASP.NET de inyecciones SQL

    Modifique un poco tu codigo, para que veas como quedaria usando parametros pero insisto en que tendras que definir una columna despues de la clausura WHERE:

    Tu metodo BUSCAR_COD:

     Private Sub BUSCAR_COD()
    	Try	
    		Using cnx As New OleDbConnection("PROVIDER=MICROSOFT.ACE.OLEDB.12.0; DATA SOURCE=C:\Users\Andrés\Documents\BDCAMIONES.accdb")
    			Dim SqlActions As String
    				SqlActions = "SELECT * FROM CAMIONES WHERE NombreCampo = @NombredelParametro"
    			Dim cmd As New OleDbCommand(SqlActions, Cnx)
    			cmd.Parameters.AddWithValue("@NombredelParametro", CBODOM.Text)
    			Dim Lectura As New OleDbDaTaReader = Cmd.ExecuteReader()
    			If Lectura.Read = True Then
    			    'Ojo en esta parte ya que las columnas que devuelve la consulta estas enumeradas bajo el indice 0
    				'Asi Si tu Tabla tiene esta estructura: Campo1, Campo2, Campo3, Campo4
    				'Y deseas mostrar en el Control CBOBAHIA el valor del Campo1 harias esto CBOBAHIA.Text = Lectura(0)
    				CBOBAHIA.Text = Cstr(Lectura(0))
    				TXTCONDUCTOR.Text = Cstr(Lectura(1))
    				TXTREPARACIONES.Text = Cstr(Lectura(2))
    				CBOMARCA.Text = Cstr(Lectura(3))
    				TXTRESPONSABLE.Text = Cstr(Lectura(4))
    				CBOMANTEN.Text = Cstr(Lectura(5))
    				Lectura.Close()
    			End if
    		End Using
    	Catch Ex As New Exception
    		Throw
    	End Try
    End Sub

    Para mandar a llamar el metodo BUSCAR_COD:

    Private Sub BTNBUSCAR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNBUSCAR.Click
    	BUSCAR_COD()
    End Sub

    Para tu funcion Mostrar:

    Private Function Mostrar() As DataTable
    	Try
    		Using cnn As New OleDbConnection("PROVIDER=MICROSOFT.ACE.OLEDB.12.0; DATA SOURCE=C:\Users\Andrés\Documents\BDCAMIONES.accdb")
    			Dim SqlActions As String
    			SqlActions = "SELECT * FROM camiones" 
    			Dim cmd As New SqlCommand(SqlActions, cnn) 
    			Dim da As New OleDbDataAdapter(cmd)
    			Dim dt As New DataTable() 
    			da.Fill(dt)
    			Return dt 
    	    End Using 
    	Catch ex As Exception
    		Throw 
        End Try 
    End Function

    Para mandar a llamar a tu funcion mostrar:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    	Try
    		Dim dt As DataTable = Mostrar()
    		DataGridView1.DataSource = dt
    	Catch ex As Exception
    		MessageBox(ex.Message)
    	End Try
    End S

    Analiza con detalle las correcciones a tu codigo, lee los articulos y si tienes alguna duda estaremos al pendiente!


    Saludos desde Monterrey, Nuevo León, México!!!

    • Marked as answer by pumiita Wednesday, November 07, 2012 8:25 PM
    Wednesday, November 07, 2012 3:42 PM

All replies

  •  Hola:

    Quíta el signo igual después del Where. En prinicpio eso no tiene que ir.

    Tendrías que intentar trabajar con parámetros, te ahorrarás muchos dolores de cabeza.

    cmd.Parameters.AddWithValue("@cbodom", CBODOM.text). Con lo que la consulta te quedaría así:

    Dim CMD as New OleDb.OleDeCommand("SELECT * FROM CAMIONES WHERE CampoTabla = @cbodom ", CN)

    Un cordial saludo.

    Gemma

    Tuesday, November 06, 2012 9:24 PM
  • y más cosas: apostrofes, y vete a saber que hay puesto en cbdom.text

    Haz esto

    Dim CMD As New OleDb.OleDbCommand("SELECT * FROM CAMIONES WHERE='" & CBODOM.Text & "'", CN)

    MsgBox(CMD.CommandText)

    y verás la instruccion sql que le estás pasando a la base de datos.

    Tuesday, November 06, 2012 9:35 PM
  • Le saqué el = después del WHERE, y el error desapareció;  pero ahora me aparece otro que dice

    No se controló IndexOutOfRangeException

    Índice fuera de los límites de la matriz

    y me marca la casilla CBOMANTEN.Text = DR(7).

    CBODOM.text es un Combobox sin nunguna línea en el menú desplegable.

    Trabajar con parámetros se me hace imposible ya que soy muy principiante, igualmente trataré de averiguar de que se trata.

    Mi objetivo es hacer un simple botón que me busque los datos en el DataGrid pero se me está haciendo cuesta arriba jaja.

    Saludos!

    Wednesday, November 07, 2012 12:33 AM
  • Querido Carlos,

     Hice lo que me dijiste, y el msgBox me tira SELECT*FROM CAMIONES WHERE=UFE391

    ¿Cual sería la traduccion a lenguaje humano? jaja

    agradezco su ayuda!

    Wednesday, November 07, 2012 12:53 AM
  • La traducción en lenguaje humano es "esta mal"

    SELECT * significa "seleccioname todos los campos"

    FROM CAMIONES significa "de la tabla camiones"

    WHERE significa "que cumplan lo siguiente"

    =UFE391 no significa nada y además la sintaxis no lo permite

    Esto podría ser correcto: SELECT * FROM CAMIONES WHERE Matricula='UFE391' -siempre y cuando existiese un campo que se llamase Matricula y fuese de tipo Texto (era access, ¿no?)

    Aquí puedes consultar la sintaxis con ejemplos y tal: w3schools.com

    Wednesday, November 07, 2012 7:03 AM
  • Hola tu tienes en tu consulta sql lo siguiente:

    SELECT * FROM CAMIONES WHERE='" & CBODOM.Text & "'"

    Cuando en realidad la estructura de una consulta sql con la condicional where es la siguiente:

    SELECT *FROM tabla WHERE columna = valor x

    ¿Entonces que falta? mm yo creo que definir la columna ¿no? 

    Algo más que puedo notar en tu código fuente es que no usas parametros  :(

    yo te aconsejariá que utilizaras también la intrucción try..cath (para controlar las exepciones en modo de ejecución)

    mm el codigó fuente que yo te recomendariá es es siguiente:

        Public Sub BUSCAR_COD()
            Using conexion As New OleDb.OleDbConnection("PROVIDER=MICROSOFT.ACE.OLEDB.12.0; DATA SOURCE=C:\Users\Andrés\Documents\BDCAMIONES.accdb") '//CREO UNA CONEXION
                Dim comando As New OleDb.OleDbCommand
                With comando
                    .Connection = conexion
                    .CommandType = CommandType.Text
                    .CommandText = "SELECT * FROM CAMIONES WHERE Dom=@parametro" '//CREO CONSULTA SQL CON PARAMETROS
                    .Parameters.AddWithValue("@parametro", CBODOM.Text) '//HAGO REFERENCIA AL PARAMETRO
                End With
    
                Dim DR As OleDb.OleDbDataReader
                DR = comando.ExecuteReader()
                If DR.Read Then
                    Try
                        CBOBAHIA.Text = DR(1)
                        TXTCONDUCTOR.Text = DR(2)
                        TXTREPARACIONES.Text = DR(3)
                        CBOMARCA.Text = DR(4)
                        TXTRESPONSABLE.Text = DR(5)
                        CBOMANTEN.Text = DR(6)
                    Catch ex As Exception '//EN CASO DE ALGUN ERROR 
                        MsgBox("Error:" + ex.Message)
                    End Try
                End If
            End Using
    
        End Sub

    Finalemente cuando aparece esta exepción   IndexOutOfRangeException es porque el Índice fuera de los límites de la matriz , quizas tu error es que cuando empiezas a contar tus columnas desde el número "1" siendo que el lenguaje vb.net las empieza a contar desde cero , espero haberte ayudado amigo



    Saludos desde México DF

    Wednesday, November 07, 2012 7:03 AM
  • Hola Amig(@) Pumiita:

    Tal cual como lo indica Oscar Emilio existen muchos huecos en tu codigo, como puntos importantes el No usar parametros para las consultas.

    La instruccion SQL que intentas ejecutar esta mal definida ya que haces:

    "SELECT * FROM CAMIONES WHERE='" & CBODOM.Text & "'", CN)

    Cuando una consulta SQl de seleccion condicional debe de tener un Columna fija en la cual se buscara el o los valores a Filtrar.

    Algo como esto:

    "SELECT * FROM Camiones WHERE NombreDeTuColumna = ValorABuscar"

    Te recomiento este curso Online gratis para SQLBasico:

    Curso SQL desde cero online

    Ahora para que entiendas las razones del porque hemos sido tan insistentes en usar parametros en tus consultas de Accion SQL, te dejo estos dos Articulos de la propia libreria de Microsoft para que te convenzas por ti mismo de las razones y ventajas del porque usar parametros:

    Parámetros de los comandos de adaptadores de datos

    Cómo: Proteger ASP.NET de inyecciones SQL

    Modifique un poco tu codigo, para que veas como quedaria usando parametros pero insisto en que tendras que definir una columna despues de la clausura WHERE:

    Tu metodo BUSCAR_COD:

     Private Sub BUSCAR_COD()
    	Try	
    		Using cnx As New OleDbConnection("PROVIDER=MICROSOFT.ACE.OLEDB.12.0; DATA SOURCE=C:\Users\Andrés\Documents\BDCAMIONES.accdb")
    			Dim SqlActions As String
    				SqlActions = "SELECT * FROM CAMIONES WHERE NombreCampo = @NombredelParametro"
    			Dim cmd As New OleDbCommand(SqlActions, Cnx)
    			cmd.Parameters.AddWithValue("@NombredelParametro", CBODOM.Text)
    			Dim Lectura As New OleDbDaTaReader = Cmd.ExecuteReader()
    			If Lectura.Read = True Then
    			    'Ojo en esta parte ya que las columnas que devuelve la consulta estas enumeradas bajo el indice 0
    				'Asi Si tu Tabla tiene esta estructura: Campo1, Campo2, Campo3, Campo4
    				'Y deseas mostrar en el Control CBOBAHIA el valor del Campo1 harias esto CBOBAHIA.Text = Lectura(0)
    				CBOBAHIA.Text = Cstr(Lectura(0))
    				TXTCONDUCTOR.Text = Cstr(Lectura(1))
    				TXTREPARACIONES.Text = Cstr(Lectura(2))
    				CBOMARCA.Text = Cstr(Lectura(3))
    				TXTRESPONSABLE.Text = Cstr(Lectura(4))
    				CBOMANTEN.Text = Cstr(Lectura(5))
    				Lectura.Close()
    			End if
    		End Using
    	Catch Ex As New Exception
    		Throw
    	End Try
    End Sub

    Para mandar a llamar el metodo BUSCAR_COD:

    Private Sub BTNBUSCAR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNBUSCAR.Click
    	BUSCAR_COD()
    End Sub

    Para tu funcion Mostrar:

    Private Function Mostrar() As DataTable
    	Try
    		Using cnn As New OleDbConnection("PROVIDER=MICROSOFT.ACE.OLEDB.12.0; DATA SOURCE=C:\Users\Andrés\Documents\BDCAMIONES.accdb")
    			Dim SqlActions As String
    			SqlActions = "SELECT * FROM camiones" 
    			Dim cmd As New SqlCommand(SqlActions, cnn) 
    			Dim da As New OleDbDataAdapter(cmd)
    			Dim dt As New DataTable() 
    			da.Fill(dt)
    			Return dt 
    	    End Using 
    	Catch ex As Exception
    		Throw 
        End Try 
    End Function

    Para mandar a llamar a tu funcion mostrar:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    	Try
    		Dim dt As DataTable = Mostrar()
    		DataGridView1.DataSource = dt
    	Catch ex As Exception
    		MessageBox(ex.Message)
    	End Try
    End S

    Analiza con detalle las correcciones a tu codigo, lee los articulos y si tienes alguna duda estaremos al pendiente!


    Saludos desde Monterrey, Nuevo León, México!!!

    • Marked as answer by pumiita Wednesday, November 07, 2012 8:25 PM
    Wednesday, November 07, 2012 3:42 PM
  • Luis, y todos:

    Gracias por las respuestas, estoy aprendiendo mucho gracias a ustedes.

    Cuando utilizo el codigo corregido que me indicas, me marca un error en la variable lectura,

    Dim Lectura As New OleDbDaTaReader = "Cmd.ExecuteReader()"

    dice que "se esperaba fin de instruccion" por ende no me reconoce luego dicha variable, indicandome "no se ha declarado el nombre Lectura"

    ¿A qué se debe este problema?

    Saludos, y gracias nuevamente!!

    Wednesday, November 07, 2012 3:58 PM
  • Una disculpa:

    Quitale el NEW

    Dim Lectura As OleDbDaTaReader = Cmd.ExecuteReader()

    Otra cosa que omiti por descuido es abrir la conexion despues de:

    sing cnx As New OleDbConnection(.....)

    Tendras que abrir la conexion de la siguiente manera:

    Cnx.Open()


    Saludos desde Monterrey, Nuevo León, México!!!

    Wednesday, November 07, 2012 4:06 PM
  • Perfecto Luis!!

    Ya había advertido lo de sacarle el NEW y lo de abrir la conexion, pero el problema estaba en que no le quitaba las comillas simples a "Cmd.ExecuteReader()" y me lo tomaba como un string.

    Muchas gracias Luis, Oscar, Carlos y Gemma por su ayuda!! Un gran saludo.

    Wednesday, November 07, 2012 8:25 PM