С# Используя метод SQL, нужен метод закрытия?

При использовании блока using для SQL-соединений в С# это также метод закрытия? Я спрашиваю, так как мне нужно явно использовать метод con.Open(). Я нашел этот пример:

using (SqlConnection con = new SqlConnection(connectionString))
{
   con.Open(); // open method

   string queryString = "select * from db";
   SqlCommand cmd = new SqlCommand(queryString, con);
   SqlDataReader reader = cmd.ExecuteReader();
   reader.Read();

   ???         // What about a close method?
}

Или блок using сам закрывает соединение?


person mnlfischer    schedule 25.03.2013    source источник
comment
using вызовет Dispose соединения, а Dispose вызовет Close.   -  person Daniil    schedule 25.03.2013
comment
поэтому, когда я его использую, использование закроет все соединения. Все соединения означают глобальные или только эти соединения в этом методе/классе, где они находятся?   -  person mnlfischer    schedule 25.03.2013
comment
@ManuelFischer использует только соединение в операторе (SqlConnection iWillDisposeConn = new...   -  person Daniil    schedule 25.03.2013
comment
Вы действительно должны иметь свою команду и считыватель в блоках using - они тоже одноразовые.   -  person Damien_The_Unbeliever    schedule 25.03.2013


Ответы (5)


using переводится как:

SqlConnection con = new SqlConnection(connectionString)
try
{
   con.Open(); <-- open method

   string queryString = "select * from db";
   SqlCommand cmd = new SqlCommand(queryString, con);
   SqlDataReader reader = cmd.ExecuteReader();
   reader.Read();
}
finally
{
    if (con!= null)
        ((IDisposable)con).Dispose();
}

где ((IDisposable)con.Dispose(); закрывает то, что должно быть закрыто.

person Andrey    schedule 25.03.2013

Вам не нужно закрывать его - достаточно using. MSDN говорит:

Чтобы соединения всегда были закрыты, откройте соединение внутри блока using, как показано в следующем фрагменте кода. Это гарантирует, что соединение будет автоматически закрыто, когда код выйдет из блока.

person psur    schedule 25.03.2013

Нет, вам не нужно вызывать Close-метод SqlConnection. Когда он утилизируется в конце использования, он автоматически закрывается. (Метод Dispose вызывает Close()) [1]

person jAC    schedule 25.03.2013

Другие ответы верны, однако я хочу быть немного более точным.
MSDN сообщает следующее:

Close и Dispose функционально эквивалентны.

Поскольку использование using вызовет Dispose, отдельный вызов Close не требуется.

person Daniel Hilgarth    schedule 25.03.2013

когда вы используете ключевое слово «using» и создаете в нем соединение. соединение открыто до тех пор, пока существует область действия ключевого слова «использование» при достижении закрывающей скобки соединение автоматически закрывается, поскольку оно было определено в области действия, а область действия не существует

другими словами, рассматривайте его как локальную переменную, к которой можно получить доступ только в пределах области видимости. надеюсь, это поможет.

person XTGX    schedule 25.03.2013