【问题标题】:Sql exception in winforms form handling best practicewinforms表单中的sql异常处理最佳实践
【发布时间】:2011-08-18 09:36:31
【问题描述】:

使用 c# vs2008 winforms。

我的标准表格有一个典型的使用模式
表单加载
Sqlconnection 对象打开。

使用 sqldataadaptor 读取/写入数据集
使用 sql 阅读器阅读很多东西
写很多数据用存储过程写

关闭sql连接
关闭表格

那么在这种使用模式中处理异常的最佳实践是什么 我将所有对 sql server 的读写代码都包含在 try catch 子句中以捕获异常。

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

我只是不确定当我捕获异常时应该采取什么措施,以防止内存和资源泄漏。

任何建议表示赞赏

谢谢

【问题讨论】:

    标签: c# sql exception


    【解决方案1】:

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

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

    对于不可恢复的错误,您需要清理和处理连接等。

    最佳实践是在对象实现IDisposable 时使用using 块(例如SqlConnectionSqlCommand 等)

    要获取错误代码的完整列表,请运行此 TSQL:

    SELECT * FROM sysmessages
    

    【讨论】:

    • SqlCommand 也是 IDisposable。总是检查框架类的 MSDN 文档,看看它们是否实现了 IDisposable;如果是这样,请使用“使用”块来确保及时处理它们。
    • 如果你是死锁受害者(错误1205),整个事务将被回滚,所以如果你重试,请确保你从头开始重试事务(执行所有语句再次交易)。
    【解决方案2】:

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

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

    【讨论】:

    • 我不记得曾经遇到过使用打开的 sql 连接锁定记录的问题。您能否提供更多有关这方面的信息。
    • 此外,我们发现在表单的整个生命周期内保持打开的 sql 连接会在通过 VPN 时显着加快数据库访问速度,这就是我们这样做的原因
    猜你喜欢
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2013-05-09
    • 2011-11-10
    • 1970-01-01
    • 2013-04-22
    相关资源
    最近更新 更多