none
"Syntax error in INSERT INTO statement" AYUDA RRS feed

  • Pregunta

  • tengo esta conexion con Access pero me da el error de sintaxis, necesito ayuda porfavor.

    Public Sub facturarcliente3()
            Dim codigodeventa As String
            Dim codigodeservicio As String
    
            conexion.Open()
            Dim cmd As New OleDbCommand("Select Max(Codigo_de_Venta) FROM Ventas Where NIT = " + Form1.TextBox1.Text + " group by Codigo_de_venta", conexion)
            Dim dr As OleDbDataReader = cmd.ExecuteReader()
            While dr.Read()
                codigodeventa = dr.Item(0).ToString()
            End While
            conexion.Close()
    
            conexion.Open()
            For b As Integer = 0 To Form1.DataGridView1.Rows.Count - 1
                Dim cmd1 As New OleDbCommand("Select Codigo_De_servicio From servicio where Nombre_De_servicio='" + Form1.DataGridView1.Rows(b).Cells(0).Value.ToString() + "'", conexion)
                Dim dr1 As OleDbDataReader = cmd1.ExecuteReader()
    
                While dr1.Read()
                    codigodeservicio = dr1.Item(0).ToString()
                End While
    
                Dim cmd2 As New OleDbCommand("insert into Venta_detalle (Codigo_de_venta, Codigo_de_servicio, Cantidad) VALUES (" + codigodeventa + "," + codigodeservicio + "," + Form1.DataGridView1.Rows(b).Cells(2).Value.ToString() + ")", conexion)
                Dim dr2 As OleDbDataReader = cmd2.ExecuteReader()
            Next
    
            conexion.Close()
    
            MessageBox.Show("Venta Registrada")
    
        End Sub

    me da el error en la linea 

    Dim cmd2 As New OleDbCommand("insert into Venta_detalle (Codigo_de_venta, Codigo_de_servicio, Cantidad) VALUES (" + codigodeventa + "," + codigodeservicio + "," + Form1.DataGridView1.Rows(b).Cells(2).Value.ToString() + ")", conexion)
    lunes, 30 de octubre de 2017 11:24

Respuestas

  • Buenas,

    Ahí esta el problema, la razón de que te de el error que indicabas es que efectivamente, hay un campo vació.

    Tendrás que revisar de donde viene el problema, de primeras, yo cambiaria

    codigodeventa = dr.Item(0).ToString()
    //por
    codigodeventa == dr(0).ToString()

    y lo mismo para el otro datareader.

    Otra opción que tienes es poner un breakpoint al inicio del metodo, e ir depurando linea a linea (tecla F11), comprobando los valores que tienen las variables y cuando se cambian.

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta Diegovp lunes, 30 de octubre de 2017 15:04
    lunes, 30 de octubre de 2017 14:05

Todas las respuestas

  • Buenas,

    a simple vista, tu consulta esta bien, lo que puedes hacer, es poner un breakpoint aqui:

    Dim dr2 As OleDbDataReader = cmd2.ExecuteReader()
    

    y justo antes de eso, cambiar 

    Dim cmd2 As New OleDbCommand("insert into Venta_detalle (Codigo_de_venta, Codigo_de_servicio, Cantidad) VALUES (" + codigodeventa + "," + codigodeservicio + "," + Form1.DataGridView1.Rows(b).Cells(2).Value.ToString() + ")", conexion)
    

    por 

    Dim cmd2 As New OleDbCommand("insert into Venta_detalle (Codigo_de_venta, Codigo_de_servicio, Cantidad) VALUES (" + codigodeventa + "," + codigodeservicio + "," + Form1.DataGridView1.Rows(b).Cells(2).Value.ToString() + ")", conexion)
    Dim strConsulta As String = cmd2.CommandText

    De este modo, vas a poder visualizar en strConsulta la sentencia que vas a mandar a la DB, y evaluar si esta mal escrita. 

    Una vez que hayas hecho eso, si no encuentras el error, escribenos la sentencia que te da el error para poder ayudarte mejor.

    Seguramente (y esto es suposicion), veras que en alguno de los 3 campos no se esta introduciendo el valor correctamente.

    Por otro lado, tambien veo que tienes algunos datos de tipo string, la base de datos espera numeros o espera texto? deigo esto porque si espera texto, tienes que poner el texto entre comillas simples:

    Dim cmd2 As New OleDbCommand("insert into Venta_detalle (Codigo_de_venta, Codigo_de_servicio, Cantidad) VALUES ('" + codigodeventa + "','" + codigodeservicio + "','" + Form1.DataGridView1.Rows(b).Cells(2).Value.ToString() + "')", conexion)
    

    pruebalo tambien y nos comentas

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 30 de octubre de 2017 11:37
  • Jorge gracias por tu respuesta, no me deja adjuntar la imagen pero puedo decirte que la base de datos espera datos numericos y el error mencionado aparece en la linea: 

    dr2 As OleDbDataReader = cmd2.ExecuteReader()

    lunes, 30 de octubre de 2017 11:57
  • Lol,

    No me habia fijado... perdon...

    En esa sentencia que falla, que quieres hacer? leer datos de la db o escribirlos, si lo que quieres hacer es leer datos, la sentencia tiene que ser un select, si lo que quieres es escribirlos [insert, update,delete](que entiendo que es lo que quieres), no tienes que usar el reader.

    si lo que quieres es escribirlos, cambia:

    Dim cmd2 As New OleDbCommand("insert into Venta_detalle (Codigo_de_venta, Codigo_de_servicio, Cantidad) VALUES (" + codigodeventa + "," + codigodeservicio + "," + Form1.DataGridView1.Rows(b).Cells(2).Value.ToString() + ")", conexion)
    Dim dr2 As OleDbDataReader = cmd2.ExecuteReader()

    por

    Dim cmd2 As New OleDbCommand("insert into Venta_detalle (Codigo_de_venta, Codigo_de_servicio, Cantidad) VALUES (" + codigodeventa + "," + codigodeservicio + "," + Form1.DataGridView1.Rows(b).Cells(2).Value.ToString() + ")", conexion)
    cmd2.ExecuteNonQuery()

    ExecuteNonQuery() es el metodo al que hay que llamar para ejecutar escritura de datos.

    Prueba cambiando eso, y nos comentas

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 30 de octubre de 2017 12:01
  • Lo que comenta Jorge es cierto, para ejecutar un insert, update, delete, debes de utilizar el

    cmd2.ExecuteNonQuery()

    Saludos!

    lunes, 30 de octubre de 2017 12:08
  • si exactamente, quiero insertar en la base de datos, ya probe con el executenonquery Jorge pero me sigue marcando el mismo error ahora en esa linea que agregue:

    cmd2.ExecuteNonQuery()

    ya no se que mas probar.

    lunes, 30 de octubre de 2017 12:31
  • Vale,

    Añade la línea que te indicaba

    Dim strConsulta As String = cmd2.CommandText
    cmd2.ExecuteNonQuery()

    Pon un breakpoint para ver el valor de strConsulta y escríbelo en tu respuesta para ver la sentencia que estás mandando, así revisamos lo que mandas y te podemos decir mejor. 

    Te todos modos, me huele a que alguno de los campos que le pasas como variable está vacío, y por eso da el error. 

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:


    lunes, 30 de octubre de 2017 12:36
  • disculpa Jorge, lo añadi de la siguiente manera:

    Dim cmd2 As New OleDbCommand("insert into Venta_detalle (Codigo_de_venta, Codigo_de_servicio, Cantidad) VALUES (" + codigodeventa + "," + codigodeservicio + "," + Form1.DataGridView1.Rows(b).Cells(2).Value.ToString() + ")", conexion)
    "aqui coloque el breakpoint" 
                Dim strConsulta As String = cmd2.CommandText
                cmd2.ExecuteNonQuery()

    pero a la hora de correrlo no se donde me debe salir los datos que dices que estoy enviando para saber donde me da el error

    lunes, 30 de octubre de 2017 12:58
  • Buenas,

    Una vez que has puesto el breakpoint, y la variable se ha asignado, simplemente con pasar el cursor del raton por encima (y dejarlo encima), se muestra el contenido:

    Si aun asi no te apañas, puedes pones un mensaje, puedes ponerlo asi:

    Dim strConsulta As String = cmd2.CommandText
    MessageBox.Show(strConsulta)

    de todos modos, para poder ver el valor de la variable con el breakpoint, tiene que haberse ejecutado la linea, asi que es mejor poner el breakpoint aqui:

    cmd2.ExecuteNonQuery()

    Nos comentas el valor de la variable.

    Atte



    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 30 de octubre de 2017 13:35
  • Listo Jorge, me sale lo siguiente cuando paso el cursor encima y en el msgbox:

    "insert into Venta_detalle (Codigo_de_venta, Codigo_de_servicio, Cantidad) VALUES (,16,'1')"

    aunque el codigo de venta deberia ser 5 y veo que aparece en blanco y el codigo de servicio tendria que ser 1.

    Gracias por la ayuda.

    lunes, 30 de octubre de 2017 13:57
  • Buenas,

    Ahí esta el problema, la razón de que te de el error que indicabas es que efectivamente, hay un campo vació.

    Tendrás que revisar de donde viene el problema, de primeras, yo cambiaria

    codigodeventa = dr.Item(0).ToString()
    //por
    codigodeventa == dr(0).ToString()

    y lo mismo para el otro datareader.

    Otra opción que tienes es poner un breakpoint al inicio del metodo, e ir depurando linea a linea (tecla F11), comprobando los valores que tienen las variables y cuando se cambian.

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta Diegovp lunes, 30 de octubre de 2017 15:04
    lunes, 30 de octubre de 2017 14:05