[VB.NET] Applicatie vertellen dat er data veranderd in SQL

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Sven_Vdb
  • Registratie: Januari 2006
  • Laatst online: 02-09 09:14
Ik ben dus bezig met een applicatie. Je hebt een ListView en een Treeview. Deze worden beide mooi opgevuld,opgeslagen,.... Maar ik zit met het probleem, ik gebruik nergens een knop ofzo. Dus dit gebeurd gewoon op het formulier allemaal zelf. Maar als nu nog iemand dezelfde applicatie heeft openstaan en een aanpassing gaat doen. Dan ziet de andere persoon dit niet. Ik ben op het net aan het kijken hoe ik dit het beste kan oplossen.

Ik had iets gevonden over Query Notifiactions --> maar volgens sommige verhalen op het net zou dit niet de beste oplossing zijn. Dit zou het beste werken voor serverside en niet clientsite ( windows forms ) mede omdat hij elke request gaat opslaan. En dit wel eens veel resource kan vreten.

Iemand enig idee, hoe ik het wel goed kan oplossen? Of is de vorige alinea niet waar?

Acties:
  • 0 Henk 'm!

  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 10-09 09:08

Spockz

Live and Let Live

Misschien dat je iets kan doen met iets als een datasource waar je je tree en listview aan hangt? Ik weet niet wat voor communicatielijnen je verder hebt lopen tussen je verschillende clients? Het werken met iets als notifies bij een datachange lijkt me wel werkbaar.

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


Acties:
  • 0 Henk 'm!

  • Sven_Vdb
  • Registratie: Januari 2006
  • Laatst online: 02-09 09:14
Spockz schreef op vrijdag 09 oktober 2009 @ 14:16:
Misschien dat je iets kan doen met iets als een datasource waar je je tree en listview aan hangt? Ik weet niet wat voor communicatielijnen je verder hebt lopen tussen je verschillende clients? Het werken met iets als notifies bij een datachange lijkt me wel werkbaar.
Hoe bedoel je met iets als een datasource waar je tree en listview aanhangt ?

Applicatie 1 -->
SQL SERVER 2005
Applicatie 2 -->

Het is gewoon een control die gewoon heel de dag kan openstaan. Maar wanneer je dus op applicatie 1 invoegt en applicatie 2 staat open. Dan moet er via de sql server een melding gestuurd worden naar applicatie 2 dat hij moet refreshen(nieuwe data ophalen). Dus wanneer in de tabel iets verandert ( 2 tabellen ) Moet de applicatie refreshen.

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Ben je niet op zoek naar verschillende type locks? (optimistic, etc) ? Of zoek je updates voor het bijwerken van overzichten (Zonder bewerking); in dat laatste geval kan je of zaken of notification services of timers gebruiken.

[ Voor 52% gewijzigd door gorgi_19 op 09-10-2009 15:33 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Gimmeabrake
  • Registratie: December 2008
  • Laatst online: 23-08 10:45
Volgens mij is het probleem dat de data in de controls niet meer gerefresh wordt als ze eenmaal zijn weergegeven. Als het programma op een andere computer ook gebruikt wordt en er gegevens toegevoegd/verwijderd/aangepast worden, het niet zichtbaar is voor de eerstgenoemde gebruiker.

Een (enigzins slordige) maar wel makkelijke manier is zoals gorgi_19 volgens mij al zegt het gebruik maken van een timer om regelmatig te updaten. Houd er wel rekening mee dat dit voor meer traffic zorgt en je applicatie langzamer maakt, dit kan dus alleen als het niet teveel gegevens zijn.

Je kunt er ook voor kiezen een refresh knop te maken zodat de user handmatig kan refreshen. Voordat de user gegevens probeert te wijzigen zet je een lock op de table, vergelijk je de gegevens in de tabel met wat er op de pc wordt weergegeven. Mocht dit verschillen geef je een melding weer ("De weergegeven versie van de tabel is niet de meest actuele [bladiebla]"), en laat je de gebruiker kiezen of hij de bewerking wel of niet uitvoert.

Of mssql ook notifications voor veranderingen in een tabel terug kan sturen, weet ik niet. Zoek het in de MSDN op, zou ik zeggen ;)

[ Voor 0% gewijzigd door Gimmeabrake op 09-10-2009 18:03 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 10-09 09:08

Spockz

Live and Let Live

Sven_Vdb schreef op vrijdag 09 oktober 2009 @ 15:23:
[...]


Hoe bedoel je met iets als een datasource waar je tree en listview aanhangt ?

Applicatie 1 -->
SQL SERVER 2005
Applicatie 2 -->

Het is gewoon een control die gewoon heel de dag kan openstaan. Maar wanneer je dus op applicatie 1 invoegt en applicatie 2 staat open. Dan moet er via de sql server een melding gestuurd worden naar applicatie 2 dat hij moet refreshen(nieuwe data ophalen). Dus wanneer in de tabel iets verandert ( 2 tabellen ) Moet de applicatie refreshen.
Als je geen gebruik wilt maken van polling zal de tweede applicatie op de een of andere manier door moeten krijgen dat hij zijn data moet verversen. Ik noemde de datasource omdat veel van de geavanceerdere views aangesloten kunnen worden op een datasource die hen vervolgens vertelt wat de data is. Deze datasource zou je kunnen uitbreiden met een bepaalde connectie naar de server. Of dat zoals Sven_Vdb direct met de database server is of met een service die je er zelf tussen zet waar ze mee moeten praten moet je zelf weten. (Is ook afhankelijk van wat je dbms ondersteunt natuurlijk.)

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

gerrymeistah schreef op vrijdag 09 oktober 2009 @ 18:02:
Een (enigzins slordige) maar wel makkelijke manier is zoals gorgi_19 volgens mij al zegt het gebruik maken van een timer om regelmatig te updaten. Houd er wel rekening mee dat dit voor meer traffic zorgt en je applicatie langzamer maakt, dit kan dus alleen als het niet teveel gegevens zijn.
Of het echt slordig is weet ik niet; anders moet je op de server bijhouden wie allemaal een notificatie moet krijgen en verifieren of die ook nog daadwerkelijk bestaat. Of het langzamer wordt valt ook te betwijfelen; er zit een time lag in die je in een background thread kan uitvoeren.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 11-09 12:27

Crazy D

I think we should take a look.

Sven_Vdb schreef op vrijdag 09 oktober 2009 @ 13:43:
Ik had iets gevonden over Query Notifiactions --> maar volgens sommige verhalen op het net zou dit niet de beste oplossing zijn. Dit zou het beste werken voor serverside en niet clientsite ( windows forms ) mede omdat hij elke request gaat opslaan. En dit wel eens veel resource kan vreten.
Over hoeveel clients zou het gaan? Natuurlijk kost dit resources, maar als het over een handje vol clients gaat is dat te verwaarlozen. Als je het over 1000'en hebt is het een ander verhaal :)

(en ook dan kan het trouwens nog steeds een prima keuze zijn om dit te gebruiken: een mogelijk alternatief is een service die je op de db server laat draaien, en waarmee je clients connecten. Hoeveel tijd (dus geld) kost de ontwikkeling daarvan, en wat kost een snellere cpu voor in je db server).

Ik heb er overigens geen ervaring mee. Ik heb toevallig wel een app die een notification moet krijgen (maar die app draait gewoon op de db server), en daar creeer ik in een trigger heel simpel een bestandje, en met de FileSystemWatcher krijg ik de melding in m'n app.

Exact expert nodig?


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Sven_Vdb schreef op vrijdag 09 oktober 2009 @ 13:43:
Ik ben dus bezig met een applicatie. Je hebt een ListView en een Treeview. Deze worden beide mooi opgevuld,opgeslagen,.... Maar ik zit met het probleem, ik gebruik nergens een knop ofzo. Dus dit gebeurd gewoon op het formulier allemaal zelf.
Dit begrijp ik niet. Als dit een user interface is, dan moet er iets voor de user te interfacen vallen. Hij moet iets kunnen aanwijzen, aangeven, verplaatsen, selecteren, wat dan ook. Dat veroorzaak een Event in je applicatie en vanaf daar voltrekken zich de acties, die uiteindelijk wel of niet voor een wijziging in je database zorgen. Op dat moment kan je dat ook ergens vastleggen, zodat andere clients dat feit waarnemen op het moment dat dat nodig is. Als dat snel moet, dan moet je ze elke zoveel tijd laten controleren of er wijzigingen zijn. Daar zijn een aantal varianten voor mogelijk, die al genoemd zijn.

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • Sven_Vdb
  • Registratie: Januari 2006
  • Laatst online: 02-09 09:14
@ CrazyD : Het gaat maar om enkele clients,zullen er niet meer dan 2 handjes zijn normaal.
Notifications worden in sql server opgeslagen? En gebruiken resource's maar met die 10 clients zou dit te verwaarlozen zijn?

@Confusion:Ja er gebeuren dingen drag en drop van listview naar treeview. En als je dit in db gaat opslaan. Dan moet de andere applicatie het weten. En dit via een manier ja. :)

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Ik zie 2 mogelijkheden:
- Of je gooit er een extra tussenlaag in op de server
- Of je maakt een tabel waarin je een record toevoegt met een timestamp telkens je een update/insert/... uitvoert. Aan de client kant poll je dan die tabel.

Bovendien moet je rekening houden dat gebruikers niet graag onderbroken worden door externe updates. Als ik net een drag-drop start en daarna beslist de app zelf maar om even te gaan updaten en mijn drag-drop zodoende te onderbreken, dan word ik behoorlijk chagrijnig. Naar het model van gerrymeistah zou ik een refresh-button en een notificatieveld invoegen, waarin je de gebruiker manueel de mogelijkheid geeft up te daten wanneer je in het notificatieveld aangeeft dat de data out-of-sync is.

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 11-09 12:27

Crazy D

I think we should take a look.

Als het maar om zo weining clients gaat, zou ik me daar niet druk om maken. Nu ligt het er misschien nog aan hoeveel tabellen er gemonitored moeten worden, een extra tabel 'modifieddata' oid is dan nog een tussenoplossing (die je weer vult vanuit een trigger), maar als die notification service verder precies doet wat jij wilt hebben, zou ik daarvoor gaan. Als er een moment komt dat dit qua performance een issue begint te worden, kun je altijd nog andere oplossingen gaan bedenken.

Ben het overigens deel wel eens met andere opmerkingen over de user interface, maar soms moet je het niet van de gebruiker af laten hangen of iets gerefresht worden. Mensen vergeten dat en werken dan alsnog met verouderde data. Wel zou ik kijken of je het zo smooth mogelijk kunt laten verlopen (bijvoorbeeld door niet de hele list opnieuw op te bouwen, maar alleen toevoegen, verwijderen en die rijen die gewijzigd zijn, bij te werken).

Exact expert nodig?


Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 01-09 22:18
Ik heb dit nog niet gedaan, maar misschien kun je een service maken die objecten van de databasetabellen heeft. Via remoteobjects laat je elke client dan met dezelfde objecten binden.
Als dan iets wijzigt in een object in de service, zal alle data in de clientcontrols die aan dat object gebind zijn meeveranderen.

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Waarom niet een WCF service op de server. En daar doe je al je requests op. Iedere client hang je dan er op, en registreer je een call back.

Als iemand dan iets post naar de database vuur je die callback af? :)

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

Verwijderd

Dit is wat je wilt. Weet niet of zoiets ook in Microsoft SQL Server bestaat...
Events are simple notification messages sent asynchronously from server to clients. It means that they are not part of standard request-reply mechanism used for for database queries. Whenever the event happens in database, the server alerts all the clients which declared their interest in that event.

Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Verwijderd schreef op zondag 11 oktober 2009 @ 14:08:
Dit is wat je wilt. Weet niet of zoiets ook in Microsoft SQL Server bestaat...
Dat is wel een goede manier om het voor de volgende maintainer van de applicatie flink ondoorgrondelijk te maken :+. Als je het binnen de applicatie af kunt handelen, doordat er maar 1 applicatie van de betreffende datasource gebruik maakt (cq. genotificeerd moet worden), doe het dan alsjeblieft binnen de applicatie.

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 11-09 14:44
Bespaar je de moeite, en ga gewoon pollen. Dit gaat je systeem echt niet heel zwaar belasten, en je kunt dit gewoon in de background doen. Bovendien hoef je niet elke keer je hele layout opnieuw te tekenen, alleen bij wijzigingen.

Acties:
  • 0 Henk 'm!

  • _trickster_
  • Registratie: Mei 2005
  • Laatst online: 10-09 21:16
ik had zelf een keertje in een .net applicatie bestaande uit 2 losse aplicaties en 1 .MDB en had ik gewoon een file_changed action erop zitten.

eventueel ook nog een oplossing, maar dan kan je niet met een SQL server werken volgensmij....
Pagina: 1