Problema con System.Transactions para el manejo de transacciones e

23/06/2006 - 18:19 por Guillermo Jimenez | Informe spam
Buenos dias.

De la manera mas cordial solicito me colaboren con el siguiente caso.
Necesito manejar transaccionalidad en una aplicacion, para ello he estado
usando el System.Transactions pero no he tenido resultados satisfactorios. La
idea del codigo que muestro a continuacion es verificar la funcionalidad del
System.Transactions, por lo que abro la conexion con oracle y trato de
cambiar la contraseña a un usuario dos veces donde la primera vez se realiza
correctamente y la segunda no debido a que el usuario no existe por lo que
genera una execpcion y la transaccion deberia hacer rollback pero no lo hace.

A continuacion el codigo usando TransacctionScope y CommittableTransaction

// Usando TransacctionScope
private void Transaccion()
{
using (TransactionScope tran = new TransactionScope())
{
string strConnection = "Data Source=databasename;User
Id=userconnect;Password=passworduserconnect;";
OracleConnection conn = new OracleConnection(strConnection);
conn.Open();

string strQuery = "ALTER USER scott IDENTIFIED BY tiger";
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strQuery;
cmd.ExecuteNonQuery();

// Aqui se debe generar una excepcion pork que usuario no existe y deberia
hacer rollback de la transaccion pero no lo hace
// el ALTER USER anterior no deberia verse reflejado en oracle
strQuery = "ALTER USER scot IDENTIFIED BY tiger";
cmd.CommandText = strQuery;
cmd.ExecuteNonQuery();

tran.Complete();
}
}

// Usando CommittableTransaction
private void Transaccion()
{
CommittableTransaction tx = new CommittableTransaction();
string strConnection = "Data Source=databasename;User
Id=userconnect;Password=passworduserconnect;";
OracleConnection conn = new OracleConnection(strConnection);
conn.Open();

try
{
string strQuery = "ALTER USER scott IDENTIFIED BY tiger";
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strQuery;
cmd.ExecuteNonQuery();

/ Aqui se genera una excepcion debido a que el usuario no existe en oracle
strQuery = "ALTER USER scot IDENTIFIED BY tiger";
cmd.CommandText = strQuery;
cmd.ExecuteNonQuery();

tx.Rollback();
}
catch
{
tx.Rollback();
}
finally
{
conn.Dispose();
}
}

Por favor necesito me colaboren corrigiendome el codigo o dandome otra
posible solucion para el manejo de transacciones en C#.

Muchas gracias por su colaboracion y espero su pronta respuesta debiso a que
es algo urgente que necesito solucionar.
 

Leer las respuestas

#1 Angel. E. Ruiz. P
23/06/2006 - 19:27 | Informe spam
Prueba asi:

private void Transaccion()
{
using (TransactionScope tran = new TransactionScope())
{
string strConnection = "Data Source=databasename;User
Id=userconnect;Password=passworduserconnect;";

OracleConnection conn = new OracleConnection(strConnection);
try{
conn.Open();

string strQuery = "ALTER USER scott IDENTIFIED BY tiger";
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strQuery;
cmd.ExecuteNonQuery();

// Aqui se debe generar una excepcion pork que usuario no existe y deberia
hacer rollback de la transaccion pero no lo hace
// el ALTER USER anterior no deberia verse reflejado en oracle
strQuery = "ALTER USER scot IDENTIFIED BY tiger";
cmd.CommandText = strQuery;
cmd.ExecuteNonQuery();

tran.Complete();
{
finally
{
conn.Close();
}
}
}

// Usando CommittableTransaction
private void Transaccion()
{
CommittableTransaction tx = new CommittableTransaction();
string strConnection = "Data Source=databasename;User
Id=userconnect;Password=passworduserconnect;";
OracleConnection conn = new OracleConnection(strConnection);
conn.Open();

try
{
string strQuery = "ALTER USER scott IDENTIFIED BY tiger";
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strQuery;
cmd.ExecuteNonQuery();

/ Aqui se genera una excepcion debido a que el usuario no existe en oracle
strQuery = "ALTER USER scot IDENTIFIED BY tiger";
cmd.CommandText = strQuery;
cmd.ExecuteNonQuery();


}

finally
{
conn.Close();
}



Saludos cordiales,
Ángel Ruiz
MCP C#
MVP de Visual Basic desde 2004
Caracas - Venezuela
"El conocimiento es un bien, que crece a medida que se comparte"

}
"Guillermo Jimenez" escribió en
el mensaje news:
Buenos dias.

De la manera mas cordial solicito me colaboren con el siguiente caso.
Necesito manejar transaccionalidad en una aplicacion, para ello he estado
usando el System.Transactions pero no he tenido resultados satisfactorios.
La
idea del codigo que muestro a continuacion es verificar la funcionalidad
del
System.Transactions, por lo que abro la conexion con oracle y trato de
cambiar la contraseña a un usuario dos veces donde la primera vez se
realiza
correctamente y la segunda no debido a que el usuario no existe por lo que
genera una execpcion y la transaccion deberia hacer rollback pero no lo
hace.

A continuacion el codigo usando TransacctionScope y CommittableTransaction

// Usando TransacctionScope
private void Transaccion()
{
using (TransactionScope tran = new TransactionScope())
{
string strConnection = "Data Source=databasename;User
Id=userconnect;Password=passworduserconnect;";
OracleConnection conn = new
OracleConnection(strConnection);
conn.Open();

string strQuery = "ALTER USER scott IDENTIFIED BY tiger";
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strQuery;
cmd.ExecuteNonQuery();

// Aqui se debe generar una excepcion pork que usuario no existe y deberia
hacer rollback de la transaccion pero no lo hace
// el ALTER USER anterior no deberia verse reflejado en oracle
strQuery = "ALTER USER scot IDENTIFIED BY tiger";
cmd.CommandText = strQuery;
cmd.ExecuteNonQuery();

tran.Complete();
}
}

// Usando CommittableTransaction
private void Transaccion()
{
CommittableTransaction tx = new CommittableTransaction();
string strConnection = "Data Source=databasename;User
Id=userconnect;Password=passworduserconnect;";
OracleConnection conn = new OracleConnection(strConnection);
conn.Open();

try
{
string strQuery = "ALTER USER scott IDENTIFIED BY tiger";
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strQuery;
cmd.ExecuteNonQuery();

/ Aqui se genera una excepcion debido a que el usuario no existe en oracle
strQuery = "ALTER USER scot IDENTIFIED BY tiger";
cmd.CommandText = strQuery;
cmd.ExecuteNonQuery();

tx.Rollback();
}
catch
{
tx.Rollback();
}
finally
{
conn.Dispose();
}
}

Por favor necesito me colaboren corrigiendome el codigo o dandome otra
posible solucion para el manejo de transacciones en C#.

Muchas gracias por su colaboracion y espero su pronta respuesta debiso a
que
es algo urgente que necesito solucionar.

Preguntas similares