[C#/MS Sync Framework] Eerste synchronisatie manipuleren

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 25-09 14:56
Hallo medetweakers,

Ik zal even mijn situatie uitleggen:
  • Ik heb een mobile device applicatie die synchroniseert met een centrale database server d.m.v. het Microsoft Sync Framework. De device applicatie maakt gebruik van een local database cache (een lokale "database", die naar het device wordt gekopieerd wanneer ik het project deploy).
  • Wanneer je de local database cache aanmaakt kan je kiezen welke tabellen van de centrale database je wil gebruiken en worden er voor elke tabel twee kolommen aangemaakt met de titel "creationdate" en "updatedate". Deze kolommen worden gebruikt om wijzigingen na de laatste synchronisatie te kunnen herkennen.
  • Ook worden er voor alle tabellen die in de cache zitten incrementalupdate-, incrementalinsert- en deletecommands aangemaakt in een gegenereerde codefile. Hier hoef je als user verder niets voor te doen, dat doet het Sync Framework allemaal automatisch. Deze commands zijn normale queries (zoals iedereen die wel kent binnen .NET) die elke tabel in de local database cache en de centrale database server controleren voor, zoals de namen al zeggen: inserts, updates en deletes. Dat wordt dus gedaan aan de hand van de hierboven genoemde kolommen "creationdate" en "updatedate".
  • De commands die ik hierboven genoemd heb, zijn zelf aan te passen als je gegevens wil filteren. Stel: Je hebt een product tabel waarbij elk product in een bepaalde categorie zit en je wil alleen de producten van een bepaalde categorie synchroniseren (zeg kleding, en kleding heeft categorienummer 1). Dan zou je normaal gesproken een query krijgen in de trend van deze: "SELECT * FROM product WHERE categorie = 1". De commands kunnen ook op deze manier aangepast worden, door een SyncParameter toe te voegen. De query komt er dan zo uit te zien: "SELECT * FROM product WHERE categorie = @categorie". Zo kan dus de synchronisatie op een bepaalde manier "gemanipuleerd" worden door een filter toe te passen en krijg je alleen de records die jij in de database wil hebben.
  • Ik heb een draadje op MSDN geopend, daar reageert vooralsnog niemand op. Ook heb ik al lang zitten googlen op het probleem dat ik hieronder beschrijf, maar niets gevonden wat lijkt op mijn probleem of in de buurt komt van een oplossing hiervoor, dus ik dacht ik open hier even een topic.
Ik hoop dat het bovenstaande voldoende uitgelegd is om mijn situatie te beschrijven. Nu komt mijn eigenlijke probleem naar voren. Mijn probleem is namelijk het volgende: Ik kan nergens het select command aanpassen voor de eerste synchronisatie. Bij de eerste synchronisatie (dus op het moment dat de local database cache nog leeg is) wordt de gehele inhoud van elke tabel gesynchroniseerd en dat is niet wat ik wil. Ik wil namelijk de gegevens filteren. Om even in de trend van de product tabel te blijven, wil ik bijv. alleen de producten van de categorie kleding synchroniseren en niet alle producten. Heeft iemand hier al eens eerder mee te maken gehad? Alvast bedankt voor de hulp!

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Je hebt dezelfde denkfout gemaakt die ik ook had met het Sync Framework. Je filter bepaalt niet welke records uit de database worden getrokken, maar welke gewijzigd mogen worden.

Zoals je waarschijnlijk zelf al had gezien gezien is er geen selectCommand. Er zijn wel selectXXX commands, maar die worden gebruikt bij synchronisatie conflicten. In InitializeAdaptorProperties zie je dan ook dat alleen de tabelnaam wordt gezet.

Op het basis concept van o.a. het Sync Framework, typed dataset en linq 2 sql hebben wij een eigen sync library geschreven waarbij wij ook gedeeltes van tabellen kunnen syncen. Als de client verbinding kan maken met de server, dan is het ook mogelijk records te locken zodat deze niet door andere gebruikers gewijzigd kan worden.

Wij gebruiken de sync library ook meer als een soort caching framework.

Maar wat jij wilt is helaas niet mogelijk met het sync framework.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 25-09 14:56
Niemand_Anders schreef op woensdag 26 november 2008 @ 13:21:
Je hebt dezelfde denkfout gemaakt die ik ook had met het Sync Framework. Je filter bepaalt niet welke records uit de database worden getrokken, maar welke gewijzigd mogen worden.

Zoals je waarschijnlijk zelf al had gezien gezien is er geen selectCommand. Er zijn wel selectXXX commands, maar die worden gebruikt bij synchronisatie conflicten. In InitializeAdaptorProperties zie je dan ook dat alleen de tabelnaam wordt gezet.

Op het basis concept van o.a. het Sync Framework, typed dataset en linq 2 sql hebben wij een eigen sync library geschreven waarbij wij ook gedeeltes van tabellen kunnen syncen. Als de client verbinding kan maken met de server, dan is het ook mogelijk records te locken zodat deze niet door andere gebruikers gewijzigd kan worden.

Wij gebruiken de sync library ook meer als een soort caching framework.

Maar wat jij wilt is helaas niet mogelijk met het sync framework.
Bedankt voor je reactie! Dus wat je eigenlijk zegt is, het filteren van records op eerste synchronisatie is helemaal niet mogelijk met het Sync Framework? Dat is wel erg jammer want als je een tabel hebt met 10000 records dan wil je die niet allemaal syncen elke keer eigenlijk....Maar het is me nu wel duidelijk, bedankt!

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Dat syncen van die 10000 records is wel de bedoeling. Denk bijvoorbeel aan een mailbox van een mail client welke je regelmatig synct met de server. De eerste duurt het syncen dan ook even (zeker bij de wat grotere tabellen). Afhankelijk van hoeveel er veranderd en hoe vaak er gesynced wordt bepaald natuurlijk nog sequentiele syncs duren.

Als er sinds jouw laatste sync 120 records zijn gewijzigd op de server en 5 op de client, worden er dus 130 (5 updates naar server + ophalen laatste 'versies' van de 5 gewijzigde) records uitgewisseld. De rest is ongewijzigd en hoeft dus niet te worden opgehaald.

Maar heb je al eens naar een typed dataset gekeken? De werking is niet heel erg veel anders, maar bied wel de mogelijkheid om ook het select command te customizen. De dataset kun je dan eventueel als XML bij de client opslaan en later weer via UpdateAll updaten. Bij de updates controleert de dataset of het record ondertussen niet is gewijzigd.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 25-09 14:56
Het syncen van alle records is alleen bij mijn applicatie juist niet de bedoeling. Ik heb een tabel met Werkbonnen voor monteurs waarop ze hun uren kunnen boeken en ik wil bij de eerste synchronisatie alleen de werkbonnen ophalen die voor de ingelogde monteur bestemd zijn. Dus stel ik heb 10000 werkbonnen in de tabel staan waarvan er 10 voor de ingelogde monteur zijn, dan wil ik op de eerste synchronisatie alleen die 10 werkbonnen ophalen. Ik ga even kijken naar die typed datasets, misschien zit daar wat tussen.

[ Voor 19% gewijzigd door rickjehh op 26-11-2008 14:00 ]