Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[RESENO] adapter.Update() u transakciji???

[es] :: .NET :: [RESENO] adapter.Update() u transakciji???

[ Pregleda: 2515 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

giger
Beograd

Član broj: 31688
Poruke: 172
*.adsl.beotel.net.



Profil

icon [RESENO] adapter.Update() u transakciji???02.06.2007. u 17:30 - pre 204 meseci
U bazi su dve tabele USLUGA i zavisna tabela DRUGAAGREGACIJA... Imam ovaj kod koji radi update vrednosti u bazi, i to radi ali moze se desiti da se USLUGA zapamti, a DRUAAGREGACIJA ne iz ko zna kog razloga i da samo zapamcena USLUGA ostane u bazi. Hocu da ubacim ove promene pod transakciju, ali mi to ne uspeva.


Code:
con = new SqlConnection(@"Integrated Security=SSPI;Persist Security Info... );

con.Open();

SqlDataAdapter adapUSLUGA = new SqlDataAdapter("SELECT * FROM USLUGA", con);
SqlDataAdapter adapDA = new SqlDataAdapter("SELECT * FROM DRUGAAGREGACIJA", con);
                
SqlCommandBuilder commU = new SqlCommandBuilder(adapUSLUGA);
SqlCommandBuilder commDA = new SqlCommandBuilder(adapDA);

adapUSLUGA.Update(dsu.USLUGA);
adapDA.Update(dsu.DRUGAAGREGACIJA);


Da li neko moze da mi pomogne sa ovim?

[Ovu poruku je menjao giger dana 03.06.2007. u 14:56 GMT+1]
 
Odgovor na temu

aleksandarpopov
IT consultant
Senta

Član broj: 57172
Poruke: 484
*.sksyu.net.

Sajt: www.linkedin.com/in/aleks..


Profil

icon Re: adapter.Update() u transakciji???02.06.2007. u 17:49 - pre 204 meseci
Code:

   private static void Demo1() 
   {
      SqlConnection db = new SqlConnection("connstringhere");
      SqlTransaction transaction;

       db.Open();
      

       transaction = db.BeginTransaction();


      try 


      {

          SqlDataAdapter adapUSLUGA = new SqlDataAdapter("SELECT *  FROM USLUGA", db);
          SqlDataAdapter adapDA = new SqlDataAdapter("SELECT * FROM DRUGAAGREGACIJA",           db);
                
           SqlCommandBuilder commU = new SqlCommandBuilder(adapUSLUGA);
            SqlCommandBuilder commDA = new SqlCommandBuilder(adapDA);

            adapUSLUGA.Update(dsu.USLUGA);
            adapDA.Update(dsu.DRUGAAGREGACIJA);


            transaction.Commit();
            dsu.AcceptChanges();
      } 


      catch (SqlException sqlError) 
      {
            transaction.Rollback();
      }
      db.Close();
   }


[Shadowed: dodati [code] tagovi.]

[Ovu poruku je menjao Shadowed dana 02.06.2007. u 19:18 GMT+1]

[Ovu poruku je menjao aleksandarpopov dana 02.06.2007. u 19:25 GMT+1]
RTFM
 
Odgovor na temu

giger
Beograd

Član broj: 31688
Poruke: 172
*.adsl.beotel.net.



Profil

icon Re: adapter.Update() u transakciji???02.06.2007. u 17:57 - pre 204 meseci
Probao sam ja to ranije. Nece.

na: adapUSLUGA.Update(dsu.USLUGA);

mi izbaci: Execute requires the command to have a transaction object when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized.

A, isto dobijem i kada ubacim sledece linije ispod CommandBuilder-a.

Code:
adapUSLUGA.UpdateCommand = new SqlCommand();
adapUSLUGA.UpdateCommand.Transaction = transUSLUGA;
 
Odgovor na temu

giger
Beograd

Član broj: 31688
Poruke: 172
*.adsl.beotel.net.



Profil

icon Re: adapter.Update() u transakciji???02.06.2007. u 18:20 - pre 204 meseci
Na ovaj kod dobijam istu gresku:

Code:
con.Open();

SqlTransaction transUSLUGA = con.BeginTransaction();
SqlDataAdapter adapUSLUGA = new SqlDataAdapter("SELECT * FROM USLUGA", con);

SqlCommandBuilder commU = new SqlCommandBuilder(adapUSLUGA);

adapUSLUGA.InsertCommand = commU.GetInsertCommand(); <=== [b]Ovde izbacuje istu gresku...[/b]

adapUSLUGA.InsertCommand.Transaction = transUSLUGA;
 
Odgovor na temu

giger
Beograd

Član broj: 31688
Poruke: 172
*.adsl.beotel.net.



Profil

icon Re: adapter.Update() u transakciji???03.06.2007. u 13:55 - pre 204 meseci
RESENJE:

Treba ubaciti ove dve linije:

Code:

adapUSLUGA.SelectCommand.Transaction = trans;
adapDA.SelectCommand.Transaction = trans;


ispred ove linije:

Code:

adapUSLUGA.Update(dsu.USLUGA);
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: adapter.Update() u transakciji???03.06.2007. u 14:38 - pre 204 meseci
Citat:
giger: Na ovaj kod dobijam istu gresku:
Code:
adapUSLUGA.InsertCommand = commU.GetInsertCommand(); <=== [b]Ovde izbacuje istu gresku...[/b]

Ja koliko znam command builder u pozadini vec odradjuje ovo, nema potrebe da sam dodeljujes insert command u adapter ako si deklarisao SqlCommandBuilder nad adapterom. Pri prvom insertu generisace se odgovarajuce komande, sto tebi ne odgovara naravno jer moras da ubacis kontekst transakcije. Dakle, moras da pozoves GetXXXCommand da bi se komanda generisala, sto je bio cilj gornjeg primera.

Medjutim, greska koju dobijas je posledica toga sto pokusavas da izvrsis komandu u okviru konekcije koja je pod transakcijom a tvoja komanda nije deo te transkacije. Kao sto se kaze, assumption is the mother of all sc*ewups, tako je ovde greska u analizi to sto podrazumevas da je InsertCommand taj koji puca , zapravo puca SelectCommand. Da bi CommandBuilder napravio update i insert komande, mora da prepeva "SELECT *" u konkretan spisak polja i da bi pribavio tu shemu od SQL servera koristi ono sto mu je na raspolaganju a to je adapter.SelectCommand. Posto je transakcija vec zapoceta na konekciji, pokusaj da se izvrsi selectcommand puca sa gornjom greskom. Resenje? Ili postavi selectcommand.transaction pre command buildera (jednostavnije ali veci pritisak na server posto se otkrivanje sheme obavlja u kontekstu transakcije), ili prvo izvuci sve komande koje ti trebaju pa onda zapocni transakciju i dodeli je svim komandama (kompleksnije ali ne zadrzavas otvorenu transakciju dok razresavas shemu). Takodje proces mora da pokrije sve CRUD komande (insert, update i delete), posto adapter.Update() moze da pozove sve tri u zavisnosti od stanja dataseta koji se pusta na server:

Code:

Primer1, sa select u transakciji:

   private static void Demo1() 
   {
      SqlConnection db = new SqlConnection("connstringhere");
      db.Open();
      SqlTransaction transaction = db.BeginTransaction();

      try 
      {
          SqlDataAdapter adapUSLUGA = new SqlDataAdapter("SELECT * FROM USLUGA", db);
          SqlDataAdapter adapDA = new SqlDataAdapter("SELECT * FROM DRUGAAGREGACIJA",  db);

          adapUSLUGA.SelectCommand.Transaction = transaction;
          adapDA.SelectCommand.Transaction = transaction;
                
          SqlCommandBuilder commU = new SqlCommandBuilder(adapUSLUGA);
          SqlCommandBuilder commDA = new SqlCommandBuilder(adapDA);

          commU.GetInsertCommand().Transaction = transaction;
          commU.GetUpdateCommand().Transaction = transaction;
          commU.GetDeleteCommand().Transaction = transaction;
          commDA.GetInsertCommand().Transaction = transaction;
          commDA.GetUpdateCommand().Transaction = transaction;
          commDA.GetDeleteCommand().Transaction = transaction;

          adapUSLUGA.Update(dsu.USLUGA);
          adapDA.Update(dsu.DRUGAAGREGACIJA);

          transaction.Commit();
          dsu.AcceptChanges();
      } 
      catch (SqlException sqlError) 
      {
            transaction.Rollback();
      }
      db.Close();
   }


Code:

Primer2, sa transakcijom van "otkrivanja" sheme

   private static void Demo1() 
   {
      SqlConnection db = new SqlConnection("connstringhere");
      db.Open();
      SqlTransaction transaction;

      try 
      {
          SqlDataAdapter adapUSLUGA = new SqlDataAdapter("SELECT * FROM USLUGA", db);
          SqlDataAdapter adapDA = new SqlDataAdapter("SELECT * FROM DRUGAAGREGACIJA",  db);
                
          SqlCommandBuilder commU = new SqlCommandBuilder(adapUSLUGA);
          SqlCommandBuilder commDA = new SqlCommandBuilder(adapDA);

          commU.GetInsertCommand();
          commU.GetUpdateCommand();
          commU.GetDeleteCommand();
          commDA.GetInsertCommand();
          commDA.GetUpdateCommand();
          commDA.GetDeleteCommand();

          transaction = db.BeginTransaction();
          adapUSLUGA.SelectCommand.Transaction = transaction;
          adapUSLUGA.InsertCommand.Transaction = transaction;
          adapUSLUGA.UpdateCommand.Transaction = transaction;
          adapUSLUGA.DeleteCommand.Transaction = transaction;
          adapDA.SelectCommand.Transaction = transaction;
          adapDA.InsertCommand.Transaction = transaction;
          adapDA.UpdateCommand.Transaction = transaction;
          adapDA.DeleteCommand.Transaction = transaction;

          adapUSLUGA.Update(dsu.USLUGA);
          adapDA.Update(dsu.DRUGAAGREGACIJA);

          transaction.Commit();
          dsu.AcceptChanges();
      } 
      catch (SqlException sqlError) 
      {
            transaction.Rollback();
      }
      db.Close();
   }


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

giger
Beograd

Član broj: 31688
Poruke: 172
*.adsl.beotel.net.



Profil

icon Re: [RESENO] adapter.Update() u transakciji???03.06.2007. u 14:45 - pre 204 meseci
Citat:
Kao sto se kaze, assumption is the mother of all sc*ewups, tako je ovde greska u analizi to sto podrazumevas da je InsertCommand taj koji puca , zapravo puca SelectCommand.


Upravo ovo. Sve vreme mi je fokus bio na Insert komandi.

Hvala mmix-u i aleksandru na odgovorima i na vremenu.

Pozdrav!
 
Odgovor na temu

giger
Beograd

Član broj: 31688
Poruke: 172
*.adsl.beotel.net.



Profil

icon Re: [RESENO] adapter.Update() u transakciji???03.06.2007. u 15:01 - pre 204 meseci
mmix imam jos jedno pitanje za tebe. Zadrzimo se na prvom primeru.

Da li su mi stvarno potrebne ove komande i sta tacno rade.

Code:

 commU.GetInsertCommand().Transaction = transaction;
 commU.GetUpdateCommand().Transaction = transaction;
 commU.GetDeleteCommand().Transaction = transaction;
 commDA.GetInsertCommand().Transaction = transaction;
 commDA.GetUpdateCommand().Transaction = transaction;
 commDA.GetDeleteCommand().Transaction = transaction;



Mozda ne kapiram dobro sta rade ili mozda ne kapiram sta radi adapter.Update(); posto u mom kodu radi sve dobro i bez ovih 6 komandi za dva adaptera, posto kad pozovem:

Code:

adapUSLUGA.Update(dsu.USLUGA);
adapDA.Update(dsu.DRUGAAGREGACIJA);


...sve radi ok. Mozda Update method postavi sve tzv. "pending" komande u istu transakciju, pod kojom je i prethodna SELECT, pa ove dodatne i nisu potrebne. (?)
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: [RESENO] adapter.Update() u transakciji???04.06.2007. u 13:45 - pre 204 meseci
U pravu si, tih 6 linija je visak. CommandBuilder ne preuzima samo SqlConnection instancu, preuzima i Transaction od select komande, sto tebi treba, ali isto tako unistava ovih 6 komandi nakon sto zavrsi posao a zapamti koja je transakcija bila (ovo je bezveze), tako da efektivno pokvari dataadapter (ako ponovo pokusas da kreiras novu transakciju i iskoristis isti adapter, puci ce).



Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

[es] :: .NET :: [RESENO] adapter.Update() u transakciji???

[ Pregleda: 2515 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.