[ cesare @ 26.12.2011. 12:51 ] @
Pozdrav svima !!!

Napravio sam zasebnu klasu u programu koja izvrsava upite u MySQL bazi i vraca dataset sa podacima. Kod izvrsavanja upita ide ovako:

Code:

try
{
    MySqlConnection Conn = new MySqlConnection(ovde su podaci za ConnectionString);
    Podaci.Tables.Clear(); // 'Podaci' je dataset definisan na nivou cele MySQL klase
    Conn.Open();
    MySqlTransaction Transakcija = Conn.BeginTransaction();
    foreach (string Upit in ListaUpita) // Lista upita je tekstualna lista upita koji trebaju da se izvrse redosledom u listi
    {
         switch (Upit.StartsWith("SELECT"))
         {
               case true:
                     //ovde ide popunjavanje dataseta Podaci preko MySQLAdapter-a
               break; 
               case false:
                     //ovde izvrsavanje azuriranja (INSERT ili UPDATE)
               break;
         }
    }
    Transakcija.Commit();
    Conn.Close();
}
catch (Exception ex)
{
     ovde ide hvatanje ex.Message u javnu tekstualnu promenljivu
}
ListaUpita.Clear();


Problem nastaje kada dodje do greske u izvrsavanju nekog od upita (najcesce azuriranja INSERT ili UPDATE). Tada se ponovnim prosledjivanjem liste upita i pokusaje izvrsenja istih javlja greska 'Nested transactions are not supported'. Googlao sam, ali nisam uspeo da nadjem resenje. Ima li ko predloga za ovo ?

Unapred hvala ...
[ vujkev @ 26.12.2011. 23:45 ] @
moraš da napraviš try/catch za svaki upit ka bazi (ili jedan
globalno). Ukoliko dođe do greške trebaš da odradiš rollback
transakcije
[ nikitaGradov @ 28.12.2011. 09:13 ] @
Pokusaj ovako:

Code:

try
{
    MySqlConnection Conn = new MySqlConnection(ovde su podaci za ConnectionString);
    Podaci.Tables.Clear(); // 'Podaci' je dataset definisan na nivou cele MySQL klase
    Conn.Open();
    MySqlTransaction Transakcija = Conn.BeginTransaction();
    foreach (string Upit in ListaUpita) // Lista upita je tekstualna lista upita koji trebaju da se izvrse redosledom u listi
    {
         switch (Upit.StartsWith("SELECT"))
         {
               case true:
                     //ovde ide popunjavanje dataseta Podaci preko MySQLAdapter-a
               break; 
               case false:
                     //ovde izvrsavanje azuriranja (INSERT ili UPDATE)
               break;
         }
    }
    Transakcija.Commit();
    Conn.Close();
}
catch (Exception ex)
{
   Transakcija.RollBack();
   // ovde ide hvatanje ex.Message u javnu tekstualnu promenljivu
   // mozes da se vratis sa return
   return NEUSPJESAN_INSERT_UPDATE; // vratis neku vrijednost (recimo, indeks iz ListaUpita, da znas gdje je transakcija 'pukla'), na osnovu koje izvrsavas neku akciju u pozivajucem metodu 
}
finally
{
   // ovdje mozes da 'pocistis za sobom'
   ListaUpita.Clear();
}
// iz ove tacke vratis vrijednost o uspjesno izvrsenoj transakciji
  return USPJESAN_INSERT_UPDATE;