Inquiridor
Transaction

Pergunta
-
Galera estou precisando resolver um problemão, mas eu nao tenho muita afinidade com transaction.
Bom meu cenario é o seguinte!
Tenho um enorme cadastro em um unico formulario em ASP.NET,
esse formulario esta divido em quatro area: usuario, dados pessoais, endereço, contato.
para cada area eu tenho uma classe com seu respectivos metodos: ou seja por ex a classe usuario com seu metodos insert, delete, update e select.
O que eu gostaria de fazer é criar uma transação para esse formulario, pois eu quero que quando acontecer algum erro ou problemas externos no momento do cadastro, não quero q seja efetivado os cadastro q foram feito ate o momento do problema.
mas como fazer isso se tenho classes distintas para cada area do cadastro?
ou seja no final de tudo eu clicar no botao (finalizar) e o mesmo dar um comit em tudo ou um rollback se não for aprovado ou ocorrer um erro.
Ficon no aguardo
Fabio
Todas as Respostas
-
bool IsConsistent = false;
using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())
{
SqlConnection cn = newSqlConnection(CONNECTION_STRING );
string sql = "DELETE Categories";
SqlCommand cmd = newSqlCommand(sql, cn);
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
//Based on this property the transaction will commit if
//successful. If it fails however, this property will
//not be set and the transaction will not commit.
ts.Consistent = IsConsistent;
}
bool IsConsistent = false;
using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())
{
SqlConnection cn = newSqlConnection(CONNECTION_STRING );
string sql = "DELETE Categories";
SqlCommand cmd = newSqlCommand(sql, cn);
cn.Open();
try
{
cmd.ExecuteNonQuery();
IsConsistent = true;
}
catch (SqlException ex)
{
//You can specify additional error handling here
}
cn.Close();
//Again, since this was set to false originally it will only
//commit if it worked.
ts.Consistent = IsConsitent;
}
bool IsConsistent = false;
using (TransactionScope ts = newTransactionScope())
{
using (SqlConnection cn = newSqlConnection(YUKON_CONNECTION_STRING))
{
string sql = "DELETE Products";
SqlCommand cmd = newSqlCommand(sql, cn);
cn.Open();
try
{
cmd.ExecuteNonQuery();
using(SqlConnection cnn = newSqlConnection(CONNECTION_STRING))
{
string sql_2 = "DELETE Categories";
SqlCommand cmd2 = newSqlCommand(sql_2, cnn);
cnn.Open();
cmd.ExecuteNonQuery();
cnn.Close();
}
IsConsistent = true;
}
catch (SqlException ex)
{
//You can specify additional error handling here
}
cn.Close();
}
ts.Consistent = IsConsistent;
}
privatebool OldSchool()
{
bool IsConsistent = false;
ICommittableTransaction oldSchoolTrans = Transaction.Create();
using (SqlConnection cn = newSqlConnection(CONNECTION_STRING))
{
string sql = "DELETE Categories";
SqlCommand cmd = newSqlCommand(sql, cn);
cn.Open();
cn.EnlistTransaction((ITransaction)oldSchoolTrans);
try
{
cmd.ExecuteNonQuery();
IsConsistent = true;
returntrue;
}
catch (SqlException ex)
{
//You can specify additional error handling here
//This is where you’d rollback your transaction
return (ex.ToString().Length < 1);
}
cn.Close();
}
}
da uma olhada nesse link tb http://www.macoratti.net/adn_tran.htm
Boa sorte!!
-
Ola Fabio,
A solução poderia ser utilizar, ou melhor, envolver o bloco sujeito a falhas dentro do TransactionScope como você já deve saber.
Uma saída poderia ser utilizar o atributo Transaction da diretiva @Page, como é mostrado aqui: http://samples.gotdotnet.com/quickstart/aspplus/doc/mtstransactions.aspx -
-
-