2013-03-11 71 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(在連接上一個),因爲配置的連接將配置你需要的一切處置。

但是,處理所有內容沒有什麼壞處,只需要更多的代碼。