Modificar registro después de insertar

10/01/2006 - 14:03 por Juan Melas | Informe spam
Estoy probando una aplicación de capas y me encuentro con el siguiente
problema, inserto un registro en la base de datos y lo guardo perfectamente,
si intento modificarlo en la misma pantalla me da error de concuerrencia, si
vuelvo a cargar el registro ahora si lo puedo guardar sin problemas.

Preguntas similare

Leer las respuestas

#1 Jesús López
10/01/2006 - 17:30 | Informe spam
Seguramente la clave primaria sea autonumérica y no se lee de la base de
datos para actualizarla en el cliente. O puede que la tabla tenga un campo
timestamp y no se refresque en el cliente.

Saludos:

Jesús López
MVP

"Juan Melas" escribió en el mensaje
news:%
Estoy probando una aplicación de capas y me encuentro con el siguiente
problema, inserto un registro en la base de datos y lo guardo
perfectamente, si intento modificarlo en la misma pantalla me da error de
concuerrencia, si vuelvo a cargar el registro ahora si lo puedo guardar
sin problemas.

Respuesta Responder a este mensaje
#2 Juan Melas
10/01/2006 - 20:49 | Informe spam
Si la clave es autonumérica, lo que hago es tomar el valor de la nueva clave
("select @@identity) y luego reemplazo el valor en las tablas involucradas
en el dataset, capturo los comandos de actualización en forma automática ,
paso el fragmento de código que utilizo por si alguien me ayuda en como
mejorarlo para solucionar este problema

Public Overrides Function GuardaTablas(ByVal coltables As Collection, ByVal
ds As DataSet, ByVal EsNuevo As Boolean) As Integer

Dim Connection As IDbConnection = OpenConnection()

Dim tabla As New DataTable

Dim MyTrans As IDbTransaction

Dim RowsUpdated As Integer

Dim idclave As Integer

Dim tablaprimaria As String

Dim esautoinc As Boolean

Dim claveprim As String

Dim ctable As Collection

For Each ctable In coltables

If CType(ctable.Item("nNivel"), Integer) = 1 Then

tablaprimaria = CType(ctable.Item("cTabla"), String)

esautoinc = CType(ctable.Item("lPkeyEsautoinc"), Boolean)

claveprim = CType(ctable.Item("cPkey"), String)

End If

Next

MyTrans = Connection.BeginTransaction()

Try

For Each tabla In ds.Tables

Dim myDataAdapter As New SqlDataAdapter

Dim lctabla As String = tabla.TableName

Dim strsql As String

strsql = "select * from " + lctabla + " where 1=2"

myDataAdapter.SelectCommand = New SqlCommand(strsql, CType(Connection,
SqlClient.SqlConnection), _

CType(MyTrans, SqlClient.SqlTransaction))

Dim CommandBuilder As New SqlCommandBuilder(myDataAdapter)

myDataAdapter.DeleteCommand = CommandBuilder.GetDeleteCommand()

myDataAdapter.UpdateCommand = CommandBuilder.GetUpdateCommand()

myDataAdapter.InsertCommand = CommandBuilder.GetInsertCommand()

myDataAdapter.DeleteCommand.Transaction = CType(MyTrans,
SqlClient.SqlTransaction)

myDataAdapter.UpdateCommand.Transaction = CType(MyTrans,
SqlClient.SqlTransaction)

myDataAdapter.InsertCommand.Transaction = CType(MyTrans,
SqlClient.SqlTransaction)

' Update the data in the DataSet

RowsUpdated = myDataAdapter.Update(ds, tabla.ToString)

If tabla.TableName = tablaprimaria Then

If EsNuevo = True Then

If esautoinc = True Then

Dim cmd As SqlCommand = New SqlCommand("select @@identity", _

CType(Connection, SqlClient.SqlConnection), _

CType(MyTrans, SqlClient.SqlTransaction))

idclave = CType(cmd.ExecuteScalar(), Integer)

Dim mytable As New DataTable

Dim myrow As DataRow

For Each mytable In ds.Tables

If mytable.TableName <> tablaprimaria Then

For Each myrow In mytable.Rows

myrow(claveprim) = idclave

Next

End If

Next

End If

End If

End If

Next

MyTrans.Commit()

Catch excep As SqlException

MyTrans.Rollback()

Throw New Exception("Error:" & excep.Message & excep.LineNumber.ToString)

Finally

Connection.Close()

End Try

If EsNuevo = True And esautoinc = True Then

RowsUpdated = idclave

End If

Return RowsUpdated

End Function

End Class 'DataAccessBase



"Jesús López" escribió en el mensaje
news:%
Seguramente la clave primaria sea autonumérica y no se lee de la base de
datos para actualizarla en el cliente. O puede que la tabla tenga un campo
timestamp y no se refresque en el cliente.

Saludos:

Jesús López
MVP

"Juan Melas" escribió en el mensaje
news:%
Estoy probando una aplicación de capas y me encuentro con el siguiente
problema, inserto un registro en la base de datos y lo guardo
perfectamente, si intento modificarlo en la misma pantalla me da error de
concuerrencia, si vuelvo a cargar el registro ahora si lo puedo guardar
sin problemas.





Respuesta Responder a este mensaje
#3 Jesús López
11/01/2006 - 12:52 | Informe spam
Sí veo que obtienes el autonumérico recién insertado con @@identity. Pero por
lo que veo sólo consideras los autonuméricos cuando la tabla es una tabla
"primaria" y el autonumérico lo utilizas para actualizar campos en otras
tablas distintas de la primaria.

Yo consideraría los autonuméricos en todas las tablas. ¿o es que una tabla
que no es "primaria" no puede tener claves primarias autonuméricas?

Lo primero que hay que hacer con un autonumérico es actualizar el campo en
el datarow correspondiente a esa tabla. Luego si la tabla es una tabla
primaria, actualizar las claves externas de las tablas secundarias.

Saludos:

Jesús López
MVP VB
Solid Quality Learning
www.solidqualitylearning.com



"Juan Melas" wrote:

Si la clave es autonumérica, lo que hago es tomar el valor de la nueva clave
("select @@identity) y luego reemplazo el valor en las tablas involucradas
en el dataset, capturo los comandos de actualización en forma automática ,
paso el fragmento de código que utilizo por si alguien me ayuda en como
mejorarlo para solucionar este problema

Public Overrides Function GuardaTablas(ByVal coltables As Collection, ByVal
ds As DataSet, ByVal EsNuevo As Boolean) As Integer

Dim Connection As IDbConnection = OpenConnection()

Dim tabla As New DataTable

Dim MyTrans As IDbTransaction

Dim RowsUpdated As Integer

Dim idclave As Integer

Dim tablaprimaria As String

Dim esautoinc As Boolean

Dim claveprim As String

Dim ctable As Collection

For Each ctable In coltables

If CType(ctable.Item("nNivel"), Integer) = 1 Then

tablaprimaria = CType(ctable.Item("cTabla"), String)

esautoinc = CType(ctable.Item("lPkeyEsautoinc"), Boolean)

claveprim = CType(ctable.Item("cPkey"), String)

End If

Next

MyTrans = Connection.BeginTransaction()

Try

For Each tabla In ds.Tables

Dim myDataAdapter As New SqlDataAdapter

Dim lctabla As String = tabla.TableName

Dim strsql As String

strsql = "select * from " + lctabla + " where 1=2"

myDataAdapter.SelectCommand = New SqlCommand(strsql, CType(Connection,
SqlClient.SqlConnection), _

CType(MyTrans, SqlClient.SqlTransaction))

Dim CommandBuilder As New SqlCommandBuilder(myDataAdapter)

myDataAdapter.DeleteCommand = CommandBuilder.GetDeleteCommand()

myDataAdapter.UpdateCommand = CommandBuilder.GetUpdateCommand()

myDataAdapter.InsertCommand = CommandBuilder.GetInsertCommand()

myDataAdapter.DeleteCommand.Transaction = CType(MyTrans,
SqlClient.SqlTransaction)

myDataAdapter.UpdateCommand.Transaction = CType(MyTrans,
SqlClient.SqlTransaction)

myDataAdapter.InsertCommand.Transaction = CType(MyTrans,
SqlClient.SqlTransaction)

' Update the data in the DataSet

RowsUpdated = myDataAdapter.Update(ds, tabla.ToString)

If tabla.TableName = tablaprimaria Then

If EsNuevo = True Then

If esautoinc = True Then

Dim cmd As SqlCommand = New SqlCommand("select @@identity", _

CType(Connection, SqlClient.SqlConnection), _

CType(MyTrans, SqlClient.SqlTransaction))

idclave = CType(cmd.ExecuteScalar(), Integer)

Dim mytable As New DataTable

Dim myrow As DataRow

For Each mytable In ds.Tables

If mytable.TableName <> tablaprimaria Then

For Each myrow In mytable.Rows

myrow(claveprim) = idclave

Next

End If

Next

End If

End If

End If

Next

MyTrans.Commit()

Catch excep As SqlException

MyTrans.Rollback()

Throw New Exception("Error:" & excep.Message & excep.LineNumber.ToString)

Finally

Connection.Close()

End Try

If EsNuevo = True And esautoinc = True Then

RowsUpdated = idclave

End If

Return RowsUpdated

End Function

End Class 'DataAccessBase



"Jesús López" escribió en el mensaje
news:%
> Seguramente la clave primaria sea autonumérica y no se lee de la base de
> datos para actualizarla en el cliente. O puede que la tabla tenga un campo
> timestamp y no se refresque en el cliente.
>
> Saludos:
>
> Jesús López
> MVP
>
> "Juan Melas" escribió en el mensaje
> news:%
>> Estoy probando una aplicación de capas y me encuentro con el siguiente
>> problema, inserto un registro en la base de datos y lo guardo
>> perfectamente, si intento modificarlo en la misma pantalla me da error de
>> concuerrencia, si vuelvo a cargar el registro ahora si lo puedo guardar
>> sin problemas.
>>
>
>



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