[ Dacex @ 29.09.2011. 10:33 ] @
Poštovane kolege,

Posle dugo vremena polako sam se privikao na .net okruženje, prešao sam sa vb6 na visualstudio 2008 problem mi prave baze. Radim konekciju sa access bazom (2003 ver) i povezujem je preko bindingsource sa programom. Koristim datagrid za prikaz podataka i textboxova za njihovu izmenu. Problem mi pravi "save" opcija, jer nekada dobro snimi , a nekada mi izbacuje grešku "Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.". Kod koji koristim za čuvanje je sledeći
Code:
 Me.Validate()
        TblMainBindingSource.EndEdit()
        TblMainDataGridView.EndEdit()
        TblMainBindingSource.MoveFirst()

        TableAdapterManager.TblMainTableAdapter.Update(Me.Base_localDataSet)
        MsgBox("Uspešno sačuvano!", MsgBoxStyle.Information)
        Exit Sub

Probao sam svakakve načine , ali problem se opet pojavljuje. Nekada sve ok radi, a nekada ne. Da li je problem u bazi, kodu ili vs ?

Zahvaljujem puno unapred na svakom odgovoru!

[ AMD guy @ 29.09.2011. 14:57 ] @
Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.

Pretpostavljam da je problem u bazi, posto se ova greska desava kada hoces da update-ujes row u bazi koji ne postoji.

This is simply because DataSet (or ADO.Net rather) uses Optimistic Concurrency by default.
This means that when updating, the whole row (rather than the changed column only) is used for comparison with the data in the database.
This then means that if you are trying to update a row that no longer exists in the database, the update from the DataAdapter the update will fail with the exception above.


Typical scenarios when this may happen is that you get your data into the disconnected DataSet, you do some work on it and then try the update.
However, between you selecting the data into the client and sending the update, another user is deleting this row from his application.
Or it can be that you are deleting the data from somewhere else in your application.
[ Dacex @ 29.09.2011. 15:52 ] @
Hvala vam na odgovoru!, koje je rešenje za problem ? da probam sa accessom 2007? ili nešto drugo.. ?
[ ravni @ 29.09.2011. 23:01 ] @
kanda nisi pazljivo procitao prethodni post. rekord se nekako promeni u medjuvremenu.
druga baza ne bi nista resila. mozes, recimo, da uhvatis tu gresku, osvezis podatke u datagridu i zamolis korisnika da opet unese podatke
[ AMD guy @ 30.09.2011. 13:25 ] @
Preporucio bih autoru teme da pocne da uci LINQ
[ Predrag Supurovic @ 30.09.2011. 16:27 ] @
Kakve veze LINQ ima sa ovim problemom leba ti?
[ Shadowed @ 30.09.2011. 16:50 ] @
Citat:
ravni: kanda nisi pazljivo procitao prethodni post. rekord se nekako promeni u medjuvremenu.
druga baza ne bi nista resila. mozes, recimo, da uhvatis tu gresku, osvezis podatke u datagridu i zamolis korisnika da opet unese podatke

Upravo, samo ne bi valjalo da trazi od korisnika da ponovo unosi podatke. Moze da pre snimanja proveri da li taj record postoji i ako postoji onda radi update a ako ne postoji obavesti korisnika o tome i pita ga da li hoce da kreira nov (ili, ako to odgovara, jednostavno odmah kreira novi ako je prethodni obrisan).
[ AMD guy @ 30.09.2011. 19:08 ] @
@Predrag Sa ovim problemom nikakve, ovo je samo preporuka. I ja sam tek poceo da ucim LINQ, olaksava mi neke stvari.
[ ravni @ 01.10.2011. 21:54 ] @
Citat:
Shadowed: Upravo, samo ne bi valjalo da trazi od korisnika da ponovo unosi podatke. Moze da pre snimanja proveri da li taj record postoji i ako postoji onda radi update...
Pa da, ali zar time ne bi pregazio tudje izmene koje su uzrok problema?
[ pl4stik @ 03.10.2011. 15:09 ] @
Preporucio bih ti da koristish TypedDatSet-ove pa tu checkiraj use optimistic concurrency ...

Ne mogu sad da se setim ACC2003 ali za npr. SQL Compact 3.5+ skoro sam siguran da imash exclusive lock tako da ako krenes u update taj record je zakljucan za sve druge korisnike...

Jel to jednu bazu koristi vise korisnika?