2008-09-08 3 views
6

Nehmen Sie eine .Net WinForms App .. in einem flakey drahtlose Netzwerkverbindung mischen, mit einigen Benutzern rühren, die den blauen Stecker heraus gelegentlich einfach ziehen mögen und für eine gute Maßnahme, fügen Sie ein Admin-Systeme, die die SQL Server-Box neu zu starten, entscheidet ohne Vorwarnung hin und wieder, nur um alle auf Trab zu halten.Wie verwalten Sie Ihre App, wenn die Datenbank offline geschaltet wird?

Was sind die Vorschläge und Strategien für den Umgang mit dieser Art von Szenario in Bezug auf:

  • Fehlerbehandlung - zum Beispiel, Sie wickeln Sie jeden Aufruf an den Server mit einem Try/Catch oder tun Sie verlassen sich auf eine Form von Generic Error Handling zu verwalten dies? Wenn ja, wie sieht es aus?

  • Application Management - zum Beispiel, haben Sie die App deaktivieren und nicht zulassen, dass Benutzer mit ihr zu interagieren, bis eine Verbindung wieder erkannt wird? Was würden Sie tun?

+0

Nur um dies abzuschließen - wir verwenden MS Sync Services für diejenigen, die offline arbeiten. Aber wir haben festgestellt, dass die gleichzeitige Ausführung von mehr als 50 Benutzern auf Sync Services auf einem großen System zu SQL Server-Problemen führt, da wir bestrebt sind, Konflikte und die Belastung des Servers zu bewältigen. – gleng

+0

Deshalb haben wir die standardmäßigen Office-gebundenen PCs so eingestellt, dass sie den SQL Server direkt und nicht über eine zwischengeschaltete Datenbank wie SQL Compact erreichen. Danke an alle für die Antworten - was ich wirklich suchte war eine Idee von dem, was Menschen in ähnlichen Situationen tun, wenn die DB nicht verfügbar ist. – gleng

Antwort

3

Die Antwort hängt von der Art Ihrer Anwendung ab. Es gibt Anwendungen, die offline arbeiten können - zum Beispiel Microsoft Outlook. Solche Anwendungen behandeln Konnektivität-Ausnahmen nicht als kritisch, sie können Ihre Arbeit lokal speichern und später synchronisieren. Andere Anwendungen wie Online-Spiele behandeln Kommunikationsprobleme als kritische Ausnahme und werden beendet, wenn die Verbindung verloren geht.

Ab der Fehlerbehandlung, denke ich, dass Sie Ausnahmen auf allen Ebenen steuern sollten, anstatt auf einige allgemeine Ausnahme behandeln Stück Code. Ihre Business-Schicht sollte verstehen, was auf der unteren Ebene passiert ist (Datenzugriffsschicht in unserem Fall) und dementsprechend reagieren. Verbindung verloren sollte nicht als unerwartete Ausnahme meiner Meinung nach behandelt werden. Für gute Praktiken des Ausnahmenmanagements empfehle ich einen Blick auf Exception Handling Application Block.

In Bezug auf das Anwendungsverhalten sollten Sie die folgende Frage beantworten: "Hat meine Anwendung einen Geschäftswert für den Kunden im getrennten Status?" In vielen Fällen wäre es vorteilhaft für den Endbenutzer, seine Arbeit im getrennten Zustand fortsetzen zu können. Ein solches Verhalten ist jedoch äußerst schwierig zu implementieren.

Speziell für Ihr Szenario Microsoft entwickelt Disconnected Service Agent Application Block

0

In unserer Anwendung, geben wir dem Benutzer die Möglichkeit, auf einem anderen Server zu verbinden, zum Beispiel, wenn die Datenbank-Verbindung fehlschlägt, wird ein Dialogfeld angezeigt, zu sagen, dass der Server nicht verfügbar ist, und sie könnten Eingang eine andere IP-Adresse Versuchen.

1

Wir haben dies in unserer Main() Methode, die alle nicht behandelten Ausnahmen einfängt ...

Application.ThreadException += new 
System.Threading.ThreadExceptionEventHandler(UnhandledExceptionCatcher); 

Thread.GetDomain().UnhandledException += new 
UnhandledExceptionEventHandler(Application_UnhandledException); 

und dann Application_UnhandledException und UnhandledExceptionCatcher-Display benutzerfreundliches Nachrichten.

Neben der Anwendung dann E-Mail Daten wie der Stack-Trace an die Entwickler, die sehr nützlich sein können.

Es hängt von der App natürlich aber für die Art von Fehler, die Sie beschreiben, würde ich Sie die App schließen.

2

Ich habe jetzt nicht WinForms und .NET seit Jahren berührt, so kann ich Ihnen keine technischen Details geben, aber es ist das Lager Bild Antwort:

In erster Linie - binden nicht Ihre Formulardaten direkt zu einer Datenbank.

Erstellen Sie eine separate Daten/Modell Ebene, die Sie zu Ihrem Formular-Widgets binden.

Von dort aus haben Sie mehrere Möglichkeiten, die Sie auf der Ebene der Stabilität abhängig und Verfügbarkeit, die Sie zur Verfügung stellen müssen.

Wahrscheinlich eine der einfachsten hier Lösungen wäre, nur die Teile der Anwendung aktivieren/deaktivieren, die mit einer Datenbank zu interagieren müssen auf dem Verbindungszustand basiert. Die nächste Stufe des Schutzes umfasst das lokale Caching des Teils des Datenmodells und bei fehlender Datenbankverbindung den lokalen Cache zum Anzeigen und Deaktivieren von Funktionen, die eine explizite Datenbankverbindung erfordern.

Wahrscheinlich ist die schwierigste Sache (die dem Endbenutzer auch die stabilste Erfahrung bieten kann), die Datenbank lokal zu replizieren und ein Synchronisationsschema zu verwenden, um Ihre Kopie der Datenbank mit der entfernten Datenbank synchron zu halten.

1

, Dies kann ein wenig zu viel Unterstützung für die Offline-Szenario sein, aber haben Sie als die „Microsoft Sync Framework“? Das Framework enthält die "Synchronisierungsdienste für ADO.NET 2.0", die es Ihrer Anwendung ermöglichen, eine lokale SQL Server CE-Instanz zu treffen. Dies kann leicht mit einem zentralen SQL Server über eine Vielzahl von Methoden synchronisiert werden.

Dieses Framework behandelt das permanente Offline-Szenario, und wie gesagt, es ist möglicherweise nicht für Ihre spezifischen Anforderungen geeignet, jedoch wird es Ihrer Anwendung solide Offline-Unterstützung geben.

0

Verwendung so etwas wie SQLite Daten offline zu speichern, bis eine Verbindung verfügbar ist.

Update: Ich glaube, SQLite ist das Back-End für , die von meinem Verständnis nach was Sie in Web-Anwendungen suchen ... obwohl ich nicht weiß, ob es in einem Nicht-Web-Kontext verwendet werden kann.