在异常情况下正确关闭数据库连接的方法

low*_*ern 15 .net c# database-connection sql-server-ce

如果存在异常,以下代码是否会打开连接?

我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)

当然更好的方法是在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();
}
Run Code Online (Sandbox Code Playgroud)

sha*_*esh 29

SqlCeCommandusing块的帮助下,您在代码中处理的方式,您可以执行相同的操作SqlCeConnection.

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

注意:您可以using对实现的类使用块IDisposable.

编辑:这和

try
{
    conn = new SqlCeConnection(ConnectionString);
    conn.Open();

    SqlCeCommand cmd = conn.CreateCommand();
    cmd.CommandText = "...";

    cmd.ExecuteNonQuery();
}
finally
{
    conn.Close();
}
Run Code Online (Sandbox Code Playgroud)

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

  • 当使用`using`语句时,它对正在使用的对象调用`Dispose`方法,而在`SqlCeConnection`的情况下又调用`Close`方法。使用ILSpy之类的工具查看在SqlCeConnection上调用Dispose时执行什么代码。请参阅文档[此处](http://msdn.microsoft.com/zh-cn/library/bb300654%28v=vs.100%29.aspx)。 (2认同)

Joh*_*Hpa 8

使用 Using

using(SqlConnection conn = new SqlConnection())
{
//put all your code here.
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*nik 4

try
catch
finally
Run Code Online (Sandbox Code Playgroud)

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