Me lio con las transacciones

30/04/2010 - 11:17 por Bartolomé Genovard | Informe spam
Hola,

tengo un proceso 'complejo' y quiero gestionarlo con transacciones,
pero no se como hacerlo. Principalmente tengo el problema que creo
unos registros en una tabla y que como no se su ID, una vez creados
los tengo que volver a leer para tener el ID y poder asignar registros
relacionados, por lo que tengo muchos objetos conexión y tal.

os pongo mi caso muy simplificado y omitiendo mucha cosa que no aporta
nada. gracias

Dim v_HoraGeneracion As DateTime = Now 'hora que
pondremos en todos los registros generados para luego
identificarlos...
Dim v_oConn As New
SqlConnection(Global.ttt.My.Settings.airgestConnectionString)
Dim v_oConn2 As New
SqlConnection(Global.ttt.My.Settings.airgestConnectionString)
Dim v_oConn3 As New
SqlConnection(Global.ttt.My.Settings.airgestConnectionString)
Dim v_cmd As New SqlCommand("", v_oConn)
Dim v_cmd2 As New SqlCommand("", v_oConn)
Dim v_cmd3 As New SqlCommand("", v_oConn)
Dim v_r, v_r3 As SqlDataReader

Dim myTrans, mytrans2, mytrans3,
mytrans4, mytrans5 As SqlTransaction

'Generamos las cabeceras de factura por ejemplo
v_cmd.CommandText = "INSERT t_facturas (campo1,
campo2, campoAux) " & _
" (SELECT campo1, campo7, '" &
FechaHoraSQLServer(v_HoraGeneracion) & "’ FROM t_tabla1 where …”

v_oConn.Open()
myTrans = v_oConn.BeginTransaction() 'marcamos el
inicio de la transaccion.
v_cmd.ExecuteNonQuery()
v_oConn.Close()

'primero buscmaos las facturas que
hemos generado, para tener el ID
v_cmd.CommandText = "SELECT * from t_facturas where
campoaux ='" & FechaHoraSQLServer(v_HoraGeneracion) & "' “
"
v_oConn.Open()
v_r = v_cmd.ExecuteReader

Do While v_r.Read 'para cada factura que hemos
generado antes, metemos sus lineas...
' BEGIN TRANSACTION
'metemos los vuelos.
v_cmd2.CommandText = "INSERT t_lineas (fk_factura,
campo1) (select “ & v_r(“id”) & “ campo1 from t_tabla2)"
v_oConn2.Open()
mytrans2 = v_oConn2.BeginTransaction() 'marcamos
el inicio de la transaccion.
v_cmd2.ExecuteNonQuery()
v_oConn2.Close()

'ahora metemos un detalle sobre las líneas, por lo
que las buscamos para saber su id..
v_cmd3.CommandText = "SELECT bla bla bla”
v_oConn3.Open()
v_r3 = v_cmd3.ExecuteReader

Do While v_r3.Read
'para cada línea metemos mas detalle…
v_cmd2.CommandText = "INSERT t_detalle_linea
( fk_linea, campo1 ) (select '" & v_r3("id_linea") & "', campo1 from
t_tabla3 Where blabla)"
v_oConn2.Open()
mytrans3 = v_oConn3.BeginTransaction()
'marcamos el inicio de la transaccion.
v_cmd2.ExecuteNonQuery()
v_oConn2.Close()
Loop
v_r3.Close() 'cerramos conexiones y demás...
v_oConn.Close()
Loop

v_r.Close() 'cerramos conexiones y demás...

myTrans.Commit() 'fin transacciones
mytrans2.Commit() 'fin transacciones
mytrans3.Commit() 'fin transacciones

v_oConn.Close()
End If
End If

Preguntas similare

Leer las respuestas

#1 Leandro Tuttini
30/04/2010 - 14:33 | Informe spam
hola

segun veo estas usando Sql Server en ese caso usa el

TransactionScope
http://msdn.microsoft.com/es-es/lib...80%29.aspx

lo encieras todo en un bloque using y eso es todo al final ahces el
scope.Complete() y se confirma la transaccion, sino se hace un
rollback de todo lo que la transaccion encierre

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