Rollback o commit: gestione corretta nell'iterare alcuni elementi

sabato 18 novembre 2006 - 00.55

squilibrio Profilo | Expert

Ciao, sto cercando di utilizzare il commit e rollback durante un'operazione di salvataggio
che itera degli elementi, dopo una serie di prove sono arrivato ad una versione semifunzionante
ma ottengo questo errore:


Server Error in '/' Application.
--------------------------------------------------------------------------------

This SqlTransaction has completed; it is no longer usable.

in questa posizione

catch (Exception exc)
{
lblDebug.Text = exc.Message;
transaction.Rollback();
}

dove sbaglio nella gestione della transazione?

Non so nemmeno se la mia soluzione è corretta (dal punto di vista del controllo di eventuali errori), io vorrei fare in modo che in caso i eventuali errori in fase di salvataggio, l'operazione non venga interrotta con solo alcuni elementi salvati; dovrà quindi essere effettuata solo se tutti gli elementi iterati vengono salvati


protected void btnConferma_Click(object sender, EventArgs e)
{
GridView gv;
DropDownList ddlVal;
DropDownList ddlApp;
string idRiga;
string idCom;

dbconn.Open();
SqlTransaction transaction = dbconn.BeginTransaction();

try
{
SqlCommand myCommandDelete = new SqlCommand("SchedaValutazione_Delete", dbconn, transaction);
myCommandDelete.CommandType = CommandType.StoredProcedure;
myCommandDelete.Parameters.Add(new SqlParameter("@Data", Data));
...
myCommandDelete.ExecuteNonQuery();

foreach (RepeaterItem item in rpt1.Items)
{
gv = (GridView)item.FindControl("grd1");
foreach (GridViewRow gr in gv.Rows)
{
idRiga = ((TextBox)gr.Cells[1].FindControl("tbIDRiga")).Text;
idCom = ((TextBox)gr.Cells[1].FindControl("tbidCom")).Text;
ddlVal = (DropDownList)gr.Cells[1].FindControl("ddlVal");
ddlApp = (DropDownList)gr.Cells[2].FindControl("ddlApp");

//Nuovo inserimento
if (New.ToString() == "OK")
{
SqlCommand myCommand = new SqlCommand("SchedaValutazione_Insert", dbconn, transaction);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.Add(new SqlParameter("@Data", Data));
....
myCommand.ExecuteNonQuery();
transaction.Commit();
}

//Oppure modifica
if (New.ToString() == "NO")
{
SqlCommand myCommand = new SqlCommand("SchedaValutazione_Insert", dbconn, transaction);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.Add(new SqlParameter("@Data", Data));
...
myCommand.ExecuteNonQuery();
transaction.Commit();
}

lblDebug.Text = "Salvatao";
}
}

if (Session["Approvazione"].ToString() == "OK")
{
//Viene aggioranto lo stato della vecchia scheda di valutazione (da N ad A)
SqlCommand myCommandUpdateStato = new SqlCommand("SchedaValutazioneUpdateStato_Update", dbconn);
myCommandUpdateStato.CommandType = CommandType.StoredProcedure;
myCommandUpdateStato.Parameters.Add(new SqlParameter("@Data", Data));
....
dbconn.Open();
myCommandUpdateStato.ExecuteNonQuery();
dbconn.Close();
}


Response.Redirect(linkFigureElenco);
}
catch (Exception exc)
{
lblDebug.Text = exc.Message;
transaction.Rollback();
}
finally
{
dbconn.Close();
}
}


Grazie per l'aiuto
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5