SqlDataAdapter закрывает SqlConnection после функции Fill ()? - PullRequest
7 голосов
/ 12 сентября 2011

SqlDataAdapter закрывает SqlConnection после функции Fill() или мне нужно самому закрывать его?

string cnStr = @"Data Source=TEST;Initial Catalog=Suite;Persist Security Info=True;User ID=app;Password=Immmmmm";
cn = new SqlConnection(cnStr);
SqlCommand cmd = new SqlCommand("SELECT TOP 10 * FROM Date", cn);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);

DataSet ds = new DataSet();
adapter.Fill(ds);

cn.Close() // ????????

Console.WriteLine(ds.Tables[0].Rows.Count);
Console.WriteLine(cn.State);

Ответы [ 2 ]

14 голосов
/ 12 сентября 2011

При вашем текущем использовании он закроется для вас:

Если IDbConnection закрывается до вызова Fill, он открывается для извлечения данных, а затем закрывается.Если соединение открыто до вызова Fill, оно остается открытым.

http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx

Я думаю, что всегда лучше явно обслуживать его самостоятельно с помощью оператора using:

using (SqlConnection conn = new SqlConnection(""))
{
    conn.Open();

    // Do Stuff.

} // Closes here on dispose.

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

Однако, если вы знать соединение закрывается до того, как адаптер его использует (например, вы только что создали соединение), и оно не используется ни для чего другого, ваш код совершенно безопасен и действителен.

ЛичноЯ бы написал что-то вроде этого:

    string cnStr = "Data Source=TEST;Initial Catalog=Suite;Persist Security Info=True;User ID=app;Password=Immmmmm";
    DataSet ds = new DataSet();

    using (SqlConnection cn = new SqlConnection(cnStr))
    using (SqlCommand cmd = new SqlCommand("SELECT TOP 10 * FROM Date", cn))
    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
    { 
        conn.Open();
        adapter.Fill(ds);       
    }
4 голосов
/ 12 сентября 2011

Как я знаю, вам нужно закрыть соединение самостоятельно

Лучший способ сделать это -

using(SqlConnection con = new SqlConnection())
{
   // you code 
}

, это автоматически закроет ваше соединение

, используя блокировку вC # очень удобен при работе с одноразовыми предметами.Одноразовые объекты - это те объекты, которые могут явно освобождать ресурсы, которые они используют при вызове для удаления.Как мы знаем, сборка мусора .Net не является детерминированной, поэтому вы не можете предсказать, когда именно объект будет собирать мусор.

Прочтите этот пост более подробно: понимание блока 'using' в C #

...