ADO.NET Problem z konfliktem Id

0

Witam.
Jestem w trakcie pisania aplikacji wykorzystującej ADO.NET. Pobiera ona część danych z serwera z bazy MySQL i operuje na nich na stworzonej w aplikacji bazie lokalnej, wszystko cyklicznie co jakiś czas updatuje na serwer. Wszystko niby ładnie pięknie, ale jak chcę odpalić drugą aplikację równolegle to pojawia się poważny problem konfliktu ID w bazie. Spowodowane jest to tym że w bazie tymczasowej jest Autoincrement przy dodawaniu nowych rekordów. I zawsze dwie aplikacje dojdą do momentu że będą wykorzystywały ten sam ID. Jeśli chciałbym dodawać rekordy do bazy nie korzystając z ID(czyli ID przydzielane z automatu w bazie) to będzie problem z update i delete, bo ID będą się różniły w bazie tymczasowej i w tej na serwerze.
Myślałem że można zrobić jakąś funkcję w bazie która po dodaniu ID z automatu będzie zwracała ID rekordu w bazie, no a funkcja z aplikacji podmienia ten ID w bazie tymczasowej. Ale nie wiem czy to jest do zrobienia. Bo to trzeba by chyba zmienić wbudowaną funkcję TableAdapter.Update(DataTable).
Macie jakieś pomysły może nawet jak to inaczej rozwiązać??

0

DataAdapter ma takie własności jak InsertCommand, UpdateCommand, DeleteCommand ... Napisz własne.

0
adf88 napisał(a)

DataAdapter ma takie własności jak InsertCommand, UpdateCommand, DeleteCommand ... Napisz własne.

Można w jakiś sposób edytować te własności? Bo wątpię żeby to było takie proste do napisania od nowa.

Proszę o jakieś podpowiedzi bo mam znikome pojęcie o tym.

0

Możesz użyć zamiast int, typu uniqueidentifier (w bazie danych), w C# jest to Guid.

Każdy nowo wygenerowany Guid będzie unikatowy.

// dopisane: uniqueidentifier nie występuje chyba w MySQL .. wtedy można zmienić na odpowiednik tekstowy o stałej długości

0

To rozwiązanie jest całkiem dobre, pomimo nawet tego że możliwy jest konflikt (z bardzo małym prawdopodobieństwem, ale jednak jest).
Jednak ja kierowałbym się ku jakiemuś innemu rozwiązaniu, bo tutaj muszę ingerować w strukturę bazy, z tym mogę mieć problemy bo nie tylko ja z tej samej bazy korzystam :-/

Macie jakieś inne propozycje?

0

pomimo nawet tego że możliwy jest konflikt (z bardzo małym prawdopodobieństwem, ale jednak jest).

Nie rozumiem .. o jakim konflikcie mówisz?

0

Mój błąd, źle to sformułowałem.
Chciałem tylko zauważyć to że istnieje możliwość wylosowania takich samych wartości Guid. Jest to oczywiście "prawie" nie możliwe, ale zawsze jest to "prawie".

Rozwiązanie jest dobre tylko problemem jest to że musiałbym dokonać zmiany w strukturze bazy, a tego nie chcę. Dlatego zapytałem się o inne pomysły, bo podejrzewam że to nie jest jedyne rozwiązanie mojego problemu

0

Mój błąd, źle to sformułowałem.
Chciałem tylko zauważyć to że istnieje możliwość wylosowania takich samych wartości Guid. Jest to oczywiście "prawie" nie możliwe, ale zawsze jest to "prawie".

Hmm, jeszcze się nie zdarzyło ;-)

0

ale moze sie zdarzyc, nie dzis to jutro albo za rok.

hmm w sumie to dziwny problem - nie wiem jak wyglada Twoj kod i w sumie nie uzywalem TableAdapter ale w przypadku uzycia DataAdapter (dokladnie MysqlDataAdapter dla mysql) metoda update zawsze zwracala mi do tabeli wartosc pola id wygenerowanego w bazie.

0
kabu napisał(a)

ale moze sie zdarzyc, nie dzis to jutro albo za rok.

Ilosc unikalnych GUIDow to 2128, na kazda gwiazde w znanym nam wszechswiecie przypada ich po 6.8×1015. Reszta na angielskiej wikipedii.

W projekcie, w ktorym biore udzial od 5 lat sie to nie zdarzylo, a generowanych danych jest spooooro :)

Co do glownego problemu. Nie pamietam czy jest odpowiednik guida w mysqlu, ale guid jest tak naprawde liczba 16-bajtowa. Prawdopodobnie wystarczy zmienic inta na biginta i odpowiednio wpisywac te juz unikalne klucze.

0

ale moze sie zdarzyc, nie dzis to jutro albo za rok.

Jaaaaasne, serwery wielkich korporacji używają tego typu, ale nie programiści 4p wierząc, że trafią się 2 te same Guid'y [rotfl]

0

i wezcie jeszcze pod uwage, ze GUIDy generuje sie tez od dawna dla obiektow com, dla assmbliow .netowych, i dla calej masy roznych rzeczy.. zdarzyla sie kolizja? wygeneruj sobie nowy.. przesuniecie w czasie o pare tickow wystarczy zeby guid byl inny

1 użytkowników online, w tym zalogowanych: 0, gości: 1