Principales respuestas
error al grabar dataset

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
Respuestas
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] -
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 -
> 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] -
-
"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] -
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
-
Hola aticnet tu post lo había visto ya hace algún tiempo, es la misma pregunta que yo hice acá :
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.
-
-