none
Error de sintaxis en la instrucción INSERT INTO en conexion con base access RRS feed

  • Pregunta

  • buenas mi problema es que tratando de conectar a una base de datos en access por medio de un botón me dice "Error de sintaxis en la instrucción INSERT INTO." lo curioso es que ya antes he usado el mismo código pero en otras bases de datos si alguien tiene la solución muchas gracias aquí abajo dejare el código (¿el error se deberá por que tengo otras tablas en la misma base de datos?)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

                conexion.Open()
                Dim dt As New DataTable
                Dim ds As New DataSet
                ds.Tables.Add(dt)
                Dim da As New OleDbDataAdapter
                da = New OleDbDataAdapter("Select * from Lista", conexion)
                da.Fill(dt)
                Dim nuevo As DataRow = dt.NewRow
                With nuevo
                    .Item("Primer Nombre") = TextBox1.Text
                    .Item("Segundo Nombre") = TextBox2.Text
                    .Item("Primer Apellido") = TextBox3.Text
                    .Item("Segundo Apellido") = TextBox4.Text
                End With
                dt.Rows.Add(nuevo)
                Dim cb As New OleDbCommandBuilder(da)
                da.Update(dt)<---AQUI ES DONDE MARCA EL RECUADRO DEL ERROR 
                conexion.Close()
                showitems()

    conexion.Close()
            End If
        End Sub

    martes, 3 de mayo de 2016 3:09

Respuestas

  • "VictorD514" escribió:

    > ... tratando de conectar a una base de datos en access por medio de
    > un botón me dice "Error de sintaxis en la instrucción INSERT INTO." ...
    >
    >   With nuevo
    >        .Item("Primer Nombre") = TextBox1.Text
    >        .Item("Segundo Nombre") = TextBox2.Text
    >        .Item("Primer Apellido") = TextBox3.Text
    >        .Item("Segundo Apellido") = TextBox4.Text
    >   End With
    >
    > Dim cb As New OleDbCommandBuilder(da)
    > da.Update(dt)<---AQUI ES DONDE MARCA EL RECUADRO DEL ERROR

    Hola:

    Tal y como te ha comentado el compañero Alberto, el problema puede que se deba al espacio en blanco que contiene los nombres de los campos, los cuales tienes que estar encerrados entre corchetes.

    Pero aparte de lo anterior, no observo que hayas configurado las propiedades InsertCommand, UpdateCommand y DeleteCommand dependiendo si a la hora de ejecutar el método Update deseas insertar un nuevo registro, actualizar o eliminar registros respectivamente, por lo que el objeto OleDbCommandBuilder no sabe cómo configurar las consultas INSERT INTO, UPDATE y DELETE que le tiene que asignar al adaptador de datos.

    Suponiendo que solamente deseas insertar un nuevo registro en tu tabla de la base de Access, configurarías el objeto OleDbCommandBuilder tal y como indico a continuación:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Configurar una conexión
                Using conexion As New OleDbConnection(escribe aquí tu cadena de conexión)    
    
                    ' Crear y configurar el comando
                    Dim comando As OleDbCommand = conexion.CreateCommand()
                    comando.CommandText = "SELECT * FROM Lista"
    
                    ' Crear el adaptador de datos
                    Dim da As New OleDbDataAdapter(comando)
    
                    ' Crear y configurar el objeto CommandBuilder
                    '
                    Dim cb As New OleDbCommandBuilder(da)
    
                    ' Indicamos que los nombres de los campos y tabla
                    ' los encierre entre corchetes.
                    '
                    cb.QuotePrefix = "["
                    cb.QuoteSuffix = "]"
    
                    ' Configuramos la propiedad InsertCommand del adaptador de datos
                    '
                    da.InsertCommand = cb.GetInsertCommand()
    
                    ' Crear un nuevo objeto DataTable
                    '
                    Dim dt As New DataTable()
    
                    ' Rellenar el objeto DataTable
                    '
                    da.Fill(dt)
    
                    Dim nuevo As DataRow = dt.NewRow
                    With nuevo
                        .Item("Primer Nombre") = TextBox1.Text
                        .Item("Segundo Nombre") = TextBox2.Text
                        .Item("Primer Apellido") = TextBox3.Text
                        .Item("Segundo Apellido") = TextBox4.Text
                    End With
    
                    dt.Rows.Add(nuevo)
    
                    ' Actualizamos la tabla de la base de datos
                    '
                    da.Update(dt)
    
               End Using
    
               showitems()
    
               ' Resto del código que desees ejecutar
    
             Catch As Exception
                 ' Se ha producido un error
                 MessageBox.Show(ex.Message)
    
             End Try
           
         End Sub 

    Eso por un lado, y por otro, te comento que si tu intención es añadir nuevos registros a la tabla, para nada te hace falta configurar los objetos OleDbDataAdapter, OleDbCommandBuilder y DataTable, porque puedes ejecutar una simple consulta INSERT INTO mediante el método ExecuteNonQuery de un objeto OleDbCommand. ¡Eso sí! Si los nombres de los campos o de la tabla contienen espacios en blanco, procura encerrar los mismos entre corchetes, aunque lo mejor que puedes hacer es evitar que aparezcan espacios en blanco en dichos nombres para no estar pendiente de escribir los corchetes. ;-)


    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, 3 de mayo de 2016 7:12
    Moderador

Todas las respuestas

  • En teoría debería funcionar tal como lo tienes. Mi sospecha es que El OleDbCommandBuilder puede estarse confundiendo y generando mal la sentencia debido a que tus nombres de campos contienen espacios en blanco (como puede verse en las asignaciones de tus .Item). Podrías verificar si esto es así consultando desde el debugger la propiedad CommandText del InsertCommand después de construir el OleDbCommandBuilder. Si no te ha escapado entre corchetes [] los nombres de los campos, entonces esa es la causa del error, y sería un "bug" del OleDbCommandBuilder. Si el error fuera efectivamente ese, podrías soslayarlo asignándole manualmente una INSERT correcta al InsertCommand.
    martes, 3 de mayo de 2016 4:26
  • "VictorD514" escribió:

    > ... tratando de conectar a una base de datos en access por medio de
    > un botón me dice "Error de sintaxis en la instrucción INSERT INTO." ...
    >
    >   With nuevo
    >        .Item("Primer Nombre") = TextBox1.Text
    >        .Item("Segundo Nombre") = TextBox2.Text
    >        .Item("Primer Apellido") = TextBox3.Text
    >        .Item("Segundo Apellido") = TextBox4.Text
    >   End With
    >
    > Dim cb As New OleDbCommandBuilder(da)
    > da.Update(dt)<---AQUI ES DONDE MARCA EL RECUADRO DEL ERROR

    Hola:

    Tal y como te ha comentado el compañero Alberto, el problema puede que se deba al espacio en blanco que contiene los nombres de los campos, los cuales tienes que estar encerrados entre corchetes.

    Pero aparte de lo anterior, no observo que hayas configurado las propiedades InsertCommand, UpdateCommand y DeleteCommand dependiendo si a la hora de ejecutar el método Update deseas insertar un nuevo registro, actualizar o eliminar registros respectivamente, por lo que el objeto OleDbCommandBuilder no sabe cómo configurar las consultas INSERT INTO, UPDATE y DELETE que le tiene que asignar al adaptador de datos.

    Suponiendo que solamente deseas insertar un nuevo registro en tu tabla de la base de Access, configurarías el objeto OleDbCommandBuilder tal y como indico a continuación:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Configurar una conexión
                Using conexion As New OleDbConnection(escribe aquí tu cadena de conexión)    
    
                    ' Crear y configurar el comando
                    Dim comando As OleDbCommand = conexion.CreateCommand()
                    comando.CommandText = "SELECT * FROM Lista"
    
                    ' Crear el adaptador de datos
                    Dim da As New OleDbDataAdapter(comando)
    
                    ' Crear y configurar el objeto CommandBuilder
                    '
                    Dim cb As New OleDbCommandBuilder(da)
    
                    ' Indicamos que los nombres de los campos y tabla
                    ' los encierre entre corchetes.
                    '
                    cb.QuotePrefix = "["
                    cb.QuoteSuffix = "]"
    
                    ' Configuramos la propiedad InsertCommand del adaptador de datos
                    '
                    da.InsertCommand = cb.GetInsertCommand()
    
                    ' Crear un nuevo objeto DataTable
                    '
                    Dim dt As New DataTable()
    
                    ' Rellenar el objeto DataTable
                    '
                    da.Fill(dt)
    
                    Dim nuevo As DataRow = dt.NewRow
                    With nuevo
                        .Item("Primer Nombre") = TextBox1.Text
                        .Item("Segundo Nombre") = TextBox2.Text
                        .Item("Primer Apellido") = TextBox3.Text
                        .Item("Segundo Apellido") = TextBox4.Text
                    End With
    
                    dt.Rows.Add(nuevo)
    
                    ' Actualizamos la tabla de la base de datos
                    '
                    da.Update(dt)
    
               End Using
    
               showitems()
    
               ' Resto del código que desees ejecutar
    
             Catch As Exception
                 ' Se ha producido un error
                 MessageBox.Show(ex.Message)
    
             End Try
           
         End Sub 

    Eso por un lado, y por otro, te comento que si tu intención es añadir nuevos registros a la tabla, para nada te hace falta configurar los objetos OleDbDataAdapter, OleDbCommandBuilder y DataTable, porque puedes ejecutar una simple consulta INSERT INTO mediante el método ExecuteNonQuery de un objeto OleDbCommand. ¡Eso sí! Si los nombres de los campos o de la tabla contienen espacios en blanco, procura encerrar los mismos entre corchetes, aunque lo mejor que puedes hacer es evitar que aparezcan espacios en blanco en dichos nombres para no estar pendiente de escribir los corchetes. ;-)


    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, 3 de mayo de 2016 7:12
    Moderador
  • Oiga muchisimas gracias todo estuvo bien pero creo que esta vez el error es mio seguro, dado que al depurar me ejecuta el mensaje de error del "as Exception" de una vez creo que es que es puesto los valores equivocamente en las lineas "cb.QuotePrefix ="[" " y  "cb.QuoteSuffix ="[" " me podria dar un ejemplo de como lo debería hacer. disculpe las molestia 
    jueves, 5 de mayo de 2016 0:45
  • "VictorD514" escribió:

    > creo que es que es puesto los valores equivocamente en las lineas
    > "cb.QuotePrefix ="[" " y  "cb.QuoteSuffix ="[" "

    El valor de la propiedad QuoteSuffix lo tienes mal, ya que tienes que escribir el carácter de cierre de corchete:

        ' Indicamos que los nombres de los campos y tabla
        ' los encierre entre corchetes.
        '
        cb.QuotePrefix = "["
        cb.QuoteSuffix = "]"

    > me podria dar un ejemplo de como lo debería hacer.

    ¿No te sirve el ejemplo que aparece en mi respuesta anterior?


    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.



    jueves, 5 de mayo de 2016 5:46
    Moderador