none
Error de Sintaxis en la instrucción Insert INTRO - Vb.Net y Access 2010/13 RRS feed

  • Pregunta

  • Hola a todos.

    Tengo en un módulo este código, pero me marca el error del título y no guarda los datos.

    Imports System.Data.OleDb Imports System.IO Module Procedimientos 'Variables Public Cnn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & My.Application.Info.DirectoryPath & "\Agenda1.1.accdb; persist security info=false") Public Cmd As New OleDbCommand Public Sql As String = "" 'Guardar Sub Guardar() 'Falta de Información Básica With Form1 If Trim(.txtNombre.Text) = "" Then MsgBox("Falta información obligatoria: Nombre.", MsgBoxStyle.Information, "Aviso") : Exit Sub If Trim(.txtCel.Text) = "" Then MsgBox("Falta información obligatoria: Celular.", MsgBoxStyle.Information, "Aviso") : Exit Sub End With 'Procedimientos de Rutina Cmd.CommandType = CommandType.Text Cmd.Connection = Cnn Sql = ""

    'Instrucción '''''''''''''''' ERROR '''''''''''''''''''''' Sql = "INSERT INTO Table (Id,Apellido,Nombre,Telefono,Celular,Facebook,Twitter,Otra,Email,Nota,Foto)" & " Values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" '''''''''''''''' ERROR '''''''''''''''''''''' Cmd.CommandText = Sql Cmd.Parameters.AddWithValue("@ID", Form1.txtID.Value) Cmd.Parameters.AddWithValue("@Apellido", Form1.txtApellido.Text) Cmd.Parameters.AddWithValue("@Nombre", Form1.txtNombre.Text) Cmd.Parameters.AddWithValue("@Tel", Form1.txtTel.Text) Cmd.Parameters.AddWithValue("@Cel", Form1.txtCel.Text) Cmd.Parameters.AddWithValue("@Face", Form1.txtFace.Text) Cmd.Parameters.AddWithValue("@Twit", Form1.txtTwit.Text) Cmd.Parameters.AddWithValue("@Other", Form1.txtOter.Text) Cmd.Parameters.AddWithValue("@Email", Form1.txtEmail.Text) Cmd.Parameters.AddWithValue("@Note", Form1.txtNote.Text) If Form1.Foto.Image Is Nothing Then Cmd.Parameters.AddWithValue("@Foto", DBNull.Value) Else Dim arrImage() As Byte Dim myMs As New IO.MemoryStream Form1.Foto.Image.Save(myMs, Form1.Foto.Image.RawFormat) arrImage = myMs.GetBuffer() Cmd.Parameters.Add("@Foto", OleDbType.Binary).Value = arrImage End If 'Guardar y Mensaje Try Cmd.ExecuteNonQuery() MsgBox("Registro agregado con Éxito.", MsgBoxStyle.Information, "Nuevo Registro") Catch ex As Exception 'Error Dim msg As String = "" msg = "Código de error específico: " & vbNewLine & ex.HResult & vbNewLine & "Por favor, infórmanos de este problema." MsgBox(msg, MsgBoxStyle.Critical, "Error detectado") msg = "Mensaje Descriptivo: " & vbNewLine & ex.Message MsgBox(msg, MsgBoxStyle.Critical, "Descripción de Error") End Try End Sub End Module

    Alguien tiene alguna idea de como solucionarlo?

    Gracias x Responder.


    Atte. Pablo. [VB.Net - Visual Studio 2015] 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.


    domingo, 7 de febrero de 2016 21:55

Respuestas

  • Observo que tu sentencia es "INSERT INTO Table ...". Pero "Table" es una palabra reservada, no puedes así por las buenas usar una tabla que se llame "Table". Si realmente ese es el nombre de la tabla, escápalo poniendo [Table].

    lunes, 8 de febrero de 2016 8:37
  • Además de tener en cuenta lo que te comenta Alberto en cuanto al nombre de la tabla, no deberías usar un autonumérico si le vas a asignar un valor al campo por código.

    Tienes dos opciones, depende de los requisitos de tu aplicación:

    - Eliminar el campo ID de la INSERT. Access se encargará de asignarle un valor de forma automática al insertar el nuevo registro.

    - Cambiar el tipo de datos del campo ID para que no sea autonumérico y tome el valor que le pasas en la INSERT


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    lunes, 8 de febrero de 2016 9:57
  • Ya te ha respondido Alberto Población, tu sentencia INSERT INTO incluye la palabra reserbada Table como nombre de tabla. Deberá cambiar ese nombre por otro que no esté reservado o poner ese entre corchetes.


    Saludos, Javier J


    lunes, 8 de febrero de 2016 10:18

Todas las respuestas

  • Si necesitan más información, me avisan.

    Atte. Pablo. [VB.Net - Visual Studio 2015] 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.

    lunes, 8 de febrero de 2016 0:16
  • ¿Qué error te da? El error te lo dará al ejecutar Cmd.ExecuteNonQuery, no donde lo has marcado.

    Saludos, Javier J

    lunes, 8 de febrero de 2016 7:49
  • ¿El error te da cuando el PictureBox tiene imagen, cuando no la tiene, o siempre?

    ¿No te da información adicional el error?

    ¿De qué tipo son los campos en Access? ¿Son todos textos excepto el de la foto?

    ¿Qué tipo de control es txtID?


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    lunes, 8 de febrero de 2016 8:09
  • Observo que tu sentencia es "INSERT INTO Table ...". Pero "Table" es una palabra reservada, no puedes así por las buenas usar una tabla que se llame "Table". Si realmente ese es el nombre de la tabla, escápalo poniendo [Table].

    lunes, 8 de febrero de 2016 8:37
  • Hola Javier Jiménez.

    Antes, osea, al principio, me dió un error al ejecutar <Cmd.ExecuteNonQuery> que decía "se necesita una conexión abierta y disponible...", por lo que agregué <Cnn.Open()> en el evento LOAD de Form1 (formulario principal). Cuando ejecuto, no sale el anterior, sino uno nuevo diciendo:  Error de Sintaxis en la Instrución INTRO.

    Gracias x responder.


    Atte. Pablo. [VB.Net - Visual Studio 2015] 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.

    lunes, 8 de febrero de 2016 9:16
  • Hola Asier Villanueva.

    > ¿El error te da cuando el PictureBox tiene imagen, cuando no la tiene, o siempre?
     Solo lo he probado sin cargar ninguna imagen en el pictureBox.

    > ¿No te da información adicional el error?
     Solo dice Error de Sintaxis en la Instrucción INTRO en un MsgBox. Si quieres puedo enviarte el numero de error (ex.Hresult).

    > ¿De qué tipo son los campos en Access? ¿Son todos textos excepto el de la foto?
     Campo          - Tipo
     ID                 - Autonumeración
     Apellido        - Texto corto
     Nombre        - Texto corto
     Telefono       - texto corto
     Celular         - texto corto
     Facebook     - texto corto
     Twitter         - texto corto
     Otra             - texto corto
     Email            - Hipervínculo
     Nota             - Texto largo
     Foto              - Objeto OLE

    > ¿Qué tipo de control es txtID?
     Específicamente es un NumericUpDown. Utilizado para ingresar sólo números.


    Supongo utilizar un Objeto OLE para guardar la imagen DENTRO de la base de datos, en este proyecto no me es recomendable guardar la ruta de la imagen.

    Gracias x Responder.


    Atte. Pablo. [VB.Net - Visual Studio 2015] 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.

    lunes, 8 de febrero de 2016 9:31
  • Además de tener en cuenta lo que te comenta Alberto en cuanto al nombre de la tabla, no deberías usar un autonumérico si le vas a asignar un valor al campo por código.

    Tienes dos opciones, depende de los requisitos de tu aplicación:

    - Eliminar el campo ID de la INSERT. Access se encargará de asignarle un valor de forma automática al insertar el nuevo registro.

    - Cambiar el tipo de datos del campo ID para que no sea autonumérico y tome el valor que le pasas en la INSERT


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    lunes, 8 de febrero de 2016 9:57
  • Ya te ha respondido Alberto Población, tu sentencia INSERT INTO incluye la palabra reserbada Table como nombre de tabla. Deberá cambiar ese nombre por otro que no esté reservado o poner ese entre corchetes.


    Saludos, Javier J


    lunes, 8 de febrero de 2016 10:18