Você está na página 1de 6

Transacciones

Utilizando la base de datos del Northwind, vamos a trabajar con 3 tablas, que son Order,[orders details] y products !l proceso es el si"uiente vamos a crear una orden, lue"o capturamos el id de la orden "enerada, y la ane#amos en los re"istros que vamos a crear en su tabla detalle de la orden, pero antes veri$icaremos que e#ista stoc% en los 3 productos de la orden Nota & para este ejemplo trabajaremoc con los 'roductos (,) y3 en $orma de$initiva *ealizar +entencia en el +,- +erver & .on las tablas Orders, Order/d y 'roducts 0ueno empezamos haciendo el si"uiente $ormulario1

+i te nos damos cuenta el c2di"o del cliente lo hemos puesto en $orma de$initiva 3eclaremos los si"uientes Namespace /mports +ystem 3ata /mports +ystem 3ata +ql.lient 4hora declaremos las si"uientes variables "lobales 53eclaracion de variables 6lobales 3im cn 4s New +ql.onnection78server9 :3atabase9Northwind:inte"rated security9true:8; 3im com 4s +ql.ommand 3im Trans 4s +qlTransaction 4hora realizaremos la pro"ramaci2n de la transacci2n en el bot2n 6rabar 'edido Try 54brir la cone#ion cn Open7; 5/niciar la Transaccion Trans 9 cn 0e"inTransaction 5/nstancia el Objeto +ql.ommand com 9 New +ql.ommand 54si"nar la cone#ion al objeto sqlcommand com .onnection 9 cn 54si"nar la Transaccion al comando com Transaction 9 Trans 54"re"ar re"istro a la tabla order com .ommandTe#t 9 8/nsert /nto orders7.ustomer/d,Order3ate,*equireddate; 8 < = 8 >alues754-?@/5,"etdate7;,dateadd7d,(A,6etdate7;;;8 5!jecutamos el comando com !#ecuteNon,uery7; 5*ecuperar el /3 del pedido a"re"ado a la sentencia 4nterior com .ommandTe#t 9 8+elect BBidentity ?rom Orders8 3im 'edidoNro 4s +trin" 9 com !#ecute+calar7; To+trin"7; 5/nsertar re"istros a la tabla Order3etails para los prod (,) y3 5producto ( com .ommandTe#t 9 8/nsert /nto [order details]7Order/d,'roduct/d,Unit'rice,,uantity;8 < = 8 values 78 < 'edidoNro < 8,(,(C,8 < ./nt7t#tc( Te#t; < 8;8 com !#ecuteNon,uery7; 5producto ) com .ommandTe#t 9 8/nsert /nto [order details]7Order/d,'roduct/d,Unit'rice,,uantity;8 < = 8 values 78 < 'edidoNro < 8,),(D,8 < ./nt7t#tc) Te#t; < 8;8 com !#ecuteNon,uery7; 5producto 3 com .ommandTe#t 9 8/nsert /nto [order details]7Order/d,'roduct/d,Unit'rice,,uantity;8 < =

43O Net 3 E

'F"ina (

8 values 78 < 'edidoNro < 8,3,)(,8 < ./nt7t#tc3 Te#t; < 8;8 com !#ecuteNon,uery7; 54veri"uar el stoc% de cada producto 5'roducto ( com .ommandTe#t 9 8+elect Units/n+toc% $rom 'roducts where 'roduct/d9(8 3im stoc% 4s /nte"er 9 com !#ecute+calar /$ stoc% G ./nt7t#tc( Te#t; Then Trans *ollbac%7; 1 Hs"0o#78-a cantd 3isponible e#cede al stoc% del producto (8; !#it +ub !nd /$ 5'roducto ) com .ommandTe#t 9 8+elect Units/n+toc% $rom 'roducts where 'roduct/d9)8 stoc% 9 com !#ecute+calar /$ stoc% G ./nt7t#tc) Te#t; Then Trans *ollbac%7; 1 Hs"0o#78-a cantd 3isponible e#cede al stoc% del producto )8; !#it +ub !nd /$ 5'roducto 3 com .ommandTe#t 9 8+elect Units/n+toc% $rom 'roducts where 'roduct/d938 stoc% 9 com !#ecute+calar /$ stoc% G ./nt7t#tc3 Te#t; Then Trans *ollbac%7; 1 Hs"0o#78-a cantd 3isponible e#cede al stoc% del producto 38; !#it +ub !nd /$ 56rabacion de la Transaccion Trans .ommit7; 5Hostrar mensaje de !#ito Hs"0o#78!l pedido "enerado ha sido 8 < 'edidoNro; .atch e# 4s !#ception Hs"0o#7e# Hessa"e; ?inally cn .lose7; !nd Try !nd +ub

43O Net 3 E

'F"ina )

!jemplo ) I Transacciones 4hora vamos a crear una base de datos llamada !jemplo y una tabla de nombre 'ersona que tiene los si"uientes campos .reate 3ata0ase !jemplo 6o Use ejemplo 6o .reate table 'ersona 7 .odi"o varchar7(J;, Nombres varchar7EJ;, +ueldo int, !stado varchar7(; ; >amos a desarrollar un $ormulario el cual va a tener ) botones, uno de ellos trabajara con transacciones al momento de insertar y el otro trabajara sin transacciones , el $ormulario quedara de la si"uiente manera1

!n un $ormulario que posee un bot2n escribimos lo si"uiente en el evento clic del bot2n, /mportemos los namespace /mports +ystem 3ata /mports +ystem 3ata +ql.lient1 4hora dentro del 0ot2n btnNoTransacciones, realicemos la si"uiente codi$icaci2n1 'rivate +ub btnNoTransacciones=.lic%70y>al sender 4s +ystem Object, 0y>al e 4s +ystem !vent4r"s; Kandles btnNoTransacciones .lic% 3im .n 4s New +ql.onnection783ata +ource9 :/nitial .atalo"9!L!H'-O:/nte"rated security9true:8; 54brimos la .one#ion .n Open7; Try 3im cmd 4s New +ql.ommand78/N+!*T /NTO '!*+ON4 7codi"o, nombres, sueldo, estado; >alues75L6(5,5LO+!5,)JJ,545;8, .n; cmd !#ecuteNon,uery7; 5!jecutando la sentencia +,cmd 9 New +ql.ommand78/N+!*T /NTO '!*+ON4 7codi"o, nombres, sueldo, estado; >alues75L6)5,5-U/+5,(CJ,505;8, .n; cmd !#ecuteNon,uery7; 5!jecutando la sentencia +,cmd 9 New +ql.ommand78/N+!*T /NTO '!*+ON4 7codi"o, nombres, sueldo, estado; >alues75L635,5'!3*O5,AJJ,545;8, .n; cmd !#ecuteNon,uery7; 5!jecutando la sentencia +,.atch e# 4s !#ception Hs"0o#7e# Hessa"e; !nd Try 5.erramos la cone#ion .n .lose7; Hs"0o#783atos /n"resados .orrectamente8; !nd +ub

43O Net 3 E

'F"ina 3

.omo vemos aMadiremos en la tabla 'ersona 3 re"istro, pero si quisiNramos convertirle a transacci2n para que se ejecuten todos o nin"uno si encuentra un error deberOamos hacer lo si"uiente ?Ojese en los datos para el campo c2di"o pues ahora son tr(, tr) y tr3 'rivate +ub btn+iTransaaccion=.lic%70y>al sender 4s +ystem Object, 0y>al e 4s +ystem !vent4r"s; Kandles btn+iTransaaccion .lic% 3im .n 4s New +ql.onnection783ata +ource9 :/nitial .atalo"9!L!H'-O:/nte"rated +ecurity9true:8; .n Open7; 53eclarando la variable Transaccion 3im myTrans 4s +qlTransaction 3im .md 4s +ql.ommand 5/niciando la Transaccion myTrans 9 .n 0e"inTransaction7; Try .md 9 New +ql.ommand78/N+!*T /NTO '!*+ON4 7codi"o, nombres, sueldo, estado; >alues75tr(5,5LO+!5,)JJ,545;8, .n; .md Transaction 9 myTrans .md !#ecuteNon,uery7; .md 9 New +ql.ommand78/N+!*T /NTO '!*+ON4 7codi"o, nombres, sueldo, estado; >alues75tr)5,5-U/+5,(CJ,505;8, .n; .md Transaction 9 myTrans .md !#ecuteNon,uery7; .md 9 New +ql.ommand78/N+!*T /NTO '!*+ON4 7codi"o, nombres, sueldo, estado; >alues75tr35,5'!3*O5,AJJ,545;8, .n; .md Transaction 9 myTrans .md !#ecuteNon,uery7; 56rabando la Transaccion myTrans .ommit7; Hs"0o#783atos /n"resados .orrectamente8; .atch e# 4s !#ception 5!n caso de que e#ista un error al momento de /nsertar la transaccion no se e$ectua myTrans *ollbac%7; Hs"0o#7e# Hessa"e; !nd Try .n .lose7; !nd +ub 4hora al ejecutaremos el bot2n btn+iTransaaccion, el insertarF los nuevos 3 re"istros, pero lo harF usando transacciones para lo cual iniciamos la transacci2n con myTrans 9 .onn 0e"inTransaction7; y $inalizamos con myTrans .ommit7; y en caso de al"Pn error ejecutamos myTrans *ollbac%7; para cancelar todo lo realizado en la transacci2n 'ara comprobar que la transacci2n se cancela al encontrar un error cambiamos los valores del campo c2di"o por tr1 por cs1 y tr2 por cs2, dejando tr3 en el tercer re"istro pues asO darF un error de clave duplicada porque ya e#iste un re"istro con esta clave previamente "rabada 4l ejecutar nos saldrF un mensaje que indica que e#isti2 una violaci2n de primary %ey +i veri$icamos los datos, no habrF nin"Pn re"istro aMadido pues como estF en una transacci2n o se a"re"an todos o no se a"re"a nin"uno

43O Net 3 E

'F"ina A

4hora con 3ata+ets !n un $ormulario tenemos ) botones 6rabar y -eer3atos ademFs de un 3ata6rid asi1

4hora vamos a crear una clase llamada persona que ejecute las dos acciones de los botones, aquO estF el c2di"o1 /mports +ystem 3ata +ql.lient 'ublic .lass 'ersona 'ublic ?unction *ecuperar7; 4s 3ata+et 5de$inimos la coneccion 3im .n 4s New +ql.onnection783ata +ource9 :/nitial .atalo"9!L!H'-O:/nte"rated +ecurity9true:8; 5creamos el data adapter con la instruccion select a recuperar 3im adapter 4s New +ql3ata4dapter78+elect Q $rom '!*+ON48, .n ; 5abrimos la coneccion .n Open7; 5creamos el dataset donde recuperaremos los datos de la base de datos 3im ds 4s New 3ata+et 5recuperamos los datos a travez del adapter adapter ?ill7ds, 8'!*+ON48; 5retornamos los datos *eturn ds !nd ?unction 'ublic +ub 6rabar7 0y>al ds 4s 3ata+et; 5de$inimos la coneccion 3im .n as New +ql.onnection783ata +ource9 :/nitial .atalo"9!L!H'-O: /nte"rated +ecurity9true:8; 5abrimos la coneccion .n Open7; 5creamos el data adapter con la instruccion select a recuperar 3im adapter 4s New +ql3ata4dapter78+elect Q $rom '!*+ON48, .n ; 5.reamos e inicimos la transaccion 3im Tran 4s +qlTransaction 9 .onn 0e"inTransaction 5asi"namos la transaccion al comando +elect del adapter adapter +elect.ommand Transaction 9 Tran 5construimos los demas comandos del adapter 73!-!T!, /N+!*T, U'34T!; 3im R 4s New +ql.ommand0uilder7adapter; Try 54ctualizamos el 3ata+et adapter Update7ds, 8'!*+ON48; 5.on$irmamos la transaccion Tran .ommit7; Hs"0o#783atos "rabados con N#ito8; .atch !# 4s +ql!#ception 3im men 4s +trin" /$ e# Number 9 C(E) Then men 9 8!#isten datos demasiados e#tensos, corrija el problema y vuelva a intentar8 !lse/$ e# Number 9 )S)T Then

43O Net 3 E

'F"ina E

/$ e# Hessa"e /nde#O$78'*/H4*U8; GV I( Then men 9 8!rror por intentar "rabar valores duplicados en campos clave, corrija el problema y vuelva a intentar8 !lse/$ e# Hessa"e /nde#O$78UN/,U!8; GV I( Then men 9 8!rror por intentar "rabar valores duplicados en campos de valores Pnicos, corrija el problema y vuelva a intentar8 !lse men 9 8!rror "eneral en la base de datos8 !nd /$ !lse/$ e# Number 9 E(E Then men 9 84l"unos datos no han sido in"resados y son necesario para completar la operaci2n, corrija el problema y vuelva a intentar8 !lse men 9 8!rror "eneral en la base de datos8 !nd /$ 5cancelamos la transaccion Tran *ollbac%7; 5/ndicamos el mensaje Throw New !#ception7men; .atch !# 4s 30.oncurrency!#ception 5cancelamos la transaccion Tran *ollbac%7; 5/ndicamos el mensaje Throw New !#ception78-o siento, los datos $ueron actualizados por otro usuario8; .atch !# 4s !#ception 5/ndicamos el mensaje Throw New !#ception78!rror1 8 < !R Hessa"e; !nd Try !nd +ub -ue"o en el $ormulario creado con los botones y el "rid escribimos el si"uiente c2di"o 0ot2n -eer 3im dt 4s New 'ersona 6rid 3ata+ource 9 dt *ecuperar 0ot2n 6rabar 3im dt 4s New 'ersona Try dt 6rabar76rid 3ata+ource; 6rid 3ata+ource 9 dt *ecuperar .atch e# 4s !#ception Hs"0o#7e# Hessa"e, Hs"0o#+tyle .ritical; !nd Try !vento -oad=?orm 7.ar"a del $ormulario; 3im dt 4s New 'ersona 6rid 3ata+ource 9 dt *ecuperar 3e esta $orma podemos "rabar y leer los datos del "rid en $orma transaccional, es decir que si por al"Pn motivo e#istiese un error se cancelarFn todas las actualizaciones 4demFs esto nos es bien recomendable cuando e#iste concurrencia de varios usuarios sobre el mismo "rupo de re"istros pues "raba solo los re"istros actualizados del primer usuario que ejecuta el "rabar y para los demFs usuarios no "raba nin"Pn re"istro, que si no se lo hace en $orma transaccional "rabarOa una parte de los re"istros y otros no 'ara esto hay que tomar en cuenta que el manejo de transacciones debe hacerse en capa de re"las de ne"ocio 7nunca en la capa U/ o en la de 3atos;

43O Net 3 E

'F"ina S

Você também pode gostar