Transacción SQL y C#

17/01/2006 - 18:00 por Matías | Informe spam
tengo la siguiente problemática:

Necesito hacer una transacción en base de datos en que son varios insert y
debo corroborar que se realicen todos, una forma es en un procedimiento
almacenado con Begin Tran . Commit, y se podría hacer así, pero no me
sirve esa solución.

Tengo implementados varias funciones que en c# que llaman a procedimientos
almacenados distintos, la idea que es se sigan llamandos estos procemientos,
pero si falla alguna de las llamadas haga un RollBack, alguien me puede
orientar.

Gracias de antemano.

Preguntas similare

Leer las respuestas

#1 JavierBolivia
17/01/2006 - 18:42 | Informe spam
Hola Matías, efectivamente el .net framework sí brinda una solución a tu
problema: cada conjunto de proveedores de datos tiene un objecto transacción
correspondiente, que se puede crear y usar de la siguiente manera (pongo como
ejemplo el proveedor para Sql, pero la lógica es la misma para Oracle, OleDb,
etc):

SqlConection conexion=new SqlConection(stringConexion);
conexion.Open();
SqlTransaction tran=conexion.BeginTransaction();


tran.Commit(); // en caso de éxito
tran.RollBack(); // en caso de error; típicamente se pone dentro de un catch

conexion.Close();

La restricción principal es que la transacción sólo puede estar asociada a
una única conexión a la base de datos, y ésta debe a su vez debe estar
abierta durante todo el tiempo de vida de la transacción. Esto en tu caso
presenta trabajo adicional, ya que como llamas a procedimientos almacenados
en distintos métodos, tienes a mi juicio dos alternativas:

- Llevar todos las llamadas a proc. alm. dentro de un mismo método y realizar
algo parecido al ejemplo de arriba.
- Abrir una conexión y crear una transacción antes de empezar las llamadas a
los métodos, y pasar ambos objetos por referencia a todos los métodos
respectivos. Al final de todas las llamadas a los métodos, hacer commit o
rollback dependiendo de los resultados y cerrar la conexión.

Espero que te sirva de ayuda. Saludos,

Javier Pelaez
Microsoft MCAD .NET
DCE5 v.2003 - DCE2 v.2005


"Matías" escribió:

tengo la siguiente problemática:

Necesito hacer una transacción en base de datos en que son varios insert y
debo corroborar que se realicen todos, una forma es en un procedimiento
almacenado con Begin Tran . Commit, y se podría hacer así, pero no me
sirve esa solución.

Tengo implementados varias funciones que en c# que llaman a procedimientos
almacenados distintos, la idea que es se sigan llamandos estos procemientos,
pero si falla alguna de las llamadas haga un RollBack, alguien me puede
orientar.

Gracias de antemano.




Respuesta Responder a este mensaje
#2 JavierBolivia
17/01/2006 - 18:42 | Informe spam
Hola Matías, efectivamente el .net framework sí brinda una solución a tu
problema: cada conjunto de proveedores de datos tiene un objecto transacción
correspondiente, que se puede crear y usar de la siguiente manera (pongo como
ejemplo el proveedor para Sql, pero la lógica es la misma para Oracle, OleDb,
etc):

SqlConection conexion=new SqlConection(stringConexion);
conexion.Open();
SqlTransaction tran=conexion.BeginTransaction();


tran.Commit(); // en caso de éxito
tran.RollBack(); // en caso de error; típicamente se pone dentro de un catch

conexion.Close();

La restricción principal es que la transacción sólo puede estar asociada a
una única conexión a la base de datos, y ésta debe a su vez debe estar
abierta durante todo el tiempo de vida de la transacción. Esto en tu caso
presenta trabajo adicional, ya que como llamas a procedimientos almacenados
en distintos métodos, tienes a mi juicio dos alternativas:

- Llevar todos las llamadas a proc. alm. dentro de un mismo método y realizar
algo parecido al ejemplo de arriba.
- Abrir una conexión y crear una transacción antes de empezar las llamadas a
los métodos, y pasar ambos objetos por referencia a todos los métodos
respectivos. Al final de todas las llamadas a los métodos, hacer commit o
rollback dependiendo de los resultados y cerrar la conexión.

Espero que te sirva de ayuda. Saludos,

Javier Pelaez
Microsoft MCAD .NET
DCE5 v.2003 - DCE2 v.2005


"Matías" escribió:

tengo la siguiente problemática:

Necesito hacer una transacción en base de datos en que son varios insert y
debo corroborar que se realicen todos, una forma es en un procedimiento
almacenado con Begin Tran . Commit, y se podría hacer así, pero no me
sirve esa solución.

Tengo implementados varias funciones que en c# que llaman a procedimientos
almacenados distintos, la idea que es se sigan llamandos estos procemientos,
pero si falla alguna de las llamadas haga un RollBack, alguien me puede
orientar.

Gracias de antemano.




Respuesta Responder a este mensaje
#3 Matías
17/01/2006 - 19:22 | Informe spam
Gracias, me quedó clarisimo y me sirvió. :)


"JavierBolivia" escribió en el
mensaje news:
Hola Matías, efectivamente el .net framework sí brinda una solución a tu
problema: cada conjunto de proveedores de datos tiene un objecto
transacción
correspondiente, que se puede crear y usar de la siguiente manera (pongo
como
ejemplo el proveedor para Sql, pero la lógica es la misma para Oracle,
OleDb,
etc):

SqlConection conexion=new SqlConection(stringConexion);
conexion.Open();
SqlTransaction tran=conexion.BeginTransaction();


tran.Commit(); // en caso de éxito
tran.RollBack(); // en caso de error; típicamente se pone dentro de un
catch

conexion.Close();

La restricción principal es que la transacción sólo puede estar asociada a
una única conexión a la base de datos, y ésta debe a su vez debe estar
abierta durante todo el tiempo de vida de la transacción. Esto en tu caso
presenta trabajo adicional, ya que como llamas a procedimientos
almacenados
en distintos métodos, tienes a mi juicio dos alternativas:

- Llevar todos las llamadas a proc. alm. dentro de un mismo método y
realizar
algo parecido al ejemplo de arriba.
- Abrir una conexión y crear una transacción antes de empezar las llamadas
a
los métodos, y pasar ambos objetos por referencia a todos los métodos
respectivos. Al final de todas las llamadas a los métodos, hacer commit
o
rollback dependiendo de los resultados y cerrar la conexión.

Espero que te sirva de ayuda. Saludos,

Javier Pelaez
Microsoft MCAD .NET
DCE5 v.2003 - DCE2 v.2005


"Matías" escribió:

tengo la siguiente problemática:

Necesito hacer una transacción en base de datos en que son varios insert
y
debo corroborar que se realicen todos, una forma es en un procedimiento
almacenado con Begin Tran . Commit, y se podría hacer así, pero no me
sirve esa solución.

Tengo implementados varias funciones que en c# que llaman a
procedimientos
almacenados distintos, la idea que es se sigan llamandos estos
procemientos,
pero si falla alguna de las llamadas haga un RollBack, alguien me puede
orientar.

Gracias de antemano.




Respuesta Responder a este mensaje
#4 Matías
17/01/2006 - 19:22 | Informe spam
Gracias, me quedó clarisimo y me sirvió. :)


"JavierBolivia" escribió en el
mensaje news:
Hola Matías, efectivamente el .net framework sí brinda una solución a tu
problema: cada conjunto de proveedores de datos tiene un objecto
transacción
correspondiente, que se puede crear y usar de la siguiente manera (pongo
como
ejemplo el proveedor para Sql, pero la lógica es la misma para Oracle,
OleDb,
etc):

SqlConection conexion=new SqlConection(stringConexion);
conexion.Open();
SqlTransaction tran=conexion.BeginTransaction();


tran.Commit(); // en caso de éxito
tran.RollBack(); // en caso de error; típicamente se pone dentro de un
catch

conexion.Close();

La restricción principal es que la transacción sólo puede estar asociada a
una única conexión a la base de datos, y ésta debe a su vez debe estar
abierta durante todo el tiempo de vida de la transacción. Esto en tu caso
presenta trabajo adicional, ya que como llamas a procedimientos
almacenados
en distintos métodos, tienes a mi juicio dos alternativas:

- Llevar todos las llamadas a proc. alm. dentro de un mismo método y
realizar
algo parecido al ejemplo de arriba.
- Abrir una conexión y crear una transacción antes de empezar las llamadas
a
los métodos, y pasar ambos objetos por referencia a todos los métodos
respectivos. Al final de todas las llamadas a los métodos, hacer commit
o
rollback dependiendo de los resultados y cerrar la conexión.

Espero que te sirva de ayuda. Saludos,

Javier Pelaez
Microsoft MCAD .NET
DCE5 v.2003 - DCE2 v.2005


"Matías" escribió:

tengo la siguiente problemática:

Necesito hacer una transacción en base de datos en que son varios insert
y
debo corroborar que se realicen todos, una forma es en un procedimiento
almacenado con Begin Tran . Commit, y se podría hacer así, pero no me
sirve esa solución.

Tengo implementados varias funciones que en c# que llaman a
procedimientos
almacenados distintos, la idea que es se sigan llamandos estos
procemientos,
pero si falla alguna de las llamadas haga un RollBack, alguien me puede
orientar.

Gracias de antemano.




Respuesta Responder a este mensaje
#5 Miguel Angel Campos
18/01/2006 - 09:45 | Informe spam
Si utilizas .NET v2.0, es mas recomendable que utilices las clases del
espacio de nombres System.Transactions, ya que te permitirán promover de
forma automática una transacción local a una distribuida si fuera necesario,
en la MSDN viene ejemplos de como utilizar la clase TransactionScope. Pero
te insisto sólo en .NET 2.0

Un Saludo,

Miguel Angel Campos
MCAD.NET

"JavierBolivia" escribió en el
mensaje news:
Hola Matías, efectivamente el .net framework sí brinda una solución a tu
problema: cada conjunto de proveedores de datos tiene un objecto
transacción
correspondiente, que se puede crear y usar de la siguiente manera (pongo
como
ejemplo el proveedor para Sql, pero la lógica es la misma para Oracle,
OleDb,
etc):

SqlConection conexion=new SqlConection(stringConexion);
conexion.Open();
SqlTransaction tran=conexion.BeginTransaction();


tran.Commit(); // en caso de éxito
tran.RollBack(); // en caso de error; típicamente se pone dentro de un
catch

conexion.Close();

La restricción principal es que la transacción sólo puede estar asociada a
una única conexión a la base de datos, y ésta debe a su vez debe estar
abierta durante todo el tiempo de vida de la transacción. Esto en tu caso
presenta trabajo adicional, ya que como llamas a procedimientos
almacenados
en distintos métodos, tienes a mi juicio dos alternativas:

- Llevar todos las llamadas a proc. alm. dentro de un mismo método y
realizar
algo parecido al ejemplo de arriba.
- Abrir una conexión y crear una transacción antes de empezar las llamadas
a
los métodos, y pasar ambos objetos por referencia a todos los métodos
respectivos. Al final de todas las llamadas a los métodos, hacer commit
o
rollback dependiendo de los resultados y cerrar la conexión.

Espero que te sirva de ayuda. Saludos,

Javier Pelaez
Microsoft MCAD .NET
DCE5 v.2003 - DCE2 v.2005


"Matías" escribió:

tengo la siguiente problemática:

Necesito hacer una transacción en base de datos en que son varios insert
y
debo corroborar que se realicen todos, una forma es en un procedimiento
almacenado con Begin Tran . Commit, y se podría hacer así, pero no me
sirve esa solución.

Tengo implementados varias funciones que en c# que llaman a
procedimientos
almacenados distintos, la idea que es se sigan llamandos estos
procemientos,
pero si falla alguna de las llamadas haga un RollBack, alguien me puede
orientar.

Gracias de antemano.




Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida