Sincoronizzare tabelle mysql

lunedì 21 ottobre 2013 - 14.29
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Visual Studio 2010  |  MySQL 5.5

Mau67 Profilo | Expert

Buon pomeriggio a tutti,
mi trovo nella situazione di dover sincronizzare dei database che risiedono uno su un server centrale e gli altri nei pc portatili degli agenti, in pratica cosa dovrei fare

Dal server centrale viene creato per ogni agente il portafoglio cliente per il giorno dopo, l'agente si reca dai clienti e popola il database con i dati, al rientro in sede dovrebbe riversare i dati da lui inseriti nel database centrale.
Come posso gestire la situazione? mettendo anche in conto che magari qualche agente può acquisire qualche cliente nuovo durante il giro giornaliero e quindi deve essere inserito nel database centrale.

I dati da sincronizzare devono essere inseriti in un file txt per poter effettuare la sincronizzazione dei database

Uso visual studio 2012 win form e mysql
Grazie in anticipo


Mau67

0v3rCl0ck Profilo | Guru

Ciao, trovo il quesito un po' troppo generico per potere dare una risposta precisa, ma ci proverò...

Se non ho capito male hai bisogno di sincronizzare un database centrale con quello del cliente in modalità offline (e quindi senza utilizzare un servizio connesso come un webservice), in entrambe le direzioni, e come prima cosa mi verrebbe in mente di gestire il tutto utilizzando degli stati di sincronizzazione. In pratica arricchirei i record del database con uno stato per conoscere con precisione se un record è già stato scaricato oppure no, ovviamente in entrambi i database, e questo stato andrebbe gestito per cliente ovviamente, specialmente considerando se le tabelle da sincronizzare sono tabelle in comune con più clienti.

Facciamo l'esempio di una tabella così:

Customers
----------------
CustomerId
FirstName
LastName

Questa tabella sarà sia nel db centrale che dal cliente, e per sapere quali record devono essere scaricati per l'agente e viceversa, vanno create delle tabelle di supporto.

Nel db centrale metterei due tabelle:

Agents
----------------
AgentId
FirstName
LastName

UsersSync
----------------
UserId
AgentId
Status (New, Changed)

E nel db del cliente/agente (oltre alla tabella Customers):

UsersSync
----------------
UserId
Status (New, Changed)

In questo modo il db centrale riesce a gestire gli stati di sincronizzazione di più agenti, e quindi per ogni agente sa perfettamente quali dati nuovi o cambiati gli deve esportare al prossimo giro, mentre l'agente deve solo sapere quelli che deve mandare al db centrale.

Quando si effettuano operazioni dalla centrale, e ad esempio si modifica o aggiunge un customer, devono essere inserite nella UsersSync tante righe quanti sono gli agenti, con lo stato opportuno (new o changed), così quando arriva il momento di scaricare i dati dell'agente si sa perfettamente cosa esportare dalla tabella Customers, e non appena esportato si rimuove la riga dalla UsersSync, oppure gli si aggiorna lo status a Exported e magari si mette anche qualche data di riferimento tipo ChangedDate e ExportedDate, giusto per essere in grado eventualmente di recuperare l'ultima esportazione se qualcosa nel passaggio all'agenzia dovesse andare storta. Stessa cosa avviene dal db dell'agente.

Sono andato vicino a quello che chiedevi?

ciao
-------------------------------------------------------
Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com

Mau67 Profilo | Expert

Grazie per la risposta,
si hai centrato il problema, solo che il problema è mio in quanto non ho mai fatto niente dele genere e quindi
1) come lancio la procedura di sincronizzazione?
2) essendo pc non connessi in rete!
3) bisogna esportare i dati in un file testo?
4) come importo i dati nei database?
Avrai capito che sono autodidatta è cerco di imparare

Grazie
Mau67

0v3rCl0ck Profilo | Guru

>Grazie per la risposta,
>si hai centrato il problema, solo che il problema è mio in quanto
>non ho mai fatto niente dele genere e quindi

scusa se rispondo solo ora, ma ho avuto un po' da fare in questi giorni, ma ecco le risposte...

>1) come lancio la procedura di sincronizzazione?

penso che dovrà essere una procedura sviluppata nella tua applicazione che viene lanciata dall'applicazione win form, e che immagino chiederà l'input di un file contenente i dati da importare, precedentemente esportati dal server centrale che a sua volta dovrà avere un applicazione di backend per potere esportare su file i dati per ogni agente a cui devi aggiornare il database.

>2) essendo pc non connessi in rete!
>3) bisogna esportare i dati in un file testo?

Utilizzando un esportazione su file puoi riuscire a fare questo passaggio di dati senza essere connesso: per il server centrale puoi creare un applicazione o win form oppure una console application (che eventualmente trasformi poi in un servizio windows con Topshelf http://topshelf-project.com/) per creare un processo automatizzato, ad esempio ogni notte. Questa applicazione andrà a creare un file per agenzia contenente i dati che sa di dovere esportare per ogni agenzia sfruttando la struttura a database che ti ho consigliato.

>4) come importo i dati nei database?

Dall'applicazione winform dell'agente farai un interfaccia che chiede l'input di un file, che sarà la base dei dati da importare nel suo database, e allo stesso modo farai l'esportazione viceversa, dall'agente verso il server centrale. Il server centrale potrà avere una cartella comune di deposito file, dove gira quell'applicazione console/winservice, che periodicamente controlla se esistono file da elaborare, e se si, li elabora importando i dati, e poi toglie il file dalla cartella. In questo modo non c'è bisogno di un particolare software winform lato server, ma può bastare una semplice cartella condivisa in rete, o un accesso ftp dove copiare tutti i file esportati dagli agenti.

>Avrai capito che sono autodidatta è cerco di imparare
>Grazie
>Mau67

ciao
-------------------------------------------------------
Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com

Mau67 Profilo | Expert

Ciao ci sarebbe la possibilità di avere qualche esempio di codice da visionare per fare tutto quello che hai descritto?
te ne sarei grato.
Buona domenica
Mau67

0v3rCl0ck Profilo | Guru

è un po' tanto quello che mi chiedi, perchè non so se avrò tempo per fartelo, se in questi giorni riesco a farti un qualcosa di esempio te lo posto, ma non ci sperare troppo



Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

Mau67 Profilo | Expert

Ok grazie
Mau67

Mau67 Profilo | Expert

Ciao sei ancora disposto in base ai tuoi impegni ad aiutarmi per risolvere questo problema?
Grazie
Mau67

0v3rCl0ck Profilo | Guru

Ciao, purtroppo sono in ferie e tornerò la prossima settimana e immagino sarò presissimo, appena torno vedrò se riesco a trovare un po' di tempo



Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

Mau67 Profilo | Expert

Ok grazie buone ferie
Mau67

0v3rCl0ck Profilo | Guru

Ciao,

rieccomi, sono riuscito a farti un piccolo esempio (vedi allegato), questo è il massimo che posso farti per il tempo che ho , ovviamente ho tralasciato diversi punti che dovrai implementare tu in base anche alle tue necessità funzionali, ma diciamo che il succo è quello.

Per farlo funzionare, accendi le due wpf application e poi:

1 - premi "Inizializza Database Master" sull'applicazione "Sync Sample - Master"
2 - premi "Inizializza Database Slave" sull'applicazione "Sync Sample - Agent Slave"
3 - premi "Simula Cambiamenti Clienti" sull'applicazione "Sync Sample - Master"
4 - premi "Esporta per Database Agente" sull'applicazione "Sync Sample - Master"
5 - Incolla (CTRL+V) nell'apposita textbox di importazione, sull'applicazione "Sync Sample - Agent Slave"
6 - premi "Importa da Database Master" sull'applicazione "Sync Sample - Agent Slave"

ora puoi verificare che il database dell'agente è stato sincronizzato con le modifiche del master.

Il tutto sfrutta entity framework e sql compact, ma solo perchè mi risultava veloce e semplice, tu ovviamente puoi utilizzare qualsiasi altro meccanismo di accesso al database.


spero ti possa essere d'aiuto
Ciao!


Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

Mau67 Profilo | Expert

Grazie per il tempo dedicato è ottimo il progetto ti ringrazio immensamente.
Ciao alla prossima
Mau67

0v3rCl0ck Profilo | Guru

>Grazie per il tempo dedicato è ottimo il progetto ti ringrazio
>immensamente.
>Ciao alla prossima

Alla prossima Ciao!



Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5