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ć