none
Ayuda con mi código. RRS feed

  • Pregunta

  • Estimados,

    Estoy tratando de realizar dos insert con un único botón a una base de datos PostgreSQL. El segundo insert tiene un select anidado y además depende del primero. El error que me está dando es el 42601 (error de sintaxis) y es en el segundo ExecuteNonQuery().

    Les dejo el código por si pueden darme una mano.

    Dim fi As Date = DateTimePicker1.Value.Date
            Dim ff As Date = DateTimePicker2.Value.Date
            Dim dh As Integer = CInt(TextBox2.Text)
            Dim dc As Integer = DateDiff("d", fi, ff) + 1
            Dim rutlv As ListViewItem = ListView1.FocusedItem
            Dim rut As String
    
            rut = CStr(rutlv.Text)
            Try
                Using cn As New Npgsql.NpgsqlConnection("mi cadena de conexion")
                    Dim ConsultaSQL = "insert into vacaciones (fecha_inicial, fecha_final, duracion_corrida, duracion_habil) values (@fi,@ff,@dc,@dh)"
    
    
                    Dim cmd As New Npgsql.NpgsqlCommand(ConsultaSQL, cn)
    
    
                    cmd.Parameters.AddWithValue("@fi", fi)
                    cmd.Parameters.AddWithValue("@ff", ff)
                    cmd.Parameters.AddWithValue("@dh", dh)
                    cmd.Parameters.AddWithValue("@dc", dc)
    
    
                    cn.Open() 'Abrir conexión
                    cmd.ExecuteNonQuery()
                    cn.Close()
    
                    Dim consultaSQL2 = "insert into personavacas (persona_id, serial_vaca) _
                                        Select persona_id, max(serial_vaca) _
                                        from persona natural join vacaciones _
                                        where persona_id = @rut _
                                        group by persona_id"
                    Dim cmd2 As New Npgsql.NpgsqlCommand(consultaSQL2, cn)
                    cmd2.Parameters.AddWithValue("@rut", rut)
                    cn.Open()
                    cmd2.ExecuteNonQuery()
    
    
                End Using
            Catch ex As Npgsql.PostgresException
                MessageBox.Show(ex.Message)
            End Try
            cn.Close()
        End Sub
    De antemano, muchas gracias.

    • Cambiado Enrique M. Montejo martes, 28 de marzo de 2017 7:07 Pregunta relacionada con el acceso a datos con PostgreSQL.
    viernes, 24 de marzo de 2017 21:28

Todas las respuestas

  • [...] error de sintaxis [...]

    from persona natural join vacaciones

    Veo ahi algo raro. Tienes un espacio en blanco en medio del nombre de la tabla. ¿No se llamará "personanatural" o "persona_natural" o algo así? Si de verdad se llama "persona natural" con un espacio en blanco, entonces hay que encerrarla entre corchetes: [persona natural].
    viernes, 24 de marzo de 2017 21:46
  • Hola ppsev,

    Aparte de lo mencionado por el Sr. Alberto. ¿Por qué agregar los guiones bajos?

    - Si mandas a mostrar mediante un MessageBox(..) la query que se ejecutará en la BD será :

    Dim consultaSQL2 = "insert into personavacas (persona_id, serial_vaca) " &
                        "Select persona_id, max(serial_vaca) " &
                        "from [persona natural] join vacaciones " &
                        "where persona_id = @rut " &
                        "group by persona_id"

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 24 de marzo de 2017 21:59
  • Estimados,

    Gracias por sus respuestas. El "natural join" es un tipo de join que existe en SQL (así como el inner, left, right, etc...), por lo que la tabla no es "persona_natural" o "[persona natural]". 

    La gracia del natural join es que se comparan todas las columnas que tengan el mismo nombre en ambas tablas. La tabla resultante contiene sólo una columna por cada par de columnas con el mismo nombre.

    Con respecto a los guiones bajos, estos son para poder poner el string de consulta cortado y que no se "escape" de la pantalla. Me imagino que funciona igual que la forma que sugiere Joel.

    Saludos.

    sábado, 25 de marzo de 2017 18:19
  • Hola ppsev,

    [-] .. Con respecto a los guiones bajos, estos son para poder poner el string de consulta cortado y que no se "escape" de la pantalla. Me imagino que funciona igual que la forma que sugiere Joel.

    Para la vista puede ser que te funcione, pero si analizas bien los guiones se encuentran dentro de las comillas por lo que lo toma como parte de la consulta, por lo que no funcionaría de la misma forma.

    - Mira, a la consulta reemplazo los guiones por un '*' para que sea más notorio el problema.

    Dim consultaSQL2 = "insert into personavacas (persona_id, serial_vaca) _
                                Select persona_id, max(serial_vaca) _
                                from persona natural join vacaciones _
                                where persona_id = @rut _
                                group by persona_id"
    
    MessageBox.Show(consultaSQL2.Replace("_", "*"))

    Resultado : Tu consulta a la BD se enviaría con guiones y todo, lo cual generaría problemas en la query.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    sábado, 25 de marzo de 2017 18:41
  • Hola ppsev,

    [-] .. Con respecto a los guiones bajos, estos son para poder poner el string de consulta cortado y que no se "escape" de la pantalla. Me imagino que funciona igual que la forma que sugiere Joel.

    Para la vista puede ser que te funcione, pero si analizas bien los guiones se encuentran dentro de las comillas por lo que lo toma como parte de la consulta, por lo que no funcionaría de la misma forma.

    - Mira, a la consulta reemplazo los guiones por un '*' para que sea más notorio el problema.

    Dim consultaSQL2 = "insert into personavacas (persona_id, serial_vaca) _
                                Select persona_id, max(serial_vaca) _
                                from persona natural join vacaciones _
                                where persona_id = @rut _
                                group by persona_id"
    
    MessageBox.Show(consultaSQL2.Replace("_", "*"))

    Resultado : Tu consulta a la BD se enviaría con guiones y todo, lo cual generaría problemas en la query.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    Gracias Joel por tu respuesta. Probé quitando los guiones bajos y lo dejé en una sola línea, pero el problema persiste. También ejecuté la instrucción completa en el pgadmin de postgresql y funcionó sin problemas, por lo que no creo que el insert esté mal hecho.
    sábado, 25 de marzo de 2017 19:48