none
Problemas Con actualizar en la BD de Access con visual studios "error 0x80004005 la operacion debe hacer una consulta actualizable" RRS feed

  • Pregunta

  • Tengo el siguiente problema en una aplicacion que ya se ejecuta como instalador en mi pc.

    este es el problema

    tambien no puedo ingresar datos a la base de datos... el codigo para actualizar es el siguiente.

            Dim nombre As String = ""
            Dim apellido As String = ""
            Dim cedula As String = "0"
            Dim contacto As String = "0"
            Dim nombrefinca As String = ""
            Dim departamento As String = ""
            Dim municipio As String = ""
            Dim vereda As String = ""
            Dim localizacion As String = ""
            Dim altura As String = "0"
            Dim variedad1 As String = ""
            Dim hecsembrada1 As String = "0"
            Dim arbsembrados1 As String = "0"
            Dim variedad2 As String = ""
            Dim hecsembrada2 As String = "0"
            Dim arbsembrados2 As String = "0"
            Dim variedad3 As String = ""
            Dim hecsembrada3 As String = "0"
            Dim arbsembrados3 As String = "0"
            Dim cuota As String = "0"
            'ASIGNAMOS CADA VARIABLE A CADA TEXTBOX:::::::::::::::::::::
            nombre = Caficultorsocio.txtNombrespersonas.Text
            apellido = Caficultorsocio.txtApellidospersonas.Text
            cedula = Caficultorsocio.txtCedulapersonas.Text
            contacto = Caficultorsocio.txtContactopersonas.Text
            nombrefinca = Caficultorsocio.TxtNombrefinca.Text
            departamento = Caficultorsocio.TxtDepartamento.Text
            municipio = Caficultorsocio.TxtMunicipio.Text
            vereda = Caficultorsocio.TxtVereda.Text
            localizacion = Caficultorsocio.TxtLozalicacion.Text
            altura = Caficultorsocio.TxtAltura.Text
            variedad1 = Caficultorsocio.TxtVariedad1.Text
            hecsembrada1 = Caficultorsocio.TxtHecArboles1.Text
            arbsembrados1 = Caficultorsocio.TxtSemArboles1.Text
            variedad2 = Caficultorsocio.TxtVariedad2.Text
            hecsembrada2 = Caficultorsocio.TxtHecArboles2.Text
            arbsembrados2 = Caficultorsocio.TxtSemArboles2.Text
            variedad3 = Caficultorsocio.TxtVariedad3.Text
            hecsembrada3 = Caficultorsocio.TxtHecArboles3.Text
            arbsembrados3 = Caficultorsocio.TxtSemArboles3.Text
            cuota = Caficultorsocio.TxtCuota.Text
    
    
    
    
            'INSERTAMOS TODOS LOS DATOS A UNA VARIABLE PARA LUEGO INSERTAR LOS DATOS A LA BASE DE DATOS::::::::::.
    
            cmd1.CommandType = CommandType.Text
            cmd1.Connection = ConAsociados
    
    
            sqlAsociados = "UPDATE ASOCIADOS SET "
            sqlAsociados += "NOMBRES = '" & nombre & "', "
            sqlAsociados += "APELLIDOS = '" & apellido & "', "
            sqlAsociados += "CONTACTO = " & contacto & ", "
            sqlAsociados += "NOMBREFINCA = '" & nombrefinca & "', "
            sqlAsociados += "DEPARTAMENTO = '" & departamento & "', "
            sqlAsociados += "MUNICIPIO = '" & municipio & "', "
            sqlAsociados += "VEREDA = '" & vereda & "', "
            sqlAsociados += "LOCALIZACION = '" & localizacion & "', "
            sqlAsociados += "ALTURA = " & altura & ", "
            sqlAsociados += "VARIEDAD1 = '" & variedad1 & "', "
            sqlAsociados += "HECSEMBRADA1 = " & hecsembrada1 & ", "
            sqlAsociados += "ARBSEMBRADO1 = " & arbsembrados1 & ", "
            sqlAsociados += "VARIEDAD2 = '" & variedad2 & "', "
            sqlAsociados += "HECSEMBRADA2 = " & hecsembrada2 & ", "
            sqlAsociados += "ARBSEMBRADO2 = " & arbsembrados2 & ", "
            sqlAsociados += "VARIEDAD3 = '" & variedad3 & "', "
            sqlAsociados += "HECSEMBRADA3 = " & hecsembrada3 & ", "
            sqlAsociados += "ARBSEMBRADO3 = " & arbsembrados3 & " "
            sqlAsociados += "WHERE CEDULA = " & cedula & " "
    
    
            cmd1.CommandText = sqlAsociados
    
            'REGISTRAMOS EN LA BASE DE DATOS:::::::::::::::
    
            Try
    
                cmd1.ExecuteNonQuery()
               
                MsgBox("REGISTRO ACTUALIZADO CORRECTAMENTE", MsgBoxStyle.Information, "REGISTRO")
                limpiarAsociados()
            Catch ex As Exception
    
                MsgBox(ex.ToString)
    
            End Try

    y la conexión de datos es la siguiente:

      Public ConAsociados As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Asociados.accdb;Persist Security Info=False")
    No tengo ni idea el error 


    ANDRES FELIPE BAHAMON MONJE

    domingo, 11 de junio de 2017 4:02

Respuestas

  • Hola @ANDRESF BAHAMON

    Te recomiendo usar el App.config para la cadena de conexión 

    <configuration>
    <connectionStrings>
      <add name="default" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Biblioteca\DB\Biblioteca.accdb;
    Persist Security Info=False;"/>
    </connectionStrings>
    </configuration>


    Método Update, adapta el código a tus necesidades.


    Public Shared Sub Actualizar(alumno As AlumnoEntity)
                Using cn = New OleDbConnection(ConfigurationManager.ConnectionStrings("default").ToString())
    cn.Open()
                    Using cmd As OleDbCommand = cn.CreateCommand()
                        cmd.CommandText = "UPDATE Alumnos SET AlumnoId=@AlumnoId, Nombre=@Nombre, Direccion=@Direccion," +
      " Telefono=@Telefono, Email=@Email  WHERE AlumnoId=@AlumnoId"
                        cmd.Parameters.AddWithValue("@AlumnoId", alumno.AlumnoId)
                        cmd.Parameters.AddWithValue("@Nombre", alumno.Nombre)
                        cmd.Parameters.AddWithValue("@Direccion", alumno.Direccion)
                        cmd.Parameters.AddWithValue("@Telefono", alumno.Telefono)
                        cmd.Parameters.AddWithValue("@Email", alumno.Email)
                        cmd.ExecuteNonQuery()
                    End using
                End using
            End Sub


    Espero la información brindada sea de utilidad

    Saludos


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    • Editado Pedro Ávila miércoles, 14 de junio de 2017 7:39
    • Marcado como respuesta ANDRESF BAHAMON miércoles, 14 de junio de 2017 14:54
    miércoles, 14 de junio de 2017 7:32

Todas las respuestas

  • Hola Andrés:

    El problema en principio radica en que estás enviando como valores textos, cuando tendrían que ser variables, por ejemplo, creas la variable string: nombre. Para asignarla al update sería de la siguiente manera:

    sqlAsociados += "NOMBRES =  nombre " es decir, no va entre comillas una variable.

    Después creo que te sería más fácil usar una sola sql para esos datos, todo en un solo proceso, por ejemplo:

    sqlAsociados = "UPDATE ASOCIADOS SET NOMBRES = nombreAPELLIDOS = apellido , ........"

    Es más fácil de leer y menos propensa a tener errores con tanta comilla.

    Un cordial saludo.

    Gemma

    "Si la respuesta te ha servido, márcala por favor, así otros usuarios se beneficiarán de ella."


    domingo, 11 de junio de 2017 8:04
  • hola gemma; es raro ya que me funciona en el visual basic pero al momento de crear el proyecto de instalacion no me funciona.... lo que tu me cambias la parte del sqlAsociados es?'? ya que si le quito las comillas dobles no lo toma como variable  " & variedad1 & " .......


    ANDRES FELIPE BAHAMON MONJE

    domingo, 11 de junio de 2017 13:49
  • Hola Andrés:

    Tampoco está bien como la pones, no tiene que llevar el signo ampensard "&" si es una varianle. déjalo como te indiqué más arriba para el campo NOMBRE = nombre.Si lo conviertes en una sola expresión no tendrías esos problemas, tal como te he indicado más arriba, pero si lo quieres ponder como nos la has mostrado, sería a modo de ejemplo:

    sqlAsociados = "UPDATE ASOCIADOS SET "
            sqlAsociados
    += NOMBRES = nombre
            sqlAsociados
    += APELLIDOS = apellido
            sqlAsociados
    += "CONTACTO =contacto,
            sqlAsociados
    += NOMBREFINCA = nombrefinca,
           ..........

    Un saludo.

    Gemma

    domingo, 11 de junio de 2017 14:15
  • Nada, No toma los nuevos elementos de la variable, es decir que no lo toma como variable

    ANDRES FELIPE BAHAMON MONJE

    domingo, 11 de junio de 2017 17:14
  • Hola Andrés:

    Pasa un breakpoint a ver si las variables que figuran en la consulta llevan valor.

    Pon un punto de interrupción en la misma y ver mirando a ver si lleva valores.

    Un saludo.

    Gemma

    domingo, 11 de junio de 2017 17:36
  • Ya pero de la forma como lo planteas nada, pero si le pongo el & si me sale lo que contiene la variable :(.............. 

    ANDRES FELIPE BAHAMON MONJE

    domingo, 11 de junio de 2017 17:58
  • Buenos dias,

    Porque no pruebas con una consulta parametrizada? es una manera de evitar problemas de conversión de datos, de comillas, etc, y por otro lado, es más segura ya que evita SQLInyection

    https://msdn.microsoft.com/es-es/library/system.data.sqlclient.sqlparametercollection.addwithvalue(v=vs.110).aspx

    Échale un ojo, si tienes dudas comenta por aquí, e intentaremos resolverlas.

    Atte.


    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!

    lunes, 12 de junio de 2017 6:09
  • Hola @ANDRESF BAHAMON

    Te recomiendo usar el App.config para la cadena de conexión 

    <configuration>
    <connectionStrings>
      <add name="default" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Biblioteca\DB\Biblioteca.accdb;
    Persist Security Info=False;"/>
    </connectionStrings>
    </configuration>


    Método Update, adapta el código a tus necesidades.


    Public Shared Sub Actualizar(alumno As AlumnoEntity)
                Using cn = New OleDbConnection(ConfigurationManager.ConnectionStrings("default").ToString())
    cn.Open()
                    Using cmd As OleDbCommand = cn.CreateCommand()
                        cmd.CommandText = "UPDATE Alumnos SET AlumnoId=@AlumnoId, Nombre=@Nombre, Direccion=@Direccion," +
      " Telefono=@Telefono, Email=@Email  WHERE AlumnoId=@AlumnoId"
                        cmd.Parameters.AddWithValue("@AlumnoId", alumno.AlumnoId)
                        cmd.Parameters.AddWithValue("@Nombre", alumno.Nombre)
                        cmd.Parameters.AddWithValue("@Direccion", alumno.Direccion)
                        cmd.Parameters.AddWithValue("@Telefono", alumno.Telefono)
                        cmd.Parameters.AddWithValue("@Email", alumno.Email)
                        cmd.ExecuteNonQuery()
                    End using
                End using
            End Sub


    Espero la información brindada sea de utilidad

    Saludos


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    • Editado Pedro Ávila miércoles, 14 de junio de 2017 7:39
    • Marcado como respuesta ANDRESF BAHAMON miércoles, 14 de junio de 2017 14:54
    miércoles, 14 de junio de 2017 7:32