[C#] local database cache update niet (MS Sync Framework)

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 15-09 16:55
Ik heb een smart device applicatie gemaakt die synchroniseert met mijn lokale database server. Voor het synchroniseren heb ik een simpel formulier gemaakt met daarop een knop om te synchroniseren. Ik heb in mijn project een local database cache aangemaakt die refereert naar mijn database server. wanneer ik een wijziging maak op de server en deze via het formulier probeer te synchroniseren wordt mijn local database cache niet gewijzigd terwijl de update wel wordt gedownload van de server.

Heeft iemand ervaring met hetzelfde probleem?

Acties:
  • 0 Henk 'm!

  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 15-09 16:55
Niemand die hetzelfde probleem al eens heeft gehad? :(

Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 18-09 20:40
Krijg je niet toevallig ergens een error als je naar je cache schrijft?
Kun je met de debugger erdoorheen lopen en kijken waar de update eventueel plaast moet vinden.
Of is het maar 1 opdracht?

(Heb zelf nooit met cache gewerkt, just to see if i can help ;) )

Even niets...


Acties:
  • 0 Henk 'm!

  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 15-09 16:55
Dat is dus idd het punt, hij moet de update automatisch uitvoeren op het moment dat ik de synchronize() methode aanroep. Met behulp van syncstatistics kan er bekeken worden hoeveel updates er gedownload zijn en hoeveel daarvan succesvol zijn doorgevoerd, op het moment dat ik hier met de debugger doorheen loop krijg ik mijn veranderingen netjes te zien in de syncstatistics en die geven aan dat de veranderingen zijn doorgevoerd. Echter wordt de database cache nooit geupdate.

p.s. Local database cache is ook iets nieuws van het MS Sync Framework. Hiermee kan je een kopie van een database maken en aangeven welke tabellen je wil opslaan in de database cache. Visual Studio genereert de rest automatisch.

Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 18-09 20:40
zit er dan niet ergens een reference probleem ofzo tussen de statistics en de letterlijke database.
Update je niet ergens een "Zwevende" (geen expliciete referenties) database?

Even niets...


Acties:
  • 0 Henk 'm!

  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 15-09 16:55
De referenties naar de database regelt hij allemaal zelf, ik hoef alleen maar de connectionstring aan te geven die wijst naar mijn local database cache. Om te kunnen communiceren tussen de database server en mijn local database cache maak ik gebruik van een WCF library. En de synchronisatie werkt want als ik mijn local database cache voor het eerst toevoeg aan mijn client project wordt de local database cache wel gevuld, met de data die op dat moment op de database server staat. Alleen als ik daarna in mijn code zelf ga synchroniseren worden er geen updates meer uitgevoerd.

Acties:
  • 0 Henk 'm!

  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 15-09 16:55
Ik heb mijn probleem opgelost. Het probleem zat hem in de local database cache in mijn project. Elke keer als ik mijn project ging debuggen kopieerde de .sdf zichzelf naar de output directory. Op mijn mobile device keek ik dus steeds tegen een lege database cache aan. Dit kan je dus voorkomen door de property Copy to Output directory van de database cache in je project op Do not Copy te zetten.

Probleem opgelost dus! :)

[ Voor 3% gewijzigd door rickjehh op 12-11-2008 12:07 ]


Acties:
  • 0 Henk 'm!

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 13-09 16:51
rickjehh schreef op woensdag 12 november 2008 @ 12:06:
Ik heb mijn probleem opgelost. Het probleem zat hem in de local database cache in mijn project. Elke keer als ik mijn project ging debuggen kopieerde de .sdf zichzelf naar de output directory. Op mijn mobile device keek ik dus steeds tegen een lege database cache aan. Dit kan je dus voorkomen door de property Copy to Output directory van de database cache in je project op Do not Copy te zetten.

Probleem opgelost dus! :)
:P Dat is leuke, daar ben ik een tijdje geleden ook tegen aan gelopen. Wist je ook al dat je met de Sql Server management studio kan verbinden sdf database? Versiebeheer en debuggen met een lokale database cache wordt zo een stuk eenvoudiger.

http://hawvie.deviantart.com/


  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 15-09 16:55
Dat is wel een goeie tip zeg! dat ga ik meteen ff uitproberen! thnx!

Acties:
  • 0 Henk 'm!

Verwijderd

hmm zit een beetje met een zelfde probleem

ik snap niet meteen hoe ik de sync krijg tussen de desktop en de smartdevice application..

Acties:
  • 0 Henk 'm!

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

Niemand_Anders

Dat was ik niet..

wat bedoel je met 'ik snap niet'? Heb je al een de MSDN (SQL books online) geopend en gelezen hoe syncen tussen met SqlCeReplication werkt?

Overigens kun je geen sync maken tussen de desktop en een smartdevice. Beide communiceren via een sql server (express) database.

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


Acties:
  • 0 Henk 'm!

Verwijderd

Het is dus niet mogelijk om via een mobile device dezelfde database te accessen als via de desktop applicatie?

Acties:
  • 0 Henk 'm!

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

Niemand_Anders

Dat was ik niet..

Verwijderd schreef op maandag 02 februari 2009 @ 14:51:
Het is dus niet mogelijk om via een mobile device dezelfde database te accessen als via de desktop applicatie?
Da's een andere vraag. Jouw vraag ging over een sync tussen de desktop en de smartdevice application.
Nu wil je vanuit beide applicaties dezelfde database benaderen en dat is iets heel anders en heeft totaal niets te maken met het MS SYNC FRAMEWORK.

Het sync framework kun je enigszins vergelijken met subversion. Alle svn clients (zowel developers als een autobuild call) updaten hun lokale versie aan de hand een repository. Op het moment dat meerdere clients wijzigingen hebben voor dezelfde versie moet elke volgende commit een merge actie doen.


Het MS Sync Framework bouwt verder op de Remote Data Access functie van SQL Compact. Daarmee kun je ook andere data sources als repository gebruiken (zoals MS Exchange). Omdat het sync framework support heeft voor custom providers kun je theoretisch elke machine inzetten als repository. Een repository draaien op een desktop pc is dus wel mogelijk, maar niet verstandig als je nog onbekend bent met het framework omdat het dan erg lastig wordt om de providers te debuggen als het niet werkt.

Een goede introductie over het Sync framework en hoe deze intern werkt kun je vinden op http://msdn.microsoft.com/en-us/sync/bb821992.aspx. Op MSDN kun je ook code examples vinden.

Het direct benaderen van een database vanuit beide applicaties werkt het beste middels ADO.net. Het MS Sync framework is meer bedoeld voor 'occassional connected devices' en dus niet continue een verbinding met de 'live' database kunnen opbouwen.

Zo zetten wij het sync framework vooral in voor managers. Via het sync framework worden bepaalde cijfers uit de database getrokken en worden daarna in een MS Access database geplaatst. Managers kunnen de access database gebruiken in PowerPoint of Excel. Dit werkt in ons geval efficiënter en flexibeler dan het gebruik van Reporting Services (local source).

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


Acties:
  • 0 Henk 'm!

Verwijderd

Bedankt alvast voor je antwoord.

Doch ben ik nu bezig in visual studio 2008, en als ik daar een project voor smartdevice bouw
Vraagt hij ( bij het aanmaken van een nieuwe datasource) de database te kopieren naar de output directory.
Doe ik dit niet. Kan het device niet aan de database komen ( heeft wel internet en verbinding tot netwerk )
Doe ik dit wel , wordt de database gwn gekopierd en werk ik op een copy, wat dus geen zin heeft aangezien een andere desktop applicatie gwn op een andere database aan het werken is.

Acties:
  • 0 Henk 'm!

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

Niemand_Anders

Dat was ik niet..

Je moet in je VS solution alleen het skeleton van de compact database aanmaken (in feite dus een lege sdf database waarin alleen tabellen en indexen zijn gedefineerd, maar nog geen records).

Die database is de basis voor zowel de smart- als desktop client. Voor de duidelijkheid: het is niet de bedoeling dat beide applicaties dezelfde database letterlijk delen. Ze delen alleen de content (records) welke IN de database staat. De synchronisatie zorgt ervoor dat de databases gelijk worden getrokken en als beide clients een wijziging aan een record hebben gemaakt moet de laatste kiezen welke 'versie' bewaard wordt.

Als beide applicaties ook de toegang (DAL) tot de database delen dan zou je eventueel de DAL en de 'template' database kunnen opnemen in een apart project. Vergeet dan niet om 'copy to output dir' op always/copy if newer te zetten en vanuit beide applicatie een referentie aan te maken naar het 'DAL' project.

Als je dan een solution build doet zul je in beide bin directories de sdf database zien staan. Het is echter niet verstandig om de database direct uit de bin directory te gebruiken. Het is verstandiger om de database op een unieke locatie te zetten (zoals Application data) en alleen de database te kopieren naar AppData als deze nog niet bestaat. Op die manier voorkom je dat je bij een update je sync database overschrijft met een deployment (lege) database.

Beide applicaties werken dus op hun eigen local database en via de sync framework worden beide databases gelijk gehouden. Dat is immers de essentie van synchronisatie.

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


Acties:
  • 0 Henk 'm!

Verwijderd

Dit maakt heel wat duidelijk !

Het nu nog praktisch omzetten, maar ik begrijp ondertussen de opzet wel.

Basicly maak ik 1 solution, met daarin 3 projecten?
een Smartdevice met presentatielaag en sync knop
een desktop app met presentatielaag en sync knop
een sync project met DAL en lege template database in men app_data folder en BLL?

Bedankt!

Acties:
  • 0 Henk 'm!

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

Niemand_Anders

Dat was ik niet..

Bijna. Ik bedoel meer Application Data uit Documents and Settings. Het gaat erom dat je database op een plaats staat waar deze *niet* bij een application update (ClickOnce) overschreven wordt. Daarmee zou je nog niet gesynchroniseerde data kunnen kwijt raken.

Op het moment dat je application start, moet deze controleren of deze een eigen database heeft. Zo nee, pas dan moet de template database gekopieerd worden naar de Application Data folder.

Voor de rest heb je inderdaad de opzet begrepen.


C#:
1
2
3
4
5
6
7
string AppDataPath = Path.Combine(Environment.GetFolderPath(SpecialFolder.ApplicationData), "MySyncApp");
if (!Directory.Exists(AppDataPath))
  Directory.Create(AppDataPath);

string dbFilePath = Path.Combine(AppDataPath, "sync.sdf");
if (!File.Exists(dbFilePath))
   File.Copy("sync.sdf", dbFilePath);

Deze code kun je gebruiken voor de initialisatie van je applicatie. dbFilePath is het path naar de 'echte' database. De code gaat er vanuit dat sync.sdf in dezelfde directory staat als de executable.

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


Acties:
  • 0 Henk 'm!

Verwijderd

en hoe gebeurd de sync dan als je bv in de emulator van het smartdevice project werkt?
Dus hij krijgt dan zijn 'local ' database mee dus die sync.sdf
er worden dingen gewijzigd in de emulatordatabase

Hoe komen die dan uiteindelijk terecht in de desktop applicatie database?

Acties:
  • 0 Henk 'm!

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

Niemand_Anders

Dat was ik niet..

Zowel de smatrdevice als de desktop zijn letterlijk clients. En clients synchroniseren van nature met een server (zoals imap client syncen met een imap mail server). cvs- en svn clients synchroniseren je development project middels de checkout. De wijzigingen doorvoeren gebeurt middels het commit commando. Pas na de commit zijn de wijzigingen bij andere developers (clients) zichtbaar. Om een wijziging op de PDA zichtbaar te krijgen op de desktop, moet je de PDA eerst syncen met een server (repository). Als je dan de dekstop applicatie start, zul je de wijziging ook daar zien. Hoe de internals van het MS sync framework precies werken staat uitgebreid beschreven op de online MSDN waarvan in de link al een aantal posts eerder had geplaatst.

Ik heb zelf nog nooit gewerkt met de smartdevice emulator van VS en ik weet dus ook niet in hoeverre de emulator is te vergelijken met een virtuele PC. Maar volgens de MSDN documentatie (System.Environment.SpecialFolder) is de constante ApplicationData beschikbaar op zowel het compact framework als op de xbox. Het zou mij dus verbazen als de emulator dus niet met dergelijke directory paden overweg kan omdat het gebruik daarvan volgens Microsoft een 'best practice' is.

De gemakkelijkste synchronisatie (ook voor de beeld vorming, want een server kan ook een client van zichzelf zijn - op vrijwel dezelfde manier dat een aspx pagina ook webservice in de eigen website kan benaderen) is als gebruik wordt gemaakt van een sql server database (express, dus niet compact). Op MSDN kun je ook een voorbeeld implementatie vinden.

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


Acties:
  • 0 Henk 'm!

Verwijderd

heel erg bedankt alweer.

Ik zal het uitproberen en laat je de vorderingen weten...

Acties:
  • 0 Henk 'm!

Verwijderd

Goeiemorgen alweer

Heel vriendelijk bedankt voor al je uitleg, ik heb er zeker uit geleerd.
Nu ik heb iets gevonden dat voor mijn toepassing toch wel een STUK efficienter werkt.

Namelijk met Visual studio 2008 en Sql server 2008
Ik kan nu connecteren via mijn pocket pc en ook via desktop applicatie naar een local (of remote ) sql server.
Indien ik in het ene iets verander wordt dit ook aangepast in de andere.

Na 2 weken hevig geprutst, geformateer, gevloek en gezweet toch een werkende optie gevonden.

Indien iemand geïnteresseerd is in een mogelijke oplossing, wil ik graag trachten de mijne uit te leggen.

Acties:
  • 0 Henk 'm!

  • GSteven
  • Registratie: Juli 2004
  • Laatst online: 17-09-2024
@Steveo2 Ik ben wel geïnteresseerd.
Pagina: 1