[ Mikelly @ 06.06.2009. 09:53 ] @
Baza ima tri tabele, i evo f-je koja radi update iz aplikacije u bazu: Code: public void Save() { using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope()) { TaxDataSet.ObvezniciDataTable odt; TaxDataSet.KontaDataTable kdt; TaxDataSet.DataDataTable ddt; try { /*odt = (TaxDataSet.ObvezniciDataTable)this.taxDataSet.Obveznici.GetChanges(DataRowState.Deleted); ddt = (TaxDataSet.DataDataTable)this.taxDataSet.Data.GetChanges(DataRowState.Deleted); kdt = (TaxDataSet.KontaDataTable)this.taxDataSet.Konta.GetChanges(DataRowState.Deleted); if (ddt != null) this.dataTableAdapter.Update(ddt); if (kdt != null) this.kontaTableAdapter.Update(kdt); if (odt != null) this.obvezniciTableAdapter.Update(odt); ddt = (TaxDataSet.DataDataTable)this.taxDataSet.Data.GetChanges(DataRowState.Added); kdt = (TaxDataSet.KontaDataTable)this.taxDataSet.Konta.GetChanges(DataRowState.Added); odt = (TaxDataSet.ObvezniciDataTable)this.taxDataSet.Obveznici.GetChanges(DataRowState.Added); if (odt != null) this.obvezniciTableAdapter.Update(odt); if (kdt != null) this.kontaTableAdapter.Update(kdt); if (ddt != null) this.dataTableAdapter.Update(ddt); ddt = (TaxDataSet.DataDataTable)this.taxDataSet.Data.GetChanges(DataRowState.Modified); kdt = (TaxDataSet.KontaDataTable)this.taxDataSet.Konta.GetChanges(DataRowState.Modified); odt = (TaxDataSet.ObvezniciDataTable)this.taxDataSet.Obveznici.GetChanges(DataRowState.Modified); if (odt != null) this.obvezniciTableAdapter.Update(odt); if (kdt != null) this.kontaTableAdapter.Update(kdt); if (ddt != null) this.dataTableAdapter.Update(ddt);*/ this.obvezniciTableAdapter.Update(this.taxDataSet.Obveznici); this.kontaTableAdapter.Update(this.taxDataSet.Konta); this.dataTableAdapter.Update(this.taxDataSet.Data); this.taxDataSet.AcceptChanges(); ts.Complete(); } catch (DBConcurrencyException e) { //MessageBox.Show("Greska prilikom upisa u bazu!", "Greska", MessageBoxButtons.OK); MessageBox.Show(e.Message); this.taxDataSet.RejectChanges(); } finally { } } } Po prvi put koristim TransactionScope za transakcije, ali sam "stuck with it" jer table adapteri ne podrzavaju klasicne transakcije. Evo problema: Prvi poziv funkcije save() u kodu, proci ce bez problema, ali ce prva sledeca komunikacija sa bazom, recimo poziv fill metode nekog od tableadaptera, izazvati sledecu gresku: "MSDTC on Server VILLAIN\SQLEXPRESS is unavailable". Da li nekako ta transakcija ostaje otvorena (i pored ts.Complete() u kodu i zatvaranja u using blok) pa fill pokusava preko nje da komunicira sa bazom, ili je nesto sasvim drugo, pojma nemam. Ako neko ima iskustva sa TransactionScope i MSDTC molio bih pomoc. I jos jedna stvar, nevezana za MSDTC, tice se update metoda table adaptera. U prvom dijelu gornje funkcije vrsim update fine rezolucije (prvo deleted, pa added, pa modified redove, sve skolski), ali poslije poziva update metoda za added redove ne dobijem nazad u aplikaciju novi kljuc (ostaje mi -1), iako sve prodje do baze, i tamo, naravno, dobijem ispravan kljuc. Nasuprot tome, ako pozovem prosti update nad citavom tabelom, bez razdvajanja na razlicite vrste redova, DOBICU taj kljuc nazad u aplikaciju. Ne moram ni da pominjem da mi taj kljuc jako treba. Naravno, ako ga ne dobijem automatski, svakako ima nacina da ga nadjem, ali mi to bas ne izgleda elegantno, radije bih bez dodatnog rada. Mozda samo propustam neku sitnicu, ne znam... Pozdrav i hvala. |