Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/11/2012, 23:43
AprendizDesarrollad
 
Fecha de Ingreso: noviembre-2012
Mensajes: 2
Antigüedad: 11 años, 5 meses
Puntos: 0
Insertar registros en bloque o lotes en distintas tablas con procedimientos almacenad

Cordial Saludo.

La verdad es que no se si la pregunta que voy a hacer es sencilla o complicada, he navegado por muchos foros buscando información acerca de mi caso y la verdad es que parece que a nadie en este mundo se le ha presentado mi situación porque todos dan respuestas de como usar procedimientos almacenados pero insertando un solo registro a la vez y yo necesito una inserción en bloque o en lote en distintas tablas
Estoy haciendo una aplicación visual basic.net, la aplicación se conecta a una base de datos de sql server 2008 r2 y necesito insertar varios registros a distintas tablas a través de procedimientos almacenados pero controlados por transacciones. les explico mas a fondo.
Tengo una tabla de clientes, una tabla ventas, una tabla productos vendidos

la relación de las tablas es la siguiente

clientes --- ventas (a través del campo IdCliente)

ventas --- productos vendidos(a través del campo IdVenta)

el problema consiste en que si un cliente NUEVO realiza una compra de 250 distintos productos entonces la lógica debería ser así

1. Inserto el registro del nuevo cliente en la tabla clientes

2.Inserto el registro de la compra en la tabla ventas

3. inserto los 250 distintos productos que el cliente compro en la tabla productos vendidos

tengo un datatable en memoria con los 250 distintos productos comprados por el cliente, listos para ser guaradados en la tabla productos vendidos

antes tenia una función que me ejecutaba un arraylist lleno de instrucciones sql y lo controlaba con transacciones, es decir hacia algo parecido a esto

Dim Sentencias as new arraylist

sentencias.add (insert into clientes (campos .....) values (valores...)

sentencias.add (insert into ventas (campos .....) values (valores...)

for i = 0 to datatable.rows.count -1

sentencias.add (insert into productosvendidos (campos ...) values (datatable.rows(i).item("campo"), .....)

next

después que tenia el arraylist lleno, llamaba a una funcion ejecutar que recorria todo el arraylist que le pasaba por valor y ejecutaba cada linea de sentencia sql y las controlaba con una transaccion, o se ejecutaban todas o ninguna.

if ejecutar(sentencias) then

mensaje (Todo correcto)

end if

Pero ahora con procedimientos almacenados no se como, tengo los siguientes procedimientos almacenados

insertarcliente

insertarventa

insertarproductosvendidos

pero como llamo a estos tres procedimientos almacenados y que se ejecuten en bloques y que sean controlados por una transacción desde visual basic, sobre todo cuando inserto los 250 productos en la tabla de productos vendidos, si llega a fallar algo, se deben deshacer todos los registros que hayan sido agregados a las distintas tablas, y no puedo colocar una transacción dentro de los procedimientos almacenados ya que cada vez que los llame van a confirmar la transacción, y si llegar a ocurrir un fallo van a quedar los registros incompletos en las tablas y eso NO DEBE SER ASI. la transacción solo se debe confirmar cuando las 252 lineas de sentencias sql estén ejecutadas y sin errores

Por favor les pido que me ayuden, la verdad no se que hacer

Gracias