2

每当我退出该方法时,我都想正确处理 SqlConnection 对象。所以我使用“使用”语句,如下所示。

public int Hello()
{
   using(SqlConnection con=new SqlConnection(constring))
   {
      using(SqlCommand cmd=new SqlCommand(Query,con))
      {
       try
       {
          con.Open();
          return cmd.ExecuteNonQuery();
       }
       catch(Exception ex)
       {
          throw ex;
       }
       finally
       {
          con.Close()
       }
      }
   }
}

现在,我想知道的是,上面的代码

  1. 当ExecuteNonQuery 发生异常时,正确处理 Connection 。
  2. 确保我们不会遇到任何 ConnectionPool 问题
  3. 确保正确返回数据
  4. 如果 SqlConnection 发生异常,它会释放对象吗?

谁可以帮我这个事?

4

3 回答 3

7

try/catch如果您只是要扔掉它,则不需要,只需将代码更改为:

public int Hello()
{
    using(SqlConnection con=new SqlConnection(constring))
    {
        using(SqlCommand cmd=new SqlCommand(Query,con))
        {
            con.Open();
            return cmd.ExecuteNonQuery();
        }
    }
}

并且无论发生什么,无论是否异常,如果连接是打开和处置的,它就会被关闭。

于 2013-08-27T12:59:05.283 回答
1

当 ExecuteNonQuery 发生异常时,正确处理 Connection。是的

确保我们不会遇到任何 ConnectionPool 问题

我猜你的意思是在执行查询后连接会得到适当的缓解。如果这是您的问题,那么您不应该使用这种方法。

确保正确返回数据

using 与返回数据无关

如果 SqlConnection 发生异常,它会释放对象吗?

是的

尽管您可以将代码重写为

using(SqlConnection con=new SqlConnection(constring))
   {
      using(SqlCommand cmd=new SqlCommand(Query,con))
      {
       try
       {
          con.Open();
          return cmd.ExecuteNonQuery();
       }
       catch(Exception ex)
       {
          throw;
       }       
      }
   }
于 2013-08-27T10:19:56.800 回答
0

您不应将 using 语句用于 sqlconnection。

使用(SqlConnection con=new SqlConnection(constring))

最好使用 try,catch 和 finally 阻塞来关闭连接。因此,即使在 try & catch 中发生异常,finally 块也会执行并在连接打开时关闭连接。

这背后的原因是,想想下面的情况。

  1. 创建处理所有数据库操作的类的对象,例如DBUtility objDB = new DBUtility()

上面的语句创建类的对象,并从构造函数初始化 sqlconnection 变量。

  1. 现在我正在使用对象 objDB 来一一执行多个查询。为此,它应该只初始化一次 sqlconnection 对象并在其整个生命周期中使用它(life obj objDB)。

  2. 在您的情况下,sqlconnection 将在调用该方法时初始化。

  3. 因此,只需初始化一次连接并为您的每个操作打开/关闭它。当 objDB 被释放时,垃圾收集器会自动释放你的连接。

于 2013-08-27T10:42:40.930 回答