none
problema al realizar el update en visual studio y sql

    Pregunta

  • Hola muchas gracias por leer el problema, tiene un par de años que deje de programar y quiero retomarlo, entonces pensé hacer un ejercicio  el cual ya hace todo lo que yo quería excepto actualizar, 

    mi cadena de conexión

     Dim conexion As New SqlConnection("Data Source=XXX-PC\SQLEXPRESS;Initial Catalog=productos;Integrated Security=True")

    mi codigo de insertar

      Dim ms As New MemoryStream
            PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat)
            Dim im() As Byte
            im = ms.ToArray()
            Dim insertquery As String = "INSERT INTO PRODUCTOS(clavepro,nombrepro,existencia,precio,imagen) VALUES ('" & TextBox1.Text & "','" & TextBox2.Text & "','" & TextBox3.Text & "','" & TextBox4.Text & "',@im)"

            Dim command As New SqlCommand(insertquery, conexion)
            command.Parameters.Add("@im", SqlDbType.Image).Value = im
            ExecuteMyquery(command, "IMAGEN INSERTADA")

            llenagrid()     'llena un DataGridView manda a llamar la consulta para mostrarlo en el grid
            limpiacajas()  'limpia los textbox y el picturebox , donde se puede previsualizar una imagen

    código para actualizar:

           

     Dim ms As New MemoryStream
            PictureBox1.Image.Save(MS, PictureBox1.Image.RawFormat)
            Dim im() As Byte
            im = MS.ToArray()

            Dim updatequery As String = "Update  PRODUCTOS Set =(clavepro,nombrepro,existencia,precio,imagen)VALUES ('" & TextBox1.Text & "','" & TextBox2.Text & "','" & TextBox3.Text & "','" & TextBox4.Text & "',where clavepro=" & TextBox1.Text & ")"

            Dim command As New SqlCommand(updatequery, conexion)
            command.Parameters.Add("@im", SqlDbType.Image).Value = im
            ExecuteMyquery(command, "IMAGEN ACTUALIZADA")
            conexion.Open()

    en cuestión de sintaxis no me envia error pero al ejecutarlo me manda error en el cuery que cree para la conexion

    este es el cuery::

      Public Sub ExecuteMyquery(MyCommand As SqlCommand, mymessage As String)
            conexion.Open()
            If MyCommand.ExecuteNonQuery = 1 Then
                MessageBox.Show(mymessage)
            Else
                MessageBox.Show("query no ejecutado")
            End If
            conexion.Close()
        End Sub

    el error que me manda es el siguiente::

    Excepción no controlada del tipo 'System.Data.SqlClient.SqlException' en System.Data.dll

    Información adicional: Sintaxis incorrecta cerca de '='

    de antemano gracias por su ayuda 

    lunes, 14 de noviembre de 2016 2:48

Respuestas

  • Tu Update tiene sintaxis incorrecta, debe ser

    UPDATE PRODUCTOS Set clavepro = '" & TextBox1.Text & "', nombrepro='" & TextBox2.Text ......

    lunes, 14 de noviembre de 2016 8:07
  • La sentencia sql del update tal como la tienes no es correcta. Debería ser algo como

    Dim updatequery As String = "Update PRODUCTOS Set clavepro='" & TextBox1.Text & "',nombrepro='" & TextBox2.Text & "',existencia='" & TextBox3.Text & ",precio='" & TextBox4.Text & "' where clavepro=" & TextBox1.Text

    Ten en cuenta que si los valores los pones entre apóstrofes deben ser campos de tipo texto. Comprueba eso.

    También te falta el valor del campo imagen (tienes 5 campos y 4 valores)

    Además debes usar parámetros en lugar de crear la cadena con los valores. Algo así:

    Command = New SqlCommand("UPDATE PRODUCTOS SET clavepro= @Clave, nombrepro=@Nombre, Existencia=@Exist, precio=@Precio WHERE Number=1", conexion)

    Command.Parameters.AddWithValue("@Clave", TextBox1.Text)
    Command.Parameters.AddWithValue("@Nombre", TextBox2.Text)
    Command.Parameters.AddWithValue("@Exist", TextBox3.Text)
    Command.Parameters.AddWithValue("@Precio", TextBox4.Text)
    Command.Parameters.AddWithValue("@Numero", TextBox3.Text)


    Saludos, Javier J

    lunes, 14 de noviembre de 2016 8:12

Todas las respuestas

  • Tu Update tiene sintaxis incorrecta, debe ser

    UPDATE PRODUCTOS Set clavepro = '" & TextBox1.Text & "', nombrepro='" & TextBox2.Text ......

    lunes, 14 de noviembre de 2016 8:07
  • La sentencia sql del update tal como la tienes no es correcta. Debería ser algo como

    Dim updatequery As String = "Update PRODUCTOS Set clavepro='" & TextBox1.Text & "',nombrepro='" & TextBox2.Text & "',existencia='" & TextBox3.Text & ",precio='" & TextBox4.Text & "' where clavepro=" & TextBox1.Text

    Ten en cuenta que si los valores los pones entre apóstrofes deben ser campos de tipo texto. Comprueba eso.

    También te falta el valor del campo imagen (tienes 5 campos y 4 valores)

    Además debes usar parámetros en lugar de crear la cadena con los valores. Algo así:

    Command = New SqlCommand("UPDATE PRODUCTOS SET clavepro= @Clave, nombrepro=@Nombre, Existencia=@Exist, precio=@Precio WHERE Number=1", conexion)

    Command.Parameters.AddWithValue("@Clave", TextBox1.Text)
    Command.Parameters.AddWithValue("@Nombre", TextBox2.Text)
    Command.Parameters.AddWithValue("@Exist", TextBox3.Text)
    Command.Parameters.AddWithValue("@Precio", TextBox4.Text)
    Command.Parameters.AddWithValue("@Numero", TextBox3.Text)


    Saludos, Javier J

    lunes, 14 de noviembre de 2016 8:12
  • Hola, Como bien dice Javier, es necesario que empieces a usar las consultas parametrizadas. Con este sistema evitas el sql injection y posibles errores de sintaxis difíciles de depurar.

    Por ejemplo, el campo Precio (se supone que es un decimal no?) si empleas la coma como separador de decimales, puedes provocar que tu consulta tengo una coma de más y te lance una bonita excepción de sentencia sql no válida.

    Para ello modifico el codigo de Javier

    Command = New SqlCommand("UPDATE PRODUCTOS SET clavepro= @Clave, nombrepro=@Nombre, Existencia=@Exist, precio=@Precio WHERE Number=1", conexion)
    
    Command.Parameters.AddWithValue("@Clave", TextBox1.Text)
    Command.Parameters.AddWithValue("@Nombre", TextBox2.Text)
    Command.Parameters.AddWithValue("@Exist", TextBox3.Text)
    Command.Parameters.AddWithValue("@Precio", Convert.ToDecimal(TextBox4.Text))
    Command.Parameters.AddWithValue("@Numero", Convert.ToInt32(TextBox3.Text))

    Parameters.AddWithValues admite un object como parámetro. Si tu campo de la bbdd es un entero debes enviarle un entero, si es una cadena le pasas un string etc.. Espero haberme explicado. 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    lunes, 14 de noviembre de 2016 8:47
  • hola anterior mente utilice esta cadena

      Dim updatequery As String = "UPDATE productos SET clavepro ='" & TextBox1.Text & "' ,nombrepro='" & TextBox2.Text & "' ,existencia='" & TextBox3.Text & "',precio='" & TextBox4.Text & "',imagen = ,@im where clavepro ='" & TextBox1.Text & "'"

    y me mandaba el error al ejecutar el update:

    Excepción no controlada del tipo 'System.Data.SqlClient.SqlException' en System.Data.dll

    Información adicional: Sintaxis incorrecta cerca de ','.

    lunes, 14 de noviembre de 2016 21:16
  •  Hola:
     Cambia   & "',imagen = ,@im where por  & "',imagen = @im where
     
     Quita la coma que esta delante de la arroba
     
     Un saludo desde Bilbo
     Carlos
     
    lunes, 14 de noviembre de 2016 21:19
  • Sigo insistiendo en que cambies la forma de trabajar y empieces a usar consultas parametrizadas. La concatenación de valores para generar las consultas es una muy mala práctica. Si revisas la MSDN ejemplos de acceso a datos puedes darte cuenta de que siempre se utiliza parámetros.


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 15 de noviembre de 2016 9:37