[ vortex77 @ 23.05.2012. 09:36 ] @

Sta je potrebno uraditi da bi se promenjeni podaci "refreshovali" kod svih korisnika u visekorisnickoj aplikaciji?

Naime, za pristup MySQL bazi koristim MySQLConnector .NET i radim sa TableAdapter-ima (koristeci Fill za inicijalno popunjavanje). Pristup podacima i njihovo azuriranje radi korektno, ali problem je u visekorisnickom radu. Svi podaci koji se preuzmu "stoje" u lokalu i korisnici ne mogu videti promene u bazi u "real time-u", tako da je potrebno odraditi sinhronizaciju lokalnih podataka sa bazom.
Najociglednije resenje bi bilo ponovno pozivanje Fill-a, ali to je upravo ono sto zelim da izbegnem jer neke tabele imaju i preko 20k redova.

Da pojasnim, navescu jedan primer :

Aplikacija ima jedan dataGrid koji je popunjava na Window_Loaded i dugme za snimanje promena u bazu. Recimo da 2 korisnika (A i B) pokrenu aplikaciju u isto vreme, korisnik A odradi promene i snimi ih u bazu.
Sta je potrebno odraditi da bi korisnik B mogao da vidi novo nastale promene bez ponovnog pozivanja Fill-a?


Hvala
[ ravni @ 24.05.2012. 06:58 ] @
Bilo je vec slicnih pitanja, probaj da prelistas malo forume.

Uglavnom, jedna ideja je da imas kolonu sa verzijom recorda i onda dovlacis samo promenjene recorde, a to je jeftino.
[ vortex77 @ 24.05.2012. 07:53 ] @
S'obzirom da sam clan poodavno vec mi je navika da postujem samo ako ne nadjem odgovor medju postojecim temama, ali hvala za predlog.

Sto se tice menjanja strukture baze, to bih naravno gledao da izbegnem ako je moguce
[ ravni @ 24.05.2012. 16:54 ] @
Drugi problem ti je kada ces prozvati Fill.
Znaci kako jedna radna stanica da sazna da na serveru ima novih podataka. Ako to budes resio na neki nacin, mozda ce ti se i prvi deo problema resiti bez novih kolona.
[ vortex77 @ 25.05.2012. 08:22 ] @
Ok... nakon nekoliko sati trazenja po msdn-u uspeo sam da dobijem ono sto sam trazio

Ako jos neko bude imao slicnih problema, ovde moze naci resenje (delimicno).

Ideja je da se svaka tabela alteruje dodavanjem timestamp kolone radi pracenja poslednje promene u tabeli.
Kod u c# koji hendla refresh bazira se na kreiranju run-time TableAdapter-a i DataTable-a koji se popunjavaju samo slogovima koji su promenjeni od poslednjeg ucitavanja podataka sa komandom Fill.

Code:

 private void RefreshData()
        {
            dynamic row = ((DataRowView)(this.cvsMaster.View.CurrentItem)).Row;

            string MyConString = "SERVER=server_ip;" +
                                         "DATABASE=database_name;" +
                                         "UID=user;" +
                                         "PASSWORD=password;";

           
            string sql = "SELECT ID, NAZIV, TIME FROM MASTER WHERE TIME > '" + vreme + "'";
        
            using (MySqlConnection connection = new MySqlConnection(MyConString))
            {
                connection.Open();
                using (MySqlCommand cmdSel = new MySqlCommand(sql, connection))
                {
                    DataTable dt = new DataTable();
                    MySqlDataAdapter da = new MySqlDataAdapter(cmdSel);
                    da.Fill(dt);

                    ds.MASTER.Merge(dt, false);
                    cvsMaster.View.Refresh();
                    
                    vreme = now_TA.GetNow();
                }
                connection.Close();
            }
        }


Konkretna promena vrednosti se radi pozivom komande Merge

Napomena - promenjiva vreme "cuva" vreme servera u momentu poziva Fill-a, a puni se preko :
Code:

SELECT CAST( now() as CHAR) as NOW;   //zbog konvertovanja datuma u VS izgledalo je jednostavnije 
                                          // da se vreme vrati kao string



Ovo resenje radi za sve INSERT, UPDATE akcije na tabeli, ali problem ostaje za DELETE. Ako neko ima ideju kako ovaj primer moze da se modifikuje da bi obuhvatio i DELETE, molim vas da postujete.


[ ravni @ 25.05.2012. 12:33 ] @
Imas dve mogucnosti:
- da uvedes kolonu DELETED tipa bool pa da brises redove tako sto ces u nju upisati true i voditi racuna o tome pri kasnijim SELECTima
- da uvedes tabelu DELETED_ROWS koja ce imati kolone TABLE_NAME, ID, DELETED_AT u koju upisujes id rekorda koji obrises i vreme kada se to desilo pa je posle propitujes slicno kao sto si pitao za izmenjene redove