【发布时间】:2010-12-23 19:17:54
【问题描述】:
我有一个调用在线数据库的应用程序。如果我失去与 Internet 的连接或数据库关闭,我的应用程序将崩溃。
处理这个问题的方法是什么?
我自己的方法是让一个对象一直调用数据库,如果抛出异常,则触发一个事件,所有其他组件都注册到该事件,然后禁用某些功能。
这是正确的方法还是有更好的解决方案?
【问题讨论】:
标签: c# distributed
我有一个调用在线数据库的应用程序。如果我失去与 Internet 的连接或数据库关闭,我的应用程序将崩溃。
处理这个问题的方法是什么?
我自己的方法是让一个对象一直调用数据库,如果抛出异常,则触发一个事件,所有其他组件都注册到该事件,然后禁用某些功能。
这是正确的方法还是有更好的解决方案?
【问题讨论】:
标签: c# distributed
我想这取决于功能的重要性。您尝试做的与Smart Client Application Block 尝试实现的类似。因此,可能值得研究它如何处理此类情况。
从记忆中,我认为我听说过的大多数应用程序实际上都在尝试缓存数据。因此,应用程序使用数据库的本地副本,并在可以连接时与在线副本同步。
例如,SQL Server Express 允许您通过网络将数据库与另一个 SQL Server 数据库同步。
所以基本上这取决于您的数据,如果您可以拥有用户使用的本地缓存并且您可以稍后同步,那么您可以使用它。否则,您描述的方法听起来应该可行。
【讨论】:
很难说了解大局对您最有利,但我可以想到 3 种方法可以处理这些情况:
1) 及时处理连接问题并及时报告它们
2) 如您所说,定期轮询连接并在“ping”失败时禁用功能
3)使用数据库的本地副本,然后在连接时同步更新到主数据库
IMO,我会选择 1) 或 3)。 选项 3 提供最佳的用户体验。 选项 1 可能涉及最少的开发工作。
使用选项 2,您会遇到一个问题,即无论您多久进行一次轮询,您都可能随时遇到连接问题。
【讨论】:
要检查您是否在网络上,您可以使用来自System.Net.NetworkInformation 命名空间的.NET 的NetworkInterface:
bool connected = NetworkInterface.GetIsNetworkAvailable();
至于数据库处于脱机状态 - 您必须在调用该数据库时处理可能的异常,以使您的应用不会崩溃,但会向用户返回信息性消息 - 或进行日志记录,或其他任何方式在你的场景中有意义。
马克
【讨论】: