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

update dve tabele istovremeno

[es] :: .NET :: update dve tabele istovremeno

Strane: 1 2

[ Pregleda: 4174 | Odgovora: 30 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

DjoleReject
Djordje Knezevic
Zvezdara

Član broj: 85258
Poruke: 309
*.dynamic.sbb.rs.



+1 Profil

icon Re: update dve tabele istovremeno30.06.2009. u 10:28 - pre 179 meseci
Citat:
pl4stik:
btw nema tu pravog i najboljeg nacina svaki je dobar ako korektno radi poso ali osnove kao sto je crud MORASH da znas

Pa da sam znao, onda ova tema ne bi ni postojala, jel?

...hvala za linkove
De si Deda...
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
*.crnagora.net.



Profil

icon Re: update dve tabele istovremeno30.06.2009. u 12:08 - pre 179 meseci
Aj da pretpostavimo da imas sqlserver instaliran, onda skini management studio sa linka koji ti je pl4astik dao, instaliraj ga i restoruj bazu. I da ti posaljem mdf fajl to ne bi proradilo pukim kopiranjem.

Mada mi je nejasno kako ti ta tvoja trenutna baza fukcionise, ako nemas management studio. Napisi mi putanju do tvoje mdf baze?

Ili prosto probaj varijante sa 'foreign key contraint' u tvojoj aplikaciji, nemas 5 minuta posla sve ukupno.

Pozdrav.
 
Odgovor na temu

DjoleReject
Djordje Knezevic
Zvezdara

Član broj: 85258
Poruke: 309
*.dynamic.sbb.rs.



+1 Profil

icon Re: update dve tabele istovremeno30.06.2009. u 13:20 - pre 179 meseci
Citat:
Mikelly: To moras iz SQL Servera.

Napravi novu bazu koja se zove Test, pa onda opcija restore nad tom bazom, onda nadji from device, pa izaberes bak fajl koji sam ti poslao, i to je to.

Ovo je baza sa SQL Express 2005, ako imas SQL 2000 nece ici.

edit: sredio. Javljam se kad napravim ovo da radi.


Citat:
Mikelly: Aj da pretpostavimo da imas sqlserver instaliran, onda skini management studio sa linka koji ti je pl4astik dao, instaliraj ga i restoruj bazu. I da ti posaljem mdf fajl to ne bi proradilo pukim kopiranjem.

Mada mi je nejasno kako ti ta tvoja trenutna baza fukcionise, ako nemas management studio. Napisi mi putanju do tvoje mdf baze?

Ili prosto probaj varijante sa 'foreign key contraint' u tvojoj aplikaciji, nemas 5 minuta posla sve ukupno.

Pozdrav.


Ja sam se do sada povezivao s bazom tako sto odem u Add New Data Source u VS i dodam bazu (mdf fajl). Samu bazu nisam radio ja, pa nisam ni imao potrebe za bavljenje njome.
Foreign Key constraint koliko ja vidim ima opciju da bude aktivan sve vreme ili ne, ali menjanjem tih parametara nisam dobijao nikakvu razliku u ponasanju.
Ukoliko sam sve pogresno uradio, dajte pricajte, jer nemam bas iskustva s ovim i otvoren sam za sve predloge.

Hvala na cimanju

[Ovu poruku je menjao DjoleReject dana 30.06.2009. u 15:20 GMT+1]

[Ovu poruku je menjao DjoleReject dana 30.06.2009. u 15:36 GMT+1]
De si Deda...
 
Odgovor na temu

DjoleReject
Djordje Knezevic
Zvezdara

Član broj: 85258
Poruke: 309
*.dynamic.sbb.rs.



+1 Profil

icon Re: update dve tabele istovremeno30.06.2009. u 17:50 - pre 179 meseci
@Mikelly:
Radi ovo tvoje bas kako treba. Kad se klikne, slave dobije ID mastera kako je i zamisljeno.
Moja baza, s druge strane, se ponasa isto, ali samo kad master prikazujem u DataGridView. ListBox pravi probleme, izgleda, jer u slucaju da master tabelu prikazujem preko ListBox-a (sto moram) nista se ne desava kad kliknem na dugme koje poziva ovaj tvoj save() bez obzira da li je "Relation only" ili sva tri "Cascade" .

Pada mi na pamet da ja mozda ne radim dobro dodavanje novog elementa (master). Ja to radim pomocu masterBindingSource.AddNew(); a posle toga samo dodajem vrednosti na tako dobijen element. da li je to OK?

P. S. Hvala puno za sve ovo do sad.


edit:
Da, problem je bio u dodavanju novog master elementa. Ovo je nacin na koji sve radi kako treba:
Code:

DataRow newRow = mojDataSet.Master.NewRow();
mojDataSet.Master.Rows.Add(newRow);


...dok je ovo onacin na koji ne radi sve kako treba:
Code:

MasterBindingSource.AddNew();


Eto...
Hvala jos jednom svima koji su se cimali, posebno Mikellyu.

[Ovu poruku je menjao DjoleReject dana 30.06.2009. u 20:31 GMT+1]
De si Deda...
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
79.143.100.*



Profil

icon Re: update dve tabele istovremeno30.06.2009. u 22:24 - pre 179 meseci
Ja prosto ne mogu da vjerujem koliko je ovaj ADO.NET pun nekih 'caka'!!!

Gledaj, ono sto sam ti poslao radi, ali samo do odredjene mjere. Kada update-ujes added zapise master tabele, sa referencijalnim integritetom podesenim na cascade, povezani slave zapisi ce u foreignkey polju dobiti vrijednost primarnog kljuca aktivnog master zapisa, sto je ono sto ti trazis od pocetka.

Ali pazi sad! Kada odmah nakon update-a master zapisa odradis update slave zapisa, kojima si frisko podesio foreignkey na ispravnu vrijednost, ti slave zapisi nece otici do baze. Probaj, vidjeces.

Naime, Framework ce, nakon sto 'izvrsi' referecijalni integritet nad slave zapisima, podesiti DataRowState svojstvo tih slave zapisa na 'Unchanged'. ZASTO???

Kako to pravi probleme?

Pa, kada tableadapter radi Update on za svaki red ponasob na osnovu DataRowState svojstva generise po jednu komandu. Za 'Added' redove se generise INSERT komanda, za 'Modified' redove se generise 'UPDATE' komanda, za 'Deleted' redove se generise DELETE komanda, a 'Unchanged' redovi se NE RAZMATRAJU.

Dakle, posto odradimo update master zapisa (koji su prije update-a 'Added'), povezani slave zapisi ce promijeniti stanje sa 'Added' na 'Unchanged', i Framework NECE NI POKUSATI DA IH POSALJE BAZI!!! Sve ovo vazi SAMO ako je referencijalni integritet podesen na 'Cascade'. A ako nije, tek je onda muka.

Ne mogu da vjerujem da ovo do sada nisam znao!!!

Onda se mora naci nacin da nekako te sirocice posaljemo bazi. Nije mi jasno zasto uopste mijenjaju DataRowState svojstva redova nakon sprovodjenja referencijalnog integriteta. Medjutim, DataRow klasa ima metod SetAdded() koji se moze izvrsiti, zamislite, samo nad redom cije je stanje 'Unchanged'. Nagrdili pa popravili :)

Znaci, izmedju update-ovanja master i slave redova treba sve slave redove koji su bili 'Added' pa postali 'Unchanged' ponovo postaviti na 'Added' pomocu SetAdded() metode:

Code:

private void save1()
{
    DataRow[] rows;
    DataRow[] AddedMasterRows;
    DataRow[] AddedSlaveRows;

    rows = testDataSet.Slave.Select(null, null, DataViewRowState.Deleted);
    if (rows != null) this.slaveTableAdapter.Update(rows);

    rows = testDataSet.Master.Select(null, null, DataViewRowState.Deleted);
    if (rows != null) this.masterTableAdapter.Update(rows);

    AddedMasterRows = testDataSet.Master.Select(null, null, DataViewRowState.Added);
    AddedSlaveRows = testDataSet.Slave.Select(null, null, DataViewRowState.Added);

    if (AddedMasterRows != null) this.masterTableAdapter.Update(AddedMasterRows);
    if (AddedSlaveRows != null)
    {
        foreach (TestDataSet.SlaveRow sr in testDataSet.Slave) if(sr.RowState == DataRowState.Unchanged) sr.SetAdded();
        this.slaveTableAdapter.Update(AddedSlaveRows);
    }

    rows = testDataSet.Master.Select(null, null, DataViewRowState.ModifiedCurrent);
    if (rows != null) this.masterTableAdapter.Update(rows);

    rows = testDataSet.Slave.Select(null, null, DataViewRowState.ModifiedCurrent);
    if (rows != null) this.slaveTableAdapter.Update(rows);
}


Ovo mi je pravilo probleme u proslosti, a da nisam ni znao...

Imas u attachmentu ispravljenu verziju ako te interesuje.

Pozdrav.

PS. Ne znam kako ti, ali ja sam zadovoljan rjesenjem tvog problema ;)


Prikačeni fajlovi
 
Odgovor na temu

DjoleReject
Djordje Knezevic
Zvezdara

Član broj: 85258
Poruke: 309
*.dynamic.sbb.rs.



+1 Profil

icon Re: update dve tabele istovremeno01.07.2009. u 00:19 - pre 179 meseci
Citat:
Mikelly: Ja prosto ne mogu da vjerujem koliko je ovaj ADO.NET pun nekih 'caka'!!!

Ja sam prilicno nov u tome i mogu samo reci da me iznenadjuje kako su neke stvari automatizovane do savrsenstva, a za neke druge, po mom misljenju veoma ceste i standardne, treba da se otelis.


Citat:
Mikelly:
Imas u attachmentu ispravljenu verziju ako te interesuje.

Pozdrav.

PS. Ne znam kako ti, ali ja sam zadovoljan rjesenjem tvog problema ;)


- Naravno da me interesuje :)
- I ja sam itekako zadovoljan resenjem. Doduse, na svakom koraku zapinjem oko gluposti, pa ne mogu jos da se u celosti divim eleganciji i lepoti ovog resenja, ali jasno je da je razlika izmedju ovoga sto si uradio ti i onoga sto sam imao neuporediva :)

Fala!

edit: Ovaj drugi kod radi ko zmaj. Mada, ko zna da li bih ja provalio i onaj prvi da ne radi kako je zamisljeno :)

[Ovu poruku je menjao DjoleReject dana 01.07.2009. u 02:11 GMT+1]
De si Deda...
 
Odgovor na temu

DjoleReject
Djordje Knezevic
Zvezdara

Član broj: 85258
Poruke: 309
*.dynamic.sbb.rs.



+1 Profil

icon Re: update dve tabele istovremeno01.07.2009. u 12:47 - pre 179 meseci
Uf uf uf!

Lepo je zvucalo, ali...
Ako promenis sve Unchanged u Added u Slave tabeli, onda dolazi do problema kad kliknes drugi put na "Save". Pojavi se sledeca greska:
Code:
 System.Data.SqlClient.SqlException: Cannot insert duplicate key row in object 'dbo.ent_ElementByInstrument' with unique index 



Ako ja dobro razumem, stvar je u tome sto ovaj predstavi nepromenjene redove kao nove, a zatim pokusa da ih sacuva, na sta se baza pobuni jer vec ima redove sa tim kljucem (iste te).

Sta cemo sad? :0
De si Deda...
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
79.143.100.*



Profil

icon Re: update dve tabele istovremeno01.07.2009. u 16:19 - pre 179 meseci
Hmmm. Kod mene sve radi...

Aj' postuj kod tvoje Save() funkcije.

Jer ne mijenjam ja sve 'Unchanged' u 'Added' u Slave tabeli, vec samo one koji su izvorno bili 'Added' a koje je referencijalni integritet, iz nekog razloga, podesio na 'Unchanged'.

Kad se ti 'Added' zapisi update-uju, Framework poziva AcceptChanges za svaki od njih, podesavajuci ih time na 'Unchanged', pa nece biti njihovog ponovnog slanja u bazu.

Naravno, zadrzavam pravo da mozda grijesim.

Postuj Save().
 
Odgovor na temu

DjoleReject
Djordje Knezevic
Zvezdara

Član broj: 85258
Poruke: 309
*.dynamic.sbb.rs.



+1 Profil

icon Re: update dve tabele istovremeno01.07.2009. u 17:15 - pre 179 meseci
Evo moj Save. ali to je prepisan tvoj save, samo sa drukcijim imenima tabela (ent_Elemet == Master, ent_ElementByInstrument == Slave)

Code:

private void save() {
            this.Validate();
            ent_ElementBindingSource.EndEdit();
            ent_ElementByInstrumentBindingSource.EndEdit();

            DataRow[] rows;
            DataRow[] addedElemRows;
            DataRow[] addedElemByInsRows;

            //=============================Delete=============================//
            rows = apolloDataSet.ent_ElementByInstrument.Select(null, null, DataViewRowState.Deleted);
            if(rows != null) { this.ent_ElementByInstrumentTableAdapter.Update(rows); }

            rows = apolloDataSet.ent_Element.Select(null, null, DataViewRowState.Deleted);
            if(rows != null) { this.ent_ElementTableAdapter.Update(rows); }

            //=============================Add New=============================//
            addedElemRows = apolloDataSet.ent_Element.Select(null, null, DataViewRowState.Added);
            addedElemByInsRows = apolloDataSet.ent_ElementByInstrument.Select(null, null, DataViewRowState.Added);

            if(addedElemRows != null) { this.ent_ElementTableAdapter.Update(addedElemRows); }

            if(addedElemByInsRows != null) {
                foreach(ApolloDataSet.ent_ElementByInstrumentRow sr in apolloDataSet.ent_ElementByInstrument)
                    if(sr.RowState == DataRowState.Unchanged)
                        sr.SetAdded();
                this.ent_ElementByInstrumentTableAdapter.Update(addedElemByInsRows);
            }
            
            //==============================Update=============================//
            rows = apolloDataSet.ent_Element.Select(null, null, DataViewRowState.ModifiedCurrent);
            if(rows != null) { this.ent_ElementTableAdapter.Update(rows); }

            rows = apolloDataSet.ent_ElementByInstrument.Select(null, null, DataViewRowState.ModifiedCurrent);
            if(rows != null) { this.ent_ElementByInstrumentTableAdapter.Update(rows); }
        }



Ali zar nije ovo menjanje svih Unchanged u Added: if(sr.RowState == DataRowState.Unchanged) sr.SetAdded(); ???
De si Deda...
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
79.143.100.*



Profil

icon Re: update dve tabele istovremeno01.07.2009. u 18:15 - pre 179 meseci
Probaj da umjesto:

Code:

foreach(ApolloDataSet.ent_ElementByInstrumentRow sr in apolloDataSet.ent_ElementByInstrument)


stavis:

Code:

foreach(ApolloDataSet.ent_ElementByInstrumentRow sr in addedElemByInsRows)


Javi da li radi...
 
Odgovor na temu

DjoleReject
Djordje Knezevic
Zvezdara

Član broj: 85258
Poruke: 309
*.dynamic.sbb.rs.



+1 Profil

icon Re: update dve tabele istovremeno01.07.2009. u 20:06 - pre 179 meseci
Naravno da radi - zato sto ti, za razliku od mene, nisi slep :)

Puno ti hvala! Bas, bas!
De si Deda...
 
Odgovor na temu

[es] :: .NET :: update dve tabele istovremeno

Strane: 1 2

[ Pregleda: 4174 | Odgovora: 30 ] > FB > Twit

Postavi temu Odgovori

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