Datagrid está ocultando Filas después de actualización a BD

15/10/2005 - 16:27 por jmrivera | Informe spam
Hola

Tengo un datagrid cuyo datasource es un datatable
El usuario añade filas al datatable y yo refresco el datagrid. Sin embargo cuando voy a actualizar los datos en la BD, si hago rollback(estoy usando una transaccion), entonces el datagrid no muestra todas las filas

Sé que el datatable mantiene la cantidad de filas originales porque coloco un mensaje que muestra la cantidad de filas. He intentado reasignar el datatable al datagrid después del rollback y refrescar el datagrid, pero tampoco funciona. ¿Qué me recomiendan? Gracias

jmrivera

Ver este tema: http://www.softwaremix.net/viewtopic-443685.htm

Enviado desde http://www.softwaremix.net
 

Leer las respuestas

#1 Jesús López
15/10/2005 - 20:17 | Informe spam
El problema se produce porque hacer rollback en la transacción no tiene
ningún efecto sobre el datatable, quedando así el datable en un estado
incosistente. Las filas modificadas del datatable que fueron actualizadas
con éxito en la base de datos por el dataadapter, tienen un estado
Unchanged, ya que el DataAdapter llamó a AcceptChanges sobre esas filas.
Estas filas tienen unos valores en las columnas que no corresponden con los
que están en la base de datos, debido a que los cambios en la base de datos
se deshicieron al hacer rollback en la transacción. Las filas del datatable
que fueron eliminadas del datatable y fueron eliminadas con éxito de la base
de datos por el dataadapter, ya no existen en el datatable al haberse
llamado AcceptChanges, pero sí existen en la base de datos ya que aunque
fueron eliminadas de la base de datos, se deshizo la transacción. La filas
añadidas en el datatable que fueron insertadas con éxito en la base de datos
por el dataadapter, tienen un estado Unchanged al haber llamado el
dataadapter a AcceptChanges sobre esta filas, sin embargo estas filas no
existen en la base de datos porque aunque fueron insertadas en la base de
datos, la transacción se deshizo. Debido a este problema, después de un
rollback, el datatable resulta completamente inservible y por tanto habría
que deshecharlo.

Para tratar de forma adecuada la posibilidad de rollbacks y seguir
manteniendo el datatable en un estado consistente podemos recurrir al método
GetChanges del DataSet para obtener otro dataset pero sólo con los cambios.
Usaremos este dataset con los cambios para pasárselo al método Update del
dataadapter, de esta manera estamos preservando el estado inicial del
DataSet antes de la transacción. El método Update del dataadapter llamará a
AcceptChanges en todos las filas del datatable que actualice con éxito, pero
estas filas pertenecen al dataset con los cambios no al dataset original,
así que nuestro dataset original no se vé afectado en absoluto por el método
Update del adapter. Si la actualización tiene éxito y confirmamos la
transacción, llamaremos al método AcceptChanges sobre el dataset original
para reflejar el nuevo estado. Pero si la actualización no tiene éxito y
deshacemos la transacción, no hacemos nada con el dataset original, teniendo
así la oportunidad de corregir lo que causó el error en la actualización y
volver a ejecutar la transacción con todos los cambios que se hicieron desde
el principio.

Por ejemplo prodríamos usar un código similar a este:

'ds es el dataset original
'da es el dataadapter
'cn es la conexión

Dim cambios As DataSet = ds.GetChanges()
Dim tran As SqlClient.SqlTransaction = Nothing
Try
cn.Open()
tran = cn.BeginTransaction()
da.UpdateCommand.Transaction = tran
da.DeleteCommand.Transaction = tran
da.InsertCommand.Transaction = tran
da.Update(cambios.Tables("MiTabla"))
tran.Commit()
ds.Tables("MiTabla").AcceptChanges()
Catch ex As Exception
If Not tran Is Nothing AndAlso Not tran.Connection Is Nothing
Then
tran.Rollback()
End If
Throw ex
Finally
If cn.State = ConnectionState.Open Then
cn.Close()
End If
End Try
End Sub




"jmrivera" escribió en el mensaje
news:

Hola,

Tengo un datagrid cuyo datasource es un datatable.
El usuario añade filas al datatable y yo refresco el datagrid. Sin embargo
cuando voy a actualizar los datos en la BD, si hago rollback(estoy usando
una transaccion), entonces el datagrid no muestra todas las filas.

Sé que el datatable mantiene la cantidad de filas originales porque coloco
un mensaje que muestra la cantidad de filas. He intentado reasignar el
datatable al datagrid después del rollback y refrescar el datagrid, pero
tampoco funciona. ¿Qué me recomiendan? Gracias.


jmrivera


Ver este tema: http://www.softwaremix.net/viewtopic-443685.html

Enviado desde http://www.softwaremix.net


Preguntas similares