none
error al grabar dataset RRS feed

  • Pregunta

  • tengo un datagridview asociado a un dataset de datos de una tabla

    cuando grabo aveces me da este error:

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

    como lo puedo solucionar?


    Aran
    • Tipo cambiado aticnet lunes, 14 de marzo de 2011 10:58 error de infraccion
    viernes, 11 de marzo de 2011 10:48

Respuestas

  • bueno al final lo he resuelto haciendo todo de forma manual creado los command por separado

    si necesitais mas información lo puedo pasar

    un saludo


    Aran

    • Marcado como respuesta aticnet jueves, 13 de septiembre de 2012 10:16
    jueves, 13 de septiembre de 2012 10:16

Todas las respuestas

  • "aticnet" preguntó:

    > tengo un datagridview asociado a un dataset de datos de una tabla
    >
    > cuando grabo aveces me da este error:
    >
    > Infracción de concurrencia: DeleteCommand afectó a 0 de los 1 registros esperados.
    >
    > como lo puedo solucionar?

    Hola:

    No habría estado de más que hubieses indicado el tipo de base de datos que utilizas, o si en tu proyecto estás utilizando o no un origen de datos configurado con el «Asistente para la configuración de orígenes de datos».

    En la tabla de tu base de datos, ¿tienes como clave principal un campo del tipo Autonumérico o Identity? Si la respuesta es afirmativa, por ahí vienen los problemas de infracción de concurrencia. Si deseas hacer una prueba, modifica el tipo de dato del campo que forma la clave principal, estableciendolo como Entero, e intenta de nuevo actualizar los datos desde tu aplicación.

    Si por casualidad has configurado en tu proyecto un objeto TableAdapter con el Asistente anteriormente mencionado, otra opción sería modificar las propiedades de dicho TableAdapter para que no acepte «simultaneidad optimista».

    Por cierto, modifica el tipo de tu mensaje, porque poco tiene que ver con un Debate. Más bien con una Pregunta, ya que intentas resolver un problema, no generar una discusión :-)

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    sábado, 12 de marzo de 2011 11:11
  • primeramente muchas gracias y perdon me equivoque con lo del debate

    efectivamente mi tabla tiene un id de tipo autonumerico como clave principal ¿no puedo tenerlo?

    no he utilizado asistente lo he hecho asi:

    siempre los hago asi, y a veces me da error de concurrencia al grabar o borrar

     Private Sub cargarDatosLineasAdapter()
        ds = New DataSet
        da = Nothing
        grd.DataSource = Nothing
        grd.Refresh()
    
        Dim sql As String
    
        sql = "select distinct c.idFabricacion,c.articulo,c.cajas,c.lote, "
        sql = sql & " (select count(idfabricacionlinea) from fabricacionlineas where fabricacion=idfabricacion) as tiene "
        sql = sql & " FROM Fabricacion C "
        sql = sql & " LEFT JOIN Fabricacionlineas L ON C.Idfabricacion = L.fabricacion"
    
        sql = sql & " where lote='" & txtLote.Text & "'"
        sql = sql & " order by articulo "
        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, "fabriTabla")
        da.UpdateCommand = cb.GetUpdateCommand
        da.DeleteCommand = cb.GetDeleteCommand
        da.InsertCommand = cb.GetInsertCommand
      End Sub
    

     hecho desde el codigo:


    Aran
    lunes, 14 de marzo de 2011 11:04
  • > efectivamente mi tabla tiene un id de tipo autonumerico como clave
    > principal ¿no puedo tenerlo?

    ¡Claro que lo puedes tener! Pero tienes todas las papeletas para obtener el error que estás obteniendo, sobre todo si ese campo autonumérico forma parte de una relación con otra tabla. Y el motivo de ello es la configuración de la propiedad CommandText de los objetos XXXComand del objeto DataAdapter, porque al utilizar un objeto SqlCommandBuilder para generar aquellos, éste utiliza «simultaneidad optimista», y hay que tener muchísimo cuidado a la hora de eliminar o actualizar registros que forman parte de la tabla principal de una relación. Por éste motivo una veces obtendrás el error y otras no, porque todo dependerá si existen o no registros relacionados, y si se admiten o no las eliminaciones y actualizaciones en cáscada.

    > siempre los hago asi, y a veces me da error de concurrencia al grabar o borrar
    >
    >  sql = sql & " FROM Fabricacion C "
    >  sql = sql & " LEFT JOIN Fabricacionlineas L ON C.Idfabricacion = L.fabricacion"
    >
    >  da.SelectCommand = New SqlCommand(sql, Conn.Conexion)
    >  Dim cb As SqlCommandBuilder = New SqlCommandBuilder(da)

    Me vas a disculpar, pero no comprendo cómo puedes utilizar un objeto SqlCommandBuilder que afecta a más de una tabla. Al estar ejecutando una consulta SQL de combinación que afecta a dos tablas, lo normal es que obtengas el error «La generación SQL dinámica no es compatible con varias tablas de base» cuando intentes ejecutar la siguiente línea de código:

        cb.GetUpdateCommand()

    Repito que no sé cómo te puede funcionar. A mí desde luego no me funciona. ¿?

     


    Enrique Martínez
      [MS MVP - VB]

    martes, 15 de marzo de 2011 19:06
  • hola SoftJaen

    sigo con el problema de la infraccion de concurrencia, me decias "otra opción sería modificar las propiedades de dicho TableAdapter para que no acepte «simultaneidad optimista»."

    como lo puedo hacer ??


    Aran
    miércoles, 1 de junio de 2011 9:13
  • "aticnet" preguntó:

    > sigo con el problema de la infraccion de concurrencia,
    > me decias "otra opción sería modificar las propiedades
    > de dicho TableAdapter para que no acepte
    > «simultaneidad optimista»."

    Pero dices que no estás utilizando objetos TableAdapter, si no que configuras el adaptador de datos mediante un objeto SqlCommandBuilder, cuestión que ignoro cómo lo puedes hacer cuando la consulta SQL de selección afecta a dos tablas. ¿?

    Para no utilizar «simultaneidad optimista», tienes que olvidarte del objeto SqlCommandBuilder, y configurar manualmente la propiedad CommandText de cada objeto SqlCommand existente en las propiedades InsertCommand, UpdateCommand y DeleteCommand del objeto SqlDataAdapter, representado en el código fuente por la variable objeto llamada «da». En definitiva, que a cada propiedad comentada, tienes que asignarle la consulta T-SQL de acción que deseas ejecutar (INSERT INTO, UPDATE y DELETE).

     


    Enrique Martínez
      [MS MVP - VB]

    miércoles, 1 de junio de 2011 11:28
  • aunque parezca mentira sigo sin resolver mi problema de infracción.

    como dices SoftJaen, quito el commandbuilder y creo manualmente el da.selectcommand, da.updatecommand, da.insertcommand y delete

    pero no se como lo tengo que hacer con parametros.

    duda:

     Private Function UpdateLinea(ByVal id As Integer) As Integer
     Dim command As SqlCommand = New SqlCommand( _
                "UPDATE pptolineas SET  ppto = @ppto, " & _
                "articulo=@articulo,descripcion=@descripcion,unidades=@unidades,precioUd=@precioUd, " & _
                "numeropedido=@numeroPedido " & _
                "WHERE idpptolinea =" & id, Conn.Conexion)
      da.UpdateCommand = command
      Try
    
                Conn.Conexion.Open()
                ' da.Update(ds, "lineas")
    
                command.ExecuteNonQuery()
    
                'numeroLinea = CInt(p.Value)
            Catch e As SqlException
                ' Handle exception.
            Finally
                Conn.Conexion.Close()
            End Try
    
            numeroLinea = id 'CInt(p.Value)
            Return numeroLinea
        End Function

    esto solo me sirve para actualizar una linea y creo que no es lo correcto, pero y si el usuario va metiendo lineas en el grid y luego le da a grabar ¿como hago para que grabe todos los cambios (inserciones, eliminaciones y actualizaciones) de todas las lineas?

    tengo que hacer da.update(ds,"table) ?? pero me faltan los updatecommand, insertcommand.... ¿como los hago?

    hay algun ejemplo donde se pueda ver claro?



    • Editado aticnet miércoles, 25 de abril de 2012 17:39
    miércoles, 25 de abril de 2012 17:39
  • Hola aticnet tu post lo había visto ya hace algún tiempo, es la misma pregunta que yo hice acá : 

    http://social.msdn.microsoft.com/Forums/es-es/vcses/thread/6dff6f5d-bf7f-4f36-aacf-c58f2e6a50b0?prof=required

    Tampoco he tenido éxito en la resolución, igualmente no me rindo todavía. Pasate por ahí y seguimos esta discusión a ver si logramos llegar a resolverlo. Incluso hay alguien que dá una solución, pero que a mi no me ha funcionado. Si lograste resolverlo te agradecería que lo compartas, si logro lo mismo también publicaré que método usé.

    Saludos.

    German.

    jueves, 7 de junio de 2012 22:52
  • bueno al final lo he resuelto haciendo todo de forma manual creado los command por separado

    si necesitais mas información lo puedo pasar

    un saludo


    Aran

    • Marcado como respuesta aticnet jueves, 13 de septiembre de 2012 10:16
    jueves, 13 de septiembre de 2012 10:16
  • Hola aticnet, te agradecería si me podés pasar algún ejemplo simple a ver si logro solucionarlo también, de ante mano muchas gracias.

    lunes, 1 de octubre de 2012 21:45