Recuperacion de Id Autonumerico y metodo Update

07/04/2005 - 01:01 por Carlos Durán Urenda | Informe spam
Saludos a todos

A ver si alguien me puede sugerir algo mas eficiente

Estoy trabajando en VB.Net con formularios windows y una base de Access.

la tabla con la que estoy trabajando tiene un campo autonumerico, el cual
necesito recuperar para poder generar adecuadamente los detalles

estoy ejecutando un comando escalar para recuperar el @@IDENTITY

para esto Inserto un registro con valores predeterminados, hago el Update y
recupero el valor autonumerico, aqui es donde me surgen un par de problemas
1) el Row de mi DataTable no carga el valor del autonumerico, necesito
asignarlo a mano dentro del Item del DataRow
2) Al editar los datos e intentar almacenar me salta un error de
concurrencia, y no efectua la acutalizacion adecuadamente

He resuelto esto haciendo lo siguiente
1) Agregando el registro con valores predeterminados
2) Ejecutar el Metodo Update e inmediatamente recuperar el valor del
Autonumerico
3) Limpiar la tabla
4) Cargar nuevamente el registro utilizando como parametro el valor del
Autonumerico

de esta forma no me marca el conflicto de concurrencia al intentar guardar
los datos editados

Sin embargo me parece poco eficiente ya que tiene que realizar al menos 3
accesos para obtener el registro con el campo autonumerico

alguine me puede indicar un camino mas eficiente para esta cuestion?

He intentado con LoadDataRow, dejando a nothing el campo autonumerico para
que lo cargue inmediatamente, pero solo me funciona si previamente cargue el
ultimo registro de la tabla, de forma que pueda ejecutar el incremento bien.

Lo mismo me sucede con los bindings, utilizando el BindingContext y
agregando el registro, solo si hay datos previamente cargados genera bien el
campo incremental

Gracias de antemano
Carlos Durán

Preguntas similare

Leer las respuestas

#1 SqlRanger
08/04/2005 - 12:22 | Informe spam
La forma más eficiente de hacer eso es asignar el valor autonumérico al
campo en el evento RowUpdated del DataAdapter. El valor autonumérico lo
obtenemos ejecutando SELECT @@IDENTITY en la misma conexión que está usando
el DataAdapter para actualizar la base de datos.

Por ejemplo:


Private cmdIdentity As OleDb.OleDbCommand

Private Function GetIdentity() As Integer
If cmdIdentity Is Nothing Then
cmdIdentity = New OleDb.OleDbCommand("SELECT @@IDENTITY",
Me.OleDbConnection1)
End If
Return CInt(cmdIdentity.ExecuteScalar())
End Function

Private Sub OleDbDataAdapter1_RowUpdated(ByVal sender As System.Object,
ByVal e As System.Data.OleDb.OleDbRowUpdatedEventArgs) Handles
OleDbDataAdapter1.RowUpdated
If e.StatementType = StatementType.Insert Then
e.Row.Item("IdEmpleado") = GetIdentity()
End If
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Me.OleDbDataAdapter1.Fill(Me.DataSet11)
End Sub

Private Sub BtnGuardar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnGuardar.Click
Me.OleDbDataAdapter1.Update(Me.DataSet11)
End


OleDbConnection1 es la conexión que está asignada al DataAdapter y
lógicamente está abierta cuando se produce el evento RowUpdated.


Saludos:

Jesús López
MVP

"Carlos Durán Urenda" escribió en el mensaje
news:
Saludos a todos

A ver si alguien me puede sugerir algo mas eficiente

Estoy trabajando en VB.Net con formularios windows y una base de Access.

la tabla con la que estoy trabajando tiene un campo autonumerico, el cual
necesito recuperar para poder generar adecuadamente los detalles

estoy ejecutando un comando escalar para recuperar el @@IDENTITY

para esto Inserto un registro con valores predeterminados, hago el Update


y
recupero el valor autonumerico, aqui es donde me surgen un par de


problemas
1) el Row de mi DataTable no carga el valor del autonumerico, necesito
asignarlo a mano dentro del Item del DataRow
2) Al editar los datos e intentar almacenar me salta un error de
concurrencia, y no efectua la acutalizacion adecuadamente

He resuelto esto haciendo lo siguiente
1) Agregando el registro con valores predeterminados
2) Ejecutar el Metodo Update e inmediatamente recuperar el valor del
Autonumerico
3) Limpiar la tabla
4) Cargar nuevamente el registro utilizando como parametro el valor


del
Autonumerico

de esta forma no me marca el conflicto de concurrencia al intentar guardar
los datos editados

Sin embargo me parece poco eficiente ya que tiene que realizar al menos 3
accesos para obtener el registro con el campo autonumerico

alguine me puede indicar un camino mas eficiente para esta cuestion?

He intentado con LoadDataRow, dejando a nothing el campo autonumerico para
que lo cargue inmediatamente, pero solo me funciona si previamente cargue


el
ultimo registro de la tabla, de forma que pueda ejecutar el incremento


bien.

Lo mismo me sucede con los bindings, utilizando el BindingContext y
agregando el registro, solo si hay datos previamente cargados genera bien


el
campo incremental

Gracias de antemano
Carlos Durán





Respuesta Responder a este mensaje
#2 Carlos Durán Urenda
08/04/2005 - 17:14 | Informe spam
Ok Gracias Jesús

voy a poner en practica tus recomendaciones, me parecen bastante claras
aunque por lo pronto he decidido dejar de utilizar los autonumericos y
llevar mi propio control incremental evitando problemas en el consecutivo de
la foliación


Saludos
Carlos Durán



"SqlRanger" escribió en el mensaje
news:
La forma más eficiente de hacer eso es asignar el valor autonumérico al
campo en el evento RowUpdated del DataAdapter. El valor autonumérico lo
obtenemos ejecutando SELECT @@IDENTITY en la misma conexión que está
usando
el DataAdapter para actualizar la base de datos.

Por ejemplo:


Private cmdIdentity As OleDb.OleDbCommand

Private Function GetIdentity() As Integer
If cmdIdentity Is Nothing Then
cmdIdentity = New OleDb.OleDbCommand("SELECT @@IDENTITY",
Me.OleDbConnection1)
End If
Return CInt(cmdIdentity.ExecuteScalar())
End Function

Private Sub OleDbDataAdapter1_RowUpdated(ByVal sender As System.Object,
ByVal e As System.Data.OleDb.OleDbRowUpdatedEventArgs) Handles
OleDbDataAdapter1.RowUpdated
If e.StatementType = StatementType.Insert Then
e.Row.Item("IdEmpleado") = GetIdentity()
End If
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Me.OleDbDataAdapter1.Fill(Me.DataSet11)
End Sub

Private Sub BtnGuardar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnGuardar.Click
Me.OleDbDataAdapter1.Update(Me.DataSet11)
End


OleDbConnection1 es la conexión que está asignada al DataAdapter y
lógicamente está abierta cuando se produce el evento RowUpdated.


Saludos:

Jesús López
MVP

"Carlos Durán Urenda" escribió en el mensaje
news:
Saludos a todos

A ver si alguien me puede sugerir algo mas eficiente

Estoy trabajando en VB.Net con formularios windows y una base de Access.

la tabla con la que estoy trabajando tiene un campo autonumerico, el cual
necesito recuperar para poder generar adecuadamente los detalles

estoy ejecutando un comando escalar para recuperar el @@IDENTITY

para esto Inserto un registro con valores predeterminados, hago el Update


y
recupero el valor autonumerico, aqui es donde me surgen un par de


problemas
1) el Row de mi DataTable no carga el valor del autonumerico,
necesito
asignarlo a mano dentro del Item del DataRow
2) Al editar los datos e intentar almacenar me salta un error de
concurrencia, y no efectua la acutalizacion adecuadamente

He resuelto esto haciendo lo siguiente
1) Agregando el registro con valores predeterminados
2) Ejecutar el Metodo Update e inmediatamente recuperar el valor del
Autonumerico
3) Limpiar la tabla
4) Cargar nuevamente el registro utilizando como parametro el valor


del
Autonumerico

de esta forma no me marca el conflicto de concurrencia al intentar
guardar
los datos editados

Sin embargo me parece poco eficiente ya que tiene que realizar al menos 3
accesos para obtener el registro con el campo autonumerico

alguine me puede indicar un camino mas eficiente para esta cuestion?

He intentado con LoadDataRow, dejando a nothing el campo autonumerico
para
que lo cargue inmediatamente, pero solo me funciona si previamente cargue


el
ultimo registro de la tabla, de forma que pueda ejecutar el incremento


bien.

Lo mismo me sucede con los bindings, utilizando el BindingContext y
agregando el registro, solo si hay datos previamente cargados genera bien


el
campo incremental

Gracias de antemano
Carlos Durán









email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida