问题描述
请教大家一个问题,程序每1分钟update下数据库,有没有办法在网络中断的情况下暂停update,等网络通后继续update?using(SqlConnectionconn=newSqlConnection(connstr)){conn.Open();if(conn.State==ConnectionState.Open){SqlCommandcmd=newSqlCommand("updateTB_GuajisetG_date='"+DateTime.Now.ToString("yyyy/MM/ddHH:mm:ss")+"',GJSC=GJSC+1whereid="+txtShuaID.Text,conn);cmd.ExecuteNonQuery();}else{tssl_GjZt.Text="当前网络中断,稍后重试...";}}
我代码是这样写的,但断网后,程序执行到conn.open这一步时报错。错误提示:ApplicationUnhandledException:在与SQLServer建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且SQLServer已配置为允许远程连接。
解决方案
本帖最后由 bh5768 于 2015-10-05 15:37:00 编辑
解决方案二:
trycatch,或者加入判断网络是否连通的功能
解决方案三:
中断后写本地数据库,恢复后本地数据库拷贝到远程
解决方案四:
open()函数放在try_catch语句块中,使用while循环判断网络是否连通,如果open没有抛出异常则代表连通,执行update操作,然后sleep(60*1000),否则跳过update操作直接sleep1分钟。再while循环判断
解决方案五:
trycatch咯,如果数据更新不了程序跑不下去就放到while里面罗,ifnot,扔到另一个线程里一直试,当前线程继续跑而且open时错,是不是你写的conn.state==xxx的那判断有点多余
解决方案六:
既然你捕获了ApplicationUnhandledException,那么你的进程就不会停止。你原来的程序如果是一分钟调用一次,那么ApplicationUnhandledException处理(例如记录日志)之后自然也还是继续地一分钟处理一次。你现在的程序已经实现了容错了继续处理了,只是自己不知道。
解决方案七:
多说一点设计方法问题:在开发和测试中,需要让异常尽早地显现出来,说通常会使用#if!DEBUGApplicationUnhandledException+=.......;#endif
这样的代码,让容错只在RELEASE版本才起作用。如果你在开发和测试、调试的时候就这样处理,那么就掩盖了问题,让程序导出都带病工作,就不能保证质量了。
解决方案八:
當SqlConnection.Open無法打開網路數據庫時會發生異常。所以你應該將它放在try_catch語句塊中,然後在catch中判定是否是由於無法連接到服務器所引發的異常,再進行處理。
解决方案九:
你原来的程序如果是一分钟调用一次-->你原来的操作过程如果是一分钟调用一次你捕获了ApplicationUnhandledException,这本身就是一种应用程序捕获和处理异常的模式。大多数程序只要在程序最外层(最高层、或者表现层)捕获异常即可,而不需要在底层写try...catch。
解决方案十:
引用5楼sp1234的回复:
既然你捕获了ApplicationUnhandledException,那么你的进程就不会停止。你原来的程序如果是一分钟调用一次,那么ApplicationUnhandledException处理(例如记录日志)之后自然也还是继续地一分钟处理一次。你现在的程序已经实现了容错了继续处理了,只是自己不知道。
请教一个问题:如果把数据库连接字符串放在webService里做常量,然后在winform里读取这个字符串可行不?这样是否安全?
解决方案十一:
引用9楼bh5768的回复:
Quote: 引用5楼sp1234的回复:
既然你捕获了ApplicationUnhandledException,那么你的进程就不会停止。你原来的程序如果是一分钟调用一次,那么ApplicationUnhandledException处理(例如记录日志)之后自然也还是继续地一分钟处理一次。你现在的程序已经实现了容错了继续处理了,只是自己不知道。请教一个问题:如果把数据库连接字符串放在webService里做常量,然后在winform里读取这个字符串可行不?这样是否安全?
传入加密,程序读取后解密