none
Problema con Sql (Additional information: Incorrect syntax near '='.)

    Pregunta

  • Buenas tardes, me encuentro realizando una aplicacion vb que transfiere los datos a sql, la cual incluye 4 botones(ingresar,modificar,eliminar y buscar),trabajando con clases,el problema radica en el boton modificar me marca el siguiente error 

    Additional information: Incorrect syntax near '='.

    'Esta es mi clase'
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Windows.Forms
    
    Public Class Conexion
    
        Public conexion As SqlConnection = New SqlConnection("Data Source=VAIO\SERVIDORSQLPROFE;Initial Catalog=FRANSARV1;Integrated Security=True")
        Private builder As SqlCommandBuilder
        Public DSet As DataSet = New DataSet()
        Public Dadapter As SqlDataAdapter
        Public Comman As SqlCommand
        Public Sub conectar()
    
            Try
                conexion.Open()
    
                MessageBox.Show("Conectado")
            Catch ex As Exception
                MessageBox.Show("Error al conectar")
            Finally
                conexion.Close()
            End Try
        End Sub
      
    Function Actualizar(ByVal tabla, ByVal campos, ByVal condicion)
            conexion.Open()
            Dim actualiza As String = "update" & tabla & "set" & campos & "where" & condicion
            Comman = New SqlCommand(actualiza, conexion)
            Dim i As Integer = Comman.ExecuteNonQuery()
            conexion.Close()
            If (i > 0) Then
                Return True
            Else
                Return False
            End If
        End Function
    End Class

    'aqui el codigo de mi form donde llamo a mi funcion ,el button2 es mi boton modificar, los tipos de datos de la tabla de sql son No= int el resto son de tipo nvarchar(50)'
    
    Public Class Form1
    
        Dim conexion As Conexion = New Conexion
        
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            conexion.conectar()
            MostrarDatos()
        End Sub
        Public Sub MostrarDatos()
    
            conexion.consulta("select * from DatosCliente", "DatosCliente")
            DataGridView1.DataSource = conexion.DSet.Tables("DatosCliente")
    
        End Sub
      Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
            Dim agregar As String = "insert into DatosCliente values(" + txtint.Text + " ,'" + txtPLACA.Text + "','" + txtRFC.Text + "','" + txtDIRECCION.Text + "','" + txtCP.Text + "','" + txtPROPIETARIO.Text + "','" + txtCORREO.Text + "','" + txtMARCA.Text + "','" + txtMODELO.Text + "','" + txtSERIE.Text + "','" + txtTIPO.Text + "','" + txtTC.Text + "','" + txtCIUDAD.Text + "','" + txtESTADO.Text + "','" + txtMODALIDAD.Text + "','" + txtCAPACIDAD.Text + "','" + txtEJES.Text & "')"
    
            If (conexion.Insertar(agregar)) Then
                MessageBox.Show("Agregados")
                MostrarDatos()
            Else
                MessageBox.Show("Error")
            End If
        End Sub
    
        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
            If (conexion.Eliminar("DatosCliente", "No= " + txtint.Text)) Then
                MessageBox.Show("Datos Eliminados")
                MostrarDatos()
            Else
                MessageBox.Show("Error al eliminar")
            End If
        End Sub
    
        Private Sub DataGridView1_CellContentClick_2(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
            Dim DGV As DataGridViewRow = DataGridView1.Rows(e.RowIndex)
            txtint.Text = DGV.Cells(0).Value.ToString()
            txtPLACA.Text = DGV.Cells(1).Value.ToString()
            txtRFC.Text = DGV.Cells(2).Value.ToString()
            txtDIRECCION.Text = DGV.Cells(3).Value.ToString()
            txtCP.Text = DGV.Cells(4).Value.ToString()
            txtPROPIETARIO.Text = DGV.Cells(5).Value.ToString()
            txtCORREO.Text = DGV.Cells(6).Value.ToString()
            txtMARCA.Text = DGV.Cells(7).Value.ToString()
            txtMODELO.Text = DGV.Cells(8).Value.ToString()
            txtSERIE.Text = DGV.Cells(9).Value.ToString()
            txtTIPO.Text = DGV.Cells(10).Value.ToString()
            txtTC.Text = DGV.Cells(11).Value.ToString()
            txtCIUDAD.Text = DGV.Cells(12).Value.ToString()
            txtESTADO.Text = DGV.Cells(13).Value.ToString()
            txtMODALIDAD.Text = DGV.Cells(14).Value.ToString()
            txtCAPACIDAD.Text = DGV.Cells(15).Value.ToString()
            txtEJES.Text = DGV.Cells(16).Value.ToString()
        End Sub
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Dim actualizar As String = "No=" + txtint.Text + ",PLACA='" + txtPLACA.Text + "', RFC='" + txtRFC.Text + "',DIRECCION='" + txtDIRECCION.Text + "',CP='" + txtCP.Text + "',PROPIETARIO='" + txtPROPIETARIO.Text + "', CORREO='" + txtCORREO.Text + "', MARCA='" + txtMARCA.Text + "', MODELO='" + txtMODELO.Text + "', SERIE='" + txtSERIE.Text + "', TIPO='" + txtTIPO.Text + "', TC='" + txtTC.Text + "', CIUDAD='" + txtCIUDAD.Text + "',  ESTADO='" + txtESTADO.Text + "',   MODALIDAD='" + txtMODALIDAD.Text + "', CAPACIDAD='" + txtCAPACIDAD.Text + "',EJES='" + txtEJES.Text + "'"
            If (conexion.Actualizar("DatosCliente", actualizar, "No=" + txtint.Text)) Then
                MessageBox.Show("Datos actualizados correctamente")
                MostrarDatos()
            Else
                MessageBox.Show("Error al actualizar")
            End If
        End Sub
    End Class



    Luis



    martes, 20 de septiembre de 2016 0:23

Respuestas

  • Santiago110699,

    A simple vista la concatenación de valores no presenta problemas, sin embargo deberías acostumbrar a parametrizar las consultas sql a través de la colección Parameters (clase SqlCommand).

    Sobre lo que presentas te recomiendo dos cosas:

    Primero, has uso del método Format() para concatenar valores, ayudará a no equivocar y aportará legibilidad al código.

    Dim actualizar As String = String.Format("No={0}, PLACA='{1}', RFC='{2}'",
                                                     txtint.Text,
                                                     txtPLACA.Text,
                                                     txtRFC.Text)


    Segundo, al no parametrizar la consulta sql es posible que algún valor contenga un carácter no válido, por ejemplo un apóstrofo en medio de la cadena, te recomiendo poner un punto de interrupción y revisar la consulta sql generada:

    Dim actualiza As String = "update" & tabla & "set" & campos & "where" & condicion
    Comman = New SqlCommand(actualiza, conexion) 'Colocar aquí el punto de interrupción

    Copia el contenido de la variable 'actualiza' a una ventana de Managment Studio y revisa la consulta generada, si el problema "no salta a la vista" intenta ejecutar la consulta o compártela para ver si notamos algún problema.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Santiago110699 martes, 20 de septiembre de 2016 20:51
    martes, 20 de septiembre de 2016 1:23
  • "Santiago110699" escribió:

    > ... el problema radica en el boton modificar me marca el siguiente error
    >
    > Additional information: Incorrect syntax near '='.

    Hola, Santiago:

    Observa bien cómo estás construyendo la sintaxis de la consulta UPDATE en la función Actualizar:

        Function Actualizar(ByVal tabla, ByVal campos, ByVal condicion)
       
            Dim actualiza As String = "update" & tabla & "set" & campos & "where" & condicion

    Si no separas con espacios en blanco las palabras UPDATE, SET y WHERE del resto de los valores de los parámetros (tabla, campos y condicion), no me extraña que obtengas el error que estás obteniendo:   

        Dim actualiza As String = "UPDATE " & tabla & " SET " & campos & " WHERE " & condición

    O si lo prefieres, puedes formatear el valor de la variable 'actualiza' mediante el método String.Format:

        Dim actualiza As String = String.Format("UPDATE {0} SET {1} WHERE {2}", tabla, campos, condicion)

    Aprovecho el mensaje para indicarte que todo procedimiento Function debe devolver un valor con un determinado tipo de dato, el cual se tiene que especificar en la firma de la función, así como el tipo de dato que contiene los distintos parámetros de entrada de la misma.

    Como parece ser que tu función Actualizar devuelve un valor Boolean (True/False), la firma de la función tendrá que ser ésta:

        Function Actualizar(ByVal tabla As String, ByVal campos As String, ByVal condición As String) As Boolean
    
            ' Cuerpo de la función
    
        End Function

    Te funciona porque lo más seguro es que tengas desactivada la instrucción Option Strict, cosa que yo no recomiendo que se haga. Lee la "coletilla" que aparece al final de todos mis mensajes. ;-)

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    martes, 20 de septiembre de 2016 14:24
    Moderador

Todas las respuestas

  • Santiago110699,

    A simple vista la concatenación de valores no presenta problemas, sin embargo deberías acostumbrar a parametrizar las consultas sql a través de la colección Parameters (clase SqlCommand).

    Sobre lo que presentas te recomiendo dos cosas:

    Primero, has uso del método Format() para concatenar valores, ayudará a no equivocar y aportará legibilidad al código.

    Dim actualizar As String = String.Format("No={0}, PLACA='{1}', RFC='{2}'",
                                                     txtint.Text,
                                                     txtPLACA.Text,
                                                     txtRFC.Text)


    Segundo, al no parametrizar la consulta sql es posible que algún valor contenga un carácter no válido, por ejemplo un apóstrofo en medio de la cadena, te recomiendo poner un punto de interrupción y revisar la consulta sql generada:

    Dim actualiza As String = "update" & tabla & "set" & campos & "where" & condicion
    Comman = New SqlCommand(actualiza, conexion) 'Colocar aquí el punto de interrupción

    Copia el contenido de la variable 'actualiza' a una ventana de Managment Studio y revisa la consulta generada, si el problema "no salta a la vista" intenta ejecutar la consulta o compártela para ver si notamos algún problema.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Santiago110699 martes, 20 de septiembre de 2016 20:51
    martes, 20 de septiembre de 2016 1:23
  • "Santiago110699" escribió:

    > ... el problema radica en el boton modificar me marca el siguiente error
    >
    > Additional information: Incorrect syntax near '='.

    Hola, Santiago:

    Observa bien cómo estás construyendo la sintaxis de la consulta UPDATE en la función Actualizar:

        Function Actualizar(ByVal tabla, ByVal campos, ByVal condicion)
       
            Dim actualiza As String = "update" & tabla & "set" & campos & "where" & condicion

    Si no separas con espacios en blanco las palabras UPDATE, SET y WHERE del resto de los valores de los parámetros (tabla, campos y condicion), no me extraña que obtengas el error que estás obteniendo:   

        Dim actualiza As String = "UPDATE " & tabla & " SET " & campos & " WHERE " & condición

    O si lo prefieres, puedes formatear el valor de la variable 'actualiza' mediante el método String.Format:

        Dim actualiza As String = String.Format("UPDATE {0} SET {1} WHERE {2}", tabla, campos, condicion)

    Aprovecho el mensaje para indicarte que todo procedimiento Function debe devolver un valor con un determinado tipo de dato, el cual se tiene que especificar en la firma de la función, así como el tipo de dato que contiene los distintos parámetros de entrada de la misma.

    Como parece ser que tu función Actualizar devuelve un valor Boolean (True/False), la firma de la función tendrá que ser ésta:

        Function Actualizar(ByVal tabla As String, ByVal campos As String, ByVal condición As String) As Boolean
    
            ' Cuerpo de la función
    
        End Function

    Te funciona porque lo más seguro es que tengas desactivada la instrucción Option Strict, cosa que yo no recomiendo que se haga. Lee la "coletilla" que aparece al final de todos mis mensajes. ;-)

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    martes, 20 de septiembre de 2016 14:24
    Moderador
  • Estimado Enrique,

    Guardas razón, no me había percatado del espacio faltante entre las cláusulas y los valores que se concatenan.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 20 de septiembre de 2016 15:55
  • gracias por la ayuda, intentare lo de los formatos un saludo

    Luis

    martes, 20 de septiembre de 2016 20:52
  • Gracias Enrique, mi problema era simplemente por no haber dejado espacios, debere ser mas cuidadoso con ello,un cordial saludo

    Luis

    martes, 20 de septiembre de 2016 20:53