Descoordinación por campos Autoincrementales

15/12/2003 - 12:43 por Miguel Rodriguez | Informe spam
Hola a todos:

Ataco una base de datos SQL Server desde ADO .NET el problema se presenta
con los campos Identidad a los que les tengo establecido un incremento
automático de esta identidad (autonumeración).

En este caso
- Si borro el último registro y
- Reago el data set (entrando y saliendo de la aplicación, por ejemplo)
-Luego creo un registro nuevo registro,

La capa desconectada, osea el data set entiende que el campo identidad es
uno menos que lo que es en realidad puesto que la base de datos ya creo ese
registro y crea el siguiente.

Ejemplo

ID DATO
1 dato 1
2 dato 2
3 dato 3 borramos este dato

ID DATO
1 dato 1
2 dato 2

Releemos el data set, por ejemplo cerramos la aplicación y la volvemos a
abrir todo parece estar bien

ID DATO
1 dato 1
2 dato 2 creamos un nuevo registro

Para el data set es el "3" "dato Nuevo" sin embargo al hacer el update del
DataAdapter devuelve el registro "4" "DatoNuevo"

EL PROBLEMA ES QUE LLEGO A TENER 4 REGISTROS CUANDO EJECUTO EL MERGE ENTRE
LOS DOS DATA SET EL QUE CREA CON EL REGISTRO 3 EL DsPed Y EL QUE DEVUELVE EL
SQL EN ObjCambios con el registro 4

¿Cómo solucionar esto?

Este sería el código que utilizo para la actualización


Private Sub ActualizaTodos()
Dim ObjCambios As dspedidos 'Aloja los cambios
producidos en el data set
Me.BindingContext(Dsped).EndCurrentEdit() 'Terminamos con las ediciones
que se puedan estar realizando
ObjCambios = CType(Dsped.GetChanges, dspedidos)
If (Not (ObjCambios) Is Nothing) Then
Try
ActualizaFuenteDeDatosTodos(ObjCambios)
Dsped.Merge(ObjCambios)
Dsped.AcceptChanges()
Catch eActualización As System.Exception
MessageBox.Show(eActualización.Message)
End Try
End If
End Sub

Public Sub ActualizaFuenteDeDatosTodos(ByVal Objcambios As dspedidos)
Try
Cnn.Open()
If Not (Objcambios) Is Nothing Then
Me.DaPrd.Update(Dsped.producto)
Me.DAPedidos.Update(Dsped.pedido)
Me.DALineas.Update(Dsped.linea)
Me.DaEmpleados.Update(Dsped.Empleados)
Me.daPrvAPed.Update(Dsped.proveedorApedido)
Me.DAPrvALinea.Update(Dsped.proveedorAlinea)
Me.daPlazoEntregaPedidos.Update(Dsped.PlazoEntregaPedidos)
Me.DaPedidoReal.Update(Dsped.PedidoReal)
Me.DaPedidoRealLinea.Update(Dsped.PedidoRealLinea)
End If
Catch EX As Exception
Throw EX
Finally
Cnn.Close()
End Try
End Sub
 

Leer las respuestas

#1 Miguel Rodriguez
17/12/2003 - 09:24 | Informe spam
he aqui un artículo que trata el tema.

http://www.microsoft.com/spanish/ms...crisis.asp


"Miguel Rodriguez" escribió en el mensaje
news:
Hola a todos:

Ataco una base de datos SQL Server desde ADO .NET el problema se presenta
con los campos Identidad a los que les tengo establecido un incremento
automático de esta identidad (autonumeración).

En este caso
- Si borro el último registro y
- Reago el data set (entrando y saliendo de la aplicación, por ejemplo)
-Luego creo un registro nuevo registro,

La capa desconectada, osea el data set entiende que el campo identidad es
uno menos que lo que es en realidad puesto que la base de datos ya creo


ese
registro y crea el siguiente.

Ejemplo

ID DATO
1 dato 1
2 dato 2
3 dato 3 borramos este dato

ID DATO
1 dato 1
2 dato 2

Releemos el data set, por ejemplo cerramos la aplicación y la volvemos a
abrir todo parece estar bien

ID DATO
1 dato 1
2 dato 2 creamos un nuevo registro

Para el data set es el "3" "dato Nuevo" sin embargo al hacer el update del
DataAdapter devuelve el registro "4" "DatoNuevo"

EL PROBLEMA ES QUE LLEGO A TENER 4 REGISTROS CUANDO EJECUTO EL MERGE ENTRE
LOS DOS DATA SET EL QUE CREA CON EL REGISTRO 3 EL DsPed Y EL QUE DEVUELVE


EL
SQL EN ObjCambios con el registro 4

¿Cómo solucionar esto?

Este sería el código que utilizo para la actualización


Private Sub ActualizaTodos()
Dim ObjCambios As dspedidos 'Aloja los cambios
producidos en el data set
Me.BindingContext(Dsped).EndCurrentEdit() 'Terminamos con las


ediciones
que se puedan estar realizando
ObjCambios = CType(Dsped.GetChanges, dspedidos)
If (Not (ObjCambios) Is Nothing) Then
Try
ActualizaFuenteDeDatosTodos(ObjCambios)
Dsped.Merge(ObjCambios)
Dsped.AcceptChanges()
Catch eActualización As System.Exception
MessageBox.Show(eActualización.Message)
End Try
End If
End Sub

Public Sub ActualizaFuenteDeDatosTodos(ByVal Objcambios As dspedidos)
Try
Cnn.Open()
If Not (Objcambios) Is Nothing Then
Me.DaPrd.Update(Dsped.producto)
Me.DAPedidos.Update(Dsped.pedido)
Me.DALineas.Update(Dsped.linea)
Me.DaEmpleados.Update(Dsped.Empleados)
Me.daPrvAPed.Update(Dsped.proveedorApedido)
Me.DAPrvALinea.Update(Dsped.proveedorAlinea)
Me.daPlazoEntregaPedidos.Update(Dsped.PlazoEntregaPedidos)
Me.DaPedidoReal.Update(Dsped.PedidoReal)
Me.DaPedidoRealLinea.Update(Dsped.PedidoRealLinea)
End If
Catch EX As Exception
Throw EX
Finally
Cnn.Close()
End Try
End Sub




Preguntas similares