使用多个using语句的正确方法是什么?

时间:2015-04-15 16:45:45

标签: c# try-catch sqlconnection sqlcommand sqlexception

我正在使用SqlConnection,SqlDataAdapter和SqlCommand。

我只是想知道以下代码是否正确,如果可能的话,更好的方法是什么。

private void FillWithData(int id)
{
    try
    { 
       LoadTable1(id);
    }
    catch(Exception ex){throw ex}
}

private void LoadTable1(SqlConnection conn, int id)
{
   try
   {
       using (conn = new SqlConnection(sConnectionString)) 
       using (SqlDataAdapter table1DA = new SqlDataAdapter ())
       {
          DataTable tblTable1 = Table1;
          SqlCommand table1CMD = getSelectTable1(conn, id);
          table1DA.SelectCommand = table1CMD;
          table1DA.Fill(tblTable1);
          table1CMD.Dispose();
       }
   }
   catch(SqlException ex)
   {
       if (conn.State == ConnectionState.Open) conn.Close();
       conn.Dispose();
       throw ex;   
   }
   finally
   {
       try
       {
          if (conn.State == ConnectionState.Open) conn.Close();
       }
       catch (Exception){}
       conn.Dispose();
   }         
}

我还有更多方法可以为其他表做同样的事情。目前,所有内容都在一个方法下执行,该方法具有try/catch块,其中定义了每个表的SqlDataAdapterSqlCommands。我的目标是将不同表的逻辑分成不同的方法

1 个答案:

答案 0 :(得分:2)

我看到了一些可能的改进:

  1. 不要吞下异常(catch (Exception){}) - 要么处理它,要么让它冒泡。
  2. 您无需关闭或处置连接 - using块将为您执行此操作
  3. 您应该将SqlCommand放在using区块中。
  4. 您在连接中传递但随后覆盖 local 变量 - 传入的连接不会更改。为什么要有参数?
  5. throw ex;不是最佳做法,因为您丢失了原始堆栈跟踪 - 最好只改为throw;。由于除了关闭连接(这是不必要的)之外,您不会在catch块中执行任何操作,因此可以完全删除catch块。
  6. 进行这些更改只会让您:

    private void FillWithData(int id)
    {
        LoadTable1(id);
    }
    private void LoadTable1(int id)
    {
       using (SqlConnection conn = new SqlConnection(sConnectionString)) 
       using (SqlDataAdapter table1DA = new SqlDataAdapter ())
       using (SqlCommand table1CMD = getSelectTable1(conn, id))
       {
          DataTable tblTable1 = Table1;
          table1DA.SelectCommand = table1CMD;
          table1DA.Fill(tblTable1);
       }
    }
    

    由于SqlDataAdapter有一个带SQlCommand的构造函数,你可以这样做:

    private void LoadTable1(int id)
    {
       using (SqlConnection conn = new SqlConnection(sConnectionString)) 
       using (SqlCommand table1CMD = getSelectTable1(conn, id))
       using (SqlDataAdapter table1DA = new SqlDataAdapter (table1CMD))
       {
          table1DA.Fill(Table1);
       }
    }