2013-03-11 2 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 к некоторому методу. Так что вы думаете, что следующий метод хорошо с DataReader и using ключевое слово:

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

Код отлично. «Соединение» будет открыто/закрыто в «DataAdapter.Fill». –

ответ

4

Здоровый образ; лично я бы сказал, что нездоровый бит - это бит, где он использует DataSet и DataAdapter, но это, пожалуй, только мое личное предубеждение.

Да, вы должны утилизировать адаптер и т. Д. Здесь (это то, что делает для вас using).

Как тривиальный бессмысленно аккуратным, вы можете сложить using с - просто делает его немного менее многословным:

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

@MarkGravell Не могли бы вы объяснить, почему адаптер также должен быть установлен? Является ли SqlConnection распоряжаться недостаточно? – Alex

+3

@voo Потому что он реализует 'IDisposable', и мы закончили с ним. Это достаточная причина. Все, что выходит за рамки этого, входит в детали реализации, чего нам следует избегать. Как потребитель, все, что нужно для этого, сводится к следующему: «реализует ли он« IDisposable »? Я поступил с ним?» –

+0

@MarkGravell, как вы упомянули, DataAdapter и DataSet могут быть нездоровыми, вы имеете в виду, что лучше использовать DataReader, сопоставить его с объектом, закрыть соединение и, наконец, вернуть объект модели, а не возвращать DataSet? Каковы ваши рекомендации здесь? – user2155873

0

Это будет достаточно, чтобы оставить только первый using (один на подключение), поскольку расположени соединение будет располагать все, что вам нужно расположены.

Однако нет никакого вреда, избавляя все, всего лишь немного больше кода.

Смежные вопросы