2011-08-18 55 views
0

使用c#vs2008 winforms。Winforms窗体处理最佳实践中的Sql异常

我的标准形式具有
形式负载
SqlConnection对象打开一个典型的使用模式。

读/写数据集采用sqldataadaptors
读取使用SQL的读者很多东西
使用存储过程编写

关闭SQL连接
密切形式

在处理异常因此,whats最佳实践写了许多数据在这种类型的使用模式 中,我使用try catch子句将所有读取和写入代码放在sql服务器中以捕获异常。

那么当我陷入异常时我该怎么办?
我应该关闭并处理所有的sql对象吗?
我应该关闭窗体并处理窗体。
我应该尝试让用户继续
我应该尝试重新打开我的sqlconnection,如果异常是sql连接断开了?
鉴于我打开和关闭表单加载和关闭连接,因为它只有在理论上打开一次,并关闭一次与许多读写中间。

我只是不确定我应该采取什么行动,当我陷入异常,以防止内存和资源泄漏。

任何意见赞赏

感谢

回答

2

这取决于你收到异常及其严重程度。如果它是错误号1205,那么您将需要重试,因为这是SQL Server死锁错误。例如

catch (SqlException sqlEx) 
{  
    if (sqlEx.Number == 1205)  
    {   
     // Deadlock occurred, retry...  
    }  
    else   
     throw; 
} 

对于不可恢复的错误,你想清理和连接等

最佳做法是使用using块只要一个对象实现IDisposable(如SqlConnectionSqlCommand等处置)

来得到错误代码的完整列表,运行这个TSQL:

SELECT * FROM sysmessages 
+0

另外SqlCommand是IDisposable。总是检查框架类的MSDN文档,看他们是否实现IDisposable;如果是这样,请使用“使用”块以确保及时处理它们。 – Polyfun

+0

如果您是死锁受害者(错误1205),则整个事务将回滚,因此如果您重试,请确保从头重试事务(再次执行事务中的所有语句)。 – Polyfun

+0

http://stackoverflow.com/questions/320636/how-to-get-efficient-sql-server-deadlock-handling-in-c-with-ado –

0

您可能需要考虑在您的表单的整个生命周期中不保持SqlConnection打开状态。表单的生命期由用户控制,因此目前SqlConnections的生命周期也由用户控制,这不是一个好主意;数据库上的锁可能会保持打开状态,直到SqlConnection关闭。在多用户系统中,这可能会增加锁定记录的争用 - 当您的表单打开连接时,您可能会阻止其他用户。

最好打开和关闭表单上特定动作的连接,例如,当用户单击按钮时。因为连接池自动实现在封面上,所以您不必担心重复打开和关闭连接的开销 - 这将通过连接池最小化。

+0

我不记得曾遇到记录被锁定的问题一个开放的sql连接。你能提供更多关于这方面的信息吗? – Spooky2010

+0

此外,我们发现在通过VPN时,为表单的生命保持开放的sql连接显着加速数据库访问,这就是为什么我们要这样做 – Spooky2010