none
Infracción de concurrencia: UpdateCommand afectó a 0 de los 1 registros esperados. RRS feed

  • Pregunta

  •  

    Tengo una base de datos SQL enlazado a un control DataGridView pero al tratar de actualizar los datos me genera este error.

     

    Infracción de concurrencia: UpdateCommand afectó a 0 de los 1 registros esperados.

     

    Espero me puedan orientar para encontrar la solucion y corregir este.

     

     

    Gracias por su ayuda

    • Cambiado Enrique M. Montejo miércoles, 14 de septiembre de 2011 17:41 acceso a datos (De:Lenguaje VB.NET)
    martes, 15 de abril de 2008 19:17

Todas las respuestas

  • Tengo el mismo error y me borra todo el contenido de la tabla de la base de datos, asi que no puedo actualizar las modificaciones que he hecho en el datagridview de la tabla sql.  Esto es el código que tengo para guardar cambios.



         Enlazador_Traduccion.DataSource = ds_Traduccion.Tables(0)
            DataGridView1.DataSource = Enlazador_Traduccion
            da_Traduccion.Update(CType(Enlazador_Traduccion.DataSource, DataTable))



    Estas son las variables que he generado:

         'Private da_Traduccion  As New SqlDataAdapter("select * from XXXXXX", conectar)
            'Private ds_Traduccion As New DataSet
            'Private cmb_Traduccion As New SqlCommandBuilder(da_Traduccion)
            'Private Enlazador_Traduccion As New BindingSource
            'Private commandbuilder As New SqlCommandBuilder(Me.da_Traduccion)
            'Private TablaSource As New DataTable

    Alguien puede ayudarme a resolver este error.

    Gracias x la ayuda.
    martes, 19 de mayo de 2009 11:55
  • Que versión de Visual Studio esta utilizando? por que la version 2005, permite en el Wizard del DataGridView, manejar este caso. Podria estarse presentando por que la tabla origen donde estan los registros que fueron cargados en el DataGrid ya fueron modificados por otra aplicacion , entonces al hacer el UPDATE genera este error por que se encuentran otros registros o se han cambiando.

    Cordialmente
    • Propuesto como respuesta RamsesMao miércoles, 20 de mayo de 2009 0:29
    miércoles, 20 de mayo de 2009 0:28
  • http://www.dotnetmania.com/Articulos/003/Apoyo/dnm3pg20-26.pdf

    Creo que esto os puede ayudar.

    Un Saludo
    miércoles, 20 de mayo de 2009 11:29
  • buenas

    tengo este mismo error, estaba tratando de ver el enlace http://www.dotnetmania.com/Articulos/003/Apoyo/dnm3pg20-26.pdf
    pero me da error

    podrías poner el fichero?

     

    gracias

     


    Aran
    miércoles, 16 de junio de 2010 9:15
  • alguien puede ayudarme con el problema de la concurrencia?

    tengo el grid donde el usuario introduce los datos y ademas de dar alguna vez el problema de concurrencia, otras veces veo que no se actualiza correctamente, quedan datos sin grabar. No entiendo porque

     Private Sub grdLineas_RowValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles grdLineas.RowValidating
    
        If grdLineas.IsCurrentRowDirty Then
          Try
            ds.Tables(0).GetChanges()
            da.Update(ds)
          Catch ex As Exception
            MsgBox(ex.Message)
          End Try
          grdLineas.Rows(grdLineas.CurrentRow.Index).Cells("numerorecepcion").Value = registro.Id
        End If
    
      End Sub

    Aran
    jueves, 1 de julio de 2010 10:35
  • No obtengo respuesta por mas que busco en internet, por favor ALGUIEN PUEDE AYUDARME???

    QUIZAS SEA EL UPDATE DEL COMMANDBUILDER??? POR FAVOR..!!

    Private Sub cargarDatosLineasAdapter()
        ds = New DataSet
        da = Nothing
        grdLineas.DataSource = Nothing
        grdLineas.Refresh()
    
        Dim sql As String
        sql = "select idrecepcionlinea,numerorecepcion,palet,sunumpalet,articulo,descripcion,cajas, "
        sql = sql & " kilos,precioKg, fechacaducidad,serielote,productor,ubicacion "
        sql = sql & " from recepcionLineas where numerorecepcion='" & registro.Id & "' order by idrecepcionlinea"
        da = New SqlDataAdapter()
    
        da.SelectCommand = New SqlCommand(sql, Conn.Conexion)
        Dim cb As SqlCommandBuilder = New SqlCommandBuilder(da)
        cb.GetUpdateCommand()
        cb.GetDeleteCommand()
        cb.GetInsertCommand()
        da.Fill(ds)
        da.UpdateCommand = cb.GetUpdateCommand
        da.DeleteCommand = cb.GetDeleteCommand
        da.InsertCommand = cb.GetInsertCommand
      End Sub
    

    Aran
    martes, 27 de julio de 2010 9:36
  • Hola a todos:

    No se si es el problema igual para todos, pero yo tuve uno parecido y se arregló poniendo el .Clone cuando obtenia los Commands del CommandBuilder:

    da.UpdateCommand = cb.GetUpdateCommand.Clone

    da.DeleteCommand = cb.GetDeleteCommand.Clone

    da.InsertCommand = cb.GetInsertCommand.Clone

    Espero que os sirva, porque yo tardé en descubrirlo sangre/sudor y lágrimas!!!

    Saludos

    martes, 27 de julio de 2010 10:36
  • Bueno, hay que ir cogiendole el tranquillo a esto del DataSet, DataTable, DataAdapter...

    En Primer lugar, eso de "ds.Tables(0).GetChanges()", no sirve para nada en este caso, eliminalo para evitar confusión.

    El GetChanges te devuelve una tabla con todas las filas que tienen algún cambio. En general no es útil.

    Si quisieras actualizar por separado los deletes, lo útil sería      DataTable.Select(,,DataViewRowState.Deleted)

    ------

    El DataAdapter está asociado con una Sentencia Sql, y por tanto con una tabla. A cada Tabla en el DataSet le corresponde su DataAdapter.

    El método Update del DataAdapter se puede usar de varios modos, pero en general lo mas intuitivo es:

         DataAdapter.Update(MiDataTable)

    Observa que tú has puesto DataSet, No DataTable como objeto a actualizar.
    Esto es efectivamente una opción válida, aunque yo no tengo claro como sabe el DataAdapter que tabla tiene que actualizar.

    Esto te devolverá el número de filas actualizadas  (inserts + Updates + Deletes).

    Para que esto funcione, el DataAdapter tiene que tener asignadas las sentencias Sql para Insertar, Actualizar y Borrar.

    Estas sentencias se las puedes poner tú o bien usar el asistente de generación de Dataset Tipados o como tú has hecho usando el CommandBuilder.

    Cuando tú pones

        Dim cb As SqlCommandBuilder = New SqlCommandBuilder(da)

    le estás diciendo al DataAdapter que puede obtener estas sentencias  en base a la sentencia Select consultando el diccionario de la base de datos.

    En realizad las sentencias cb.GetUpdateCommand .... no serían necesarias, pero lo que si es necesario es no cerrar el CB antes de ejecutar la sentencia Update. El commandBuilder tiene que estar "vivo" cuando sea requerido por el dataadapter. Veo que has usado Dim para el commandBuilder y no tengo claro de que el Garbage Collector no se lo carge (Dispose).

    Otros pequeños problemillas que te puedes encontrar con el CommandBuilder, es que no sea capaz de crear alguna de las sentencias Sql correspondientes a Update, Delete o Insert.

    Por ejemplo si no has definido una clave Primaria en la tabla, las sentencias Update o Delete no se crearán.

    También puede fallar la creación de las sentencias cuando la versión del motor de la base de datos no es compatible con la versión del cliente con el que nos conectamos a la misma (Ej.: Servidor Oracle.8, Cliente Oracle.9)

    Conviene en la fase de pruebas verificar que se han creado cada una de ellas:

      Debug.Print Cb.GetDeleteCommand.CommandText

    Yo Personalmente, perfiero construirme las sentencias Sql y los parámetros al menos para las tablas de uso frencuente, ya que la creación de las sentencias sql en tiempo de ejecución varía con la versión del motor de la base de datos, no tengo control sobre las mismas y pueden dar algunos problemas.

    Uno de los problemas con los que te puedes encontrar, es que añades un registro, lo guardas en la BD, lo actualizas y al intentar enviar los cambios a la base de datos, la clave primaria no coincide exactamente con la grabada en la B.D. por lo que te daría el error típico de concurrencia.

    Esto ocurre con fechas ya que la fecha en el DataTable incluye hasta milésimas de segundo, pero también con coma flotante donde los datos se truncan en la B.D. de acuerdo al la Precisión especificada en la definición del campo.

     

    martes, 27 de julio de 2010 11:28
  • Tal ves debas intentar con la funcion AcceptChanges(), antes de hacer el update.
    viernes, 2 de marzo de 2012 16:20
  • parece que sabes del tema, perdona por la insistencia pero llevo tiempo tratando de solucionar el problema de grabar las lineas del datagridview siguiendo tus instrucciones, pero algo debe de hacer mal porque no funciona

    en que evento tendria que llamar al sub de "grabarLineas" 

    rowValidating? rowvalidated?? rowenter??

    tendria que preguntar antes si iscurrentrowdirty para grabar solo si es true no?
    me podrias remitir a alguna articulo o ejemplo para enterarme definitivamente del tema? en casi todos mis proyectos tengo que poner grids para grabar datos en la bd y no estoy segura de que funcionen bien MUCHAS GRACIAS

    Aran

    jueves, 8 de marzo de 2012 10:40
  • al final lo he puesto en el rowvalidated, pero tengo problemas con errores de con Infracción de concurrencia: UpdateCommand afectó a 0 de los 1 registros esperados a veces cuando me muevo por las filas del grid para cambiar algun valor.

    Este era el origen del hilo que estamos tratando pero aun no lo tenemos solucionado no?

        Dim grabando As Boolean = False
        Private Sub GrabarLineas()
            If ds Is Nothing = False Then
                Try
                    grabando = True
                    da.Update(ds, "cobros")
                    grabando = False
                Catch ex As Exception
                    MsgBox(ex.Message.ToString)
                End Try
            End If
        End Sub
    
        Private Sub grd_RowValidated(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles grd.RowValidated
            If ds.HasChanges And grabando = False Then
                GrabarLineas()
            End If
        End Sub
    
    


    Aran

    viernes, 9 de marzo de 2012 10:26