2009-12-06 9 views
1

J'ai une application qui appelle vers une base de données en ligne. Si je perds la connexion à Internet ou si la base de données est en panne, mon application va planter.Traitement en ligne et hors ligne

Quelle est l'approche pour gérer cela? Ma propre approche serait d'avoir un objet qui continue à appeler la base de données tout le temps et si une exception est levée, alors un événement est déclenché auquel tous les autres composants s'inscrivent et qui désactiveraient alors certaines fonctions.

Est-ce la bonne façon ou existe-t-il une meilleure solution?

Répondre

2

Difficile de dire ce qui serait le mieux pour vous de savoir la plus grande image, mais je peux penser à 3 façons dont vous pourriez éventuellement remettre ces situations:

1) gère les problèmes de connectivité bien à le moment où ils se produisent et juste les signaler gentiment
2) comme vous le dites, périodiquement interroger pour la connectivité et désactiver la fonctionnalité si le "ping" échoue
3) travailler avec une copie locale de la DB, puis synchroniser les mises à jour jusqu'à le db principal lorsque la connectivité est là

IMO, je voudrais aller 1) ou 3). L'option 3 offre la meilleure expérience utilisateur. L'option 1 implique potentiellement le moindre effort de développement.

Avec l'option 2, le problème est que, peu importe la fréquence d'interrogation, vous pouvez rencontrer un problème de connectivité à tout moment.

+0

Tout d'abord merci pour toutes les réponses! Je pense que je vais aller avec une solution de 2 et 3 combinés. Je dois être en mesure de montrer si l'application est en ligne ou non. –

3

Je suppose que cela dépend de l'importance de la fonctionnalité. Ce que vous essayez de faire est similaire à ce que le Smart Client Application Block essaie d'atteindre. Il vaut donc probablement la peine de se pencher sur la façon dont il gère les situations comme celle-ci. De mémoire, je pense que la plupart des applications dont j'ai entendu parler tentent réellement de mettre en cache des données. Ainsi, l'application fonctionne à partir d'une copie locale de la base de données et se synchronise avec celle en ligne chaque fois qu'elle peut se connecter. Par exemple, SQL Server Express vous permet de synchroniser la base de données avec une autre base de données SQL Server sur un réseau. Donc, en gros, cela dépend de vos données, si vous pouvez avoir un cache local que l'utilisateur travaille et que vous pouvez synchroniser plus tard, alors vous pouvez aller avec cela. Sinon, l'approche que vous avez décrite semble fonctionner.

1

Pour vérifier si vous êtes sur le réseau ou non, vous pouvez utiliser NetworkInterface de .NET de System.Net.NetworkInformation espace de noms:

bool connected = NetworkInterface.GetIsNetworkAvailable(); 

En ce qui concerne la base de données étant hors ligne - vous devrez gérer les exceptions possibles lors de l'appel cette base de données de telle sorte que votre application ne plante pas, mais renvoie un message d'information à l'utilisateur - ou la journalisation, ou tout ce qui est logique dans votre scénario.

Marc