【问题标题】:Correct way to close database connection in event of exception发生异常时关闭数据库连接的正确方法
【发布时间】:2019-12-26 05:37:56
【问题描述】:

如果出现异常,以下代码是否使连接保持打开状态?

我使用的是 Microsoft SQL 精简版数据库。

try
{
    SqlCeConnection conn = new SqlCeConnection(ConnectionString);

    conn.Open();

    using (SqlCeCommand cmd =
        new SqlCeCommand("SELECT stuff FROM SomeTable", conn))
    {
      // do some stuff
    }

    conn.Close();
}
catch (Exception ex)
{
    ExceptionManager.HandleException(ex);
}

当然更好的方法是在 try 之前声明一个连接对象,在 try 块中建立连接并在 finally 块中关闭它?

 SqlCeConnection conn = null;
 try
 {
    conn = new SqlCeConnection(ConnectionString);

    conn.Open();

    using (SqlCeCommand cmd =
        new SqlCeCommand("SELECT stuff FROM SomeTable", conn))
    {
      // do some stuff
    }
}
catch (Exception ex)
{
    ExceptionManager.HandleException(ex);
}
finally
{
    if( conn != null )  conn.Close();
}

【问题讨论】:

    标签: c# .net sql-server-ce database-connection


    【解决方案1】:

    您在代码中借助using 块处理SqlCeCommand 的方式,您可以对SqlCeConnection 执行相同的操作。

    SqlCeConnection conn;
    using (conn = new SqlCeConnection(ConnectionString))
    {
       conn.Open();
       using (SqlCeCommand cmd = 
           new SqlCeCommand("SELECT stuff FROM SomeTable", conn))
       {
       // do some stuff
       }
    }
    

    注意:您可以将using 块用于实现IDisposable 的类。

    编辑:这与

    相同
    try
    {
        conn = new SqlCeConnection(ConnectionString);
        conn.Open();
    
        SqlCeCommand cmd = conn.CreateCommand();
        cmd.CommandText = "...";
    
        cmd.ExecuteNonQuery();
    }
    finally
    {
        conn.Close();
    }
    

    参考:http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceconnection%28VS.80%29.aspx

    【讨论】:

    • 我仍然无法理解这一点。来自参考:“如果 SqlCeConnection 超出范围,它不会关闭。您必须通过调用 Close 或 Dispose 显式关闭连接。”在您的第一个示例中,您没有“明确关闭连接”。
    • 当使用using 语句时,它会在正在使用的对象上调用Dispose 方法,在SqlCeConnection 的情况下又会调用Close 方法。使用 ILSpy 之类的工具查看在 Dispose 上调用 SqlCeConnection 时执行的代码。请参阅文档here
    【解决方案2】:

    使用Using

    using(SqlConnection conn = new SqlConnection())
    {
    //put all your code here.
    }
    

    【讨论】:

      【解决方案3】:
      try
      catch
      finally
      

      是处理此问题的正确方法,因为连接应始终在最后关闭。但是您不仅应该检查conn != null,还应该检查conn 状态是否不是Closed

      【讨论】:

        【解决方案4】:

        您应该使用using 语句,它可以轻松处理连接关闭 http://davidhayden.com/blog/dave/archive/2005/01/13/773.aspx

        【讨论】:

        • Mysql .net 连接器等其他连接器怎么样。 @Mamoo
        • 任何连接器,例如 Mysql.net 提供程序应该(并且可能确实)在 Connection 和 Command 等对象上实现 IDisposable,因此“使用”可以并且应该作为出色地。文件访问或任何时候对象进入非托管代码/资源时也是如此
        【解决方案5】:

        您必须尝试以下方式。 因为连接在 finally 块中关闭

        try
        {
            SqlCeConnection conn = new SqlCeConnection(ConnectionString);
        
            conn.Open();
        
            using (SqlCeCommand cmd =
                new SqlCeCommand("SELECT stuff FROM SomeTable", conn))
            {
              // do some stuff
            }
        }
        catch (Exception ex)
        {
        
        }
        finally
        {
        \\close connection here
        }
        

        【讨论】:

          【解决方案6】:

          为什么不在连接周围使用using 以及SqlCeCommand

          【讨论】:

            猜你喜欢
            • 2010-09-13
            • 2019-04-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多