Automatyczne odświeżanie DataGridView przy wykryciu zmian w tabeli bazy danych

0

Hej! Jak optymalnie zrobić automatyczne odświeżanie DataGridView, kiedy zajdzie jakaś zmiana w bazie danych SQL (Oracle). Łączę się za pomocą ODBC.
Generalnie sprawa wygląda tak:
Pracuje np. 3 użytkowników równocześnie na 3 aplikacjach.
Jedna robi zmianę w tabeli, no i zapisuję zmiany. Odświeża się wtedy DataGridView. No i wtedy u 2 pozostałych osób powinien się odświeżyć DataGridView.
Wiem, że jest klasa SqlDepedency:
https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldependency(v=vs.110).aspx
ale nie wiem czy to ta się "zgrać" z Oracle i ODBC.
Generalnie aplikacja tak jest zbudowana, że w gridzie jest 4 kolumny, po kliknięciu w wiersz na podstawie ID kolumny obok w etykietkach wyświetlane są dane w etykietkach (pobieram ID z kolumy w datagridview i na podstawie tego ID są wykonywane odpowiednie funkcje w bazie danych i wyświetlane dane na etykietkach).
Z tym nie ma problemu, natomiast jest problem jak odświeżyć automatycznie Grida (te 4 kolumny).
Może przy co jakiś czas odczytywać timerem jakiś znacznik czy coś zostało zmienione przez użytkownika w tej tabeli i wtedy będzie odświeżenie... No nie wiem...
Wiem, że w przypadku MS SQL i DataSet to nie było by chyba problemów, ale jak z ODBC i Oraclem?

0

Optymalnie będzie jak zrobisz serwer dla tych aplikacji i będziesz przesyłał powiadomienia np. SignalR. MSSql jest dobrze zintegrowany z .NET bo obie technologie mają jednego właściciela dlatego takie bajery są ale według mnie odpytywanie bazy w celu rejestracji zmiany stanu nie jest często spotykaną praktyką.

2

zastanów się bardzo dobrze czy chcesz taką funkcjonalność wprowadzać. Z doświadczenia wiem, że jest to dla użytkowników bardziej upierdliwe niż pomocne.

Jeśli już to zrób jakiś znacznik, który będzie np, migał jak się nowe dane pojawią i przycisk Odśwież

0

Poczytaj o czymś co nazywa się SignalR. Tak działają np czaty na stronach Web. SignalR nasluchuje bazę i w czasie rzeczywistym pobiera nowe dane z bazy

0

@abrakadaber: dobrze mówi, lepiej zrobić odświeżanie na żądanie. Jak się coś będzie samo przerysowywało, to będzie to dość męczące dla użytkownika, coś sobie robi na swoich danych, a tu mu cały czas migają odświeżane pola, które ktoś inny zedytował.

0

Zrobiłem odświeżenie na żądanie (czyli zwykły klasyczny guzik odśwież) ale w tle chodzi jeszcze timer, który sprawdza datę ostatniej aktualizacji w programie z dodatkową tabelą gdzie jest informacja o ostatniej zmianie w bazie (konkretnie tu chodzi o jedną tabelę, którą modyfikują różne procedury i funkcje w bazie danych).
Jeśli data ostatniej aktualizacji danych w programie jest starsza niż ostatniej modyfikacji w tabeli to wtedy dodatkowo pojawia się informacja, że należy odświeżyć dane.

1

Po pierwsze nie śledź bazy danych bo i po co.
Robiłem podobne rozwiązania przy wsparciu RabbitMQ. W momencie zapisu do bazy, użytkownik rozgłasza z pomocą rabbita że dokonał zmiany w bazie. Końcówki i pozostałych użytkowników odbierają komunikat i po przetworzeniu podejmowana jest jakaś akcja (monit, pobranie danych z zaktualizowanej bazy etc). Definiując kilka typów komunikatów możesz subskrybować się na określone akcje (insert, update, delete nawet select).

0

Witam,

Do małych tabel możesz użyć https://tabledependency.codeplex.com/

Pozdrawiam,

mr-owl

0

Dziękuję ;)

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