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

16
以下代码如果出现异常,是否会保持连接开启?
我正在使用 Microsoft SQL Compact Edition 数据库。
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();
}
6个回答

31

根据你在代码中使用 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
   }
}
注意:对于实现了IDisposable接口的类,可以使用using块进行操作。

编辑:这与之前提到的相同。

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来显式关闭连接。"在您的第一个示例中,您没有"显式关闭连接"。 - Rafael Emshoff
2
当使用using语句时,它会调用正在使用的对象上的Dispose方法,这将在SqlCeConnection的情况下调用Close方法。使用诸如ILSpy之类的工具查看在SqlCeConnection上调用Dispose时执行的代码。请参阅此处的文档:http://msdn.microsoft.com/en-us/library/bb300654%28v=vs.100%29.aspx。 - shahkalpesh

8

使用 Using

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

4
try
catch
finally

这是处理的正确方式,因为连接应该始终在结束时关闭。但你不仅应该检查conn!= null,还应该检查conn状态是否为Closed


0
你必须尝试以下方法。因为在 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
}

0
为什么不在连接和 SqlCeCommand 周围使用 using?

0

其他连接器如Mysql .net连接器和其他的呢?@Mamoo - Anirudha Gupta
任何连接器,例如Mysql.net提供程序应该(并且很可能已经)在Connection和Command等对象上实现IDisposable,因此“using”也可以使用。对于文件访问或任何时候对象跨越到非托管代码/资源中,情况也是如此。 - plyawn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接