2013-03-11 62 views
2

下面的代码是否健康?或者我不需要使用using关键字,因为SqlDataAdapter将处理关闭连接?使用关键字SqlDataAdapter

public static DataSet Fetch(string sp, SqlParameter [] prm) 
{ 
    using (SqlConnection con = new SqlConnection(ConStr)) 
    { 
     using (SqlCommand cmd = con.CreateCommand()) 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.CommandText = sp; 
      cmd.Parameters.AddRange(prm); 

      using (SqlDataAdapter dta = new SqlDataAdapter(cmd)) 
      { 
       DataSet dst = new DataSet(); 
       dta.Fill(dst); 

       return dst; 
      } 
     } 
    } 
} 


@MarkGravell我在这里需要建议,我真的希望使用DataReader,但我一直在寻找所有使用using关键字,以确保关闭连接的时间。 DataReader我们不能使用它,因为如果我们想返回DataReader回到某种方法它会关闭连接。 那么你认为以下技术是罚款DataReaderusing关键字:

public static SqlDataReader Fetch(string sp, SqlParameter [] prm) 
{ 
    SqlCommand cmd = new SqlConnection(ConStr).CreateCommand(); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = sp; 
    cmd.Parameters.AddRange(prm); 
    cmd.Connection.Open(); 

    return cmd.ExecuteReader(CommandBehavior.CloseConnection); 
} 

using (SqlDataReader dtrPrize = Sql.Fetch("SelectPrize", new SqlParameter[] { new SqlParameter("id", id) })) 
{ 
    dtrPrize.Read(); 

    Prize prize = new Prize(); 
    prize.id = (int)dtrPrize[dtrPrize.GetOrdinal("id")]; 
    prize.artitle = (string)dtrPrize[dtrPrize.GetOrdinal("artitle")]; 
    prize.entitle = (string)dtrPrize[dtrPrize.GetOrdinal("entitle")]; 
    prize.ardetail = (string)dtrPrize[dtrPrize.GetOrdinal("ardetail")]; 
    prize.endetail = (string)dtrPrize[dtrPrize.GetOrdinal("endetail")]; 
    prize.image = (string)dtrPrize[dtrPrize.GetOrdinal("image")]; 
    prize.theme = (string)dtrPrize[dtrPrize.GetOrdinal("theme")]; 
    prize.price = (int)dtrPrize[dtrPrize.GetOrdinal("price")]; 
    prize.audience = (int)dtrPrize[dtrPrize.GetOrdinal("audience")]; 
    prize.type = (byte)dtrPrize[dtrPrize.GetOrdinal("type")]; 
    prize.status = (byte)dtrPrize[dtrPrize.GetOrdinal("status")]; 
    prize.voucher = (string)dtrPrize[dtrPrize.GetOrdinal("voucher")]; 
    prize.supplierid = (int)dtrPrize[dtrPrize.GetOrdinal("supplierid")]; 
    prize.created = (DateTime)dtrPrize[dtrPrize.GetOrdinal("created")]; 
    prize.updated = (DateTime)dtrPrize[dtrPrize.GetOrdinal("updated")]; 

    return prize; 
} 
+3

的代码是罚款。 'Connection'将隐式地在'DataAdapter.Fill'中打开/关闭。 – 2013-03-11 07:49:08

回答

4

Healthy-ish;我个人认为这个不健康的位是它使用DataSetDataAdapter的位,但这也许只是我个人的偏见。

是的,你应该在这里处理适配器等等(这显然是using为你做的)。

作为一个平凡的毫无意义的整洁,可以叠加的using秒 - 只是使它少一些冗长:

using (SqlConnection con = new SqlConnection(ConStr)) 
using (SqlCommand cmd = con.CreateCommand()) 
{ 
+0

@MarkGravell你能解释一下,为什么适配器也应该被处置? SqlConnection是否配置不够? – Alex 2013-03-11 07:55:51

+3

@voo因为它实现了'IDisposable',所以我们完成了它。这就够理由了。除此之外的任何内容都将进入实施细节,我们应该避免这些细节。作为一个消费者,所有需要回答的是:“它是否实现了'IDisposable'?我完成了它吗?” – 2013-03-11 08:09:48

+0

@MarkGravell如你所说DataAdapter和DataSet可能不健康,你的意思是使用DataReader更好,将它映射到一个对象,关闭连接并最终返回模型对象而不是返回DataSet?你在这里的建议是什么? – user2155873 2013-03-11 08:49:11

0

这将足以只留下第一using(在连接上一个),因为配置的连接将配置你需要的一切处置。

但是,处理所有内容没有什么坏处,只需要更多的代码。