Соединение с SQL Server не закрывается в веб-приложении ASP.net - PullRequest
0 голосов
/ 19 мая 2011

Я написал веб-приложение и во время тестирования обнаружил, что соединения, установленные с сервером, не закрываются, даже если я закрываю соединение в приложении. Даже после закрытия веб-страницы соединение остается без изменений. Вот пример кода, который открывает соединение и закрывает его:

protected void OpenConnection_Click(object sender, EventArgs e)
{
    SqlConnection conn = null; 
    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
    builder.DataSource = "MyServerName";
    builder.InitialCatalog = "Northwnd";
    builder.IntegratedSecurity = true;
    builder.ApplicationName = "My Test ASP";

    try
    {
        conn = new SqlConnection(builder.ConnectionString);
        conn.Open();
        conn.Close();
    }
    catch (SqlException ex)
    {
        ex.Message.ToString();
    }

}

В мониторе активности соединение остается. Если я выполняю тот же код в обычном приложении Windows, соединение закрывается правильно.

Пожалуйста, помогите мне, как решить эту проблему.

Ответы [ 5 ]

2 голосов
/ 19 мая 2011

Вы должны использовать using для лучшего управления ресурсами.В вашем коде есть большой недостаток: если ваш код встречает исключение, соединение не будет закрыто, и это вызовет серьезные проблемы.Перезапись вашего кода приведет к:

protected void OpenConnection_Click(object sender, EventArgs e)
{
    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
    builder.DataSource = "MyServerName";
    builder.InitialCatalog = "Northwnd";
    builder.IntegratedSecurity = true;
    builder.ApplicationName = "My Test ASP";

    using (SqlConnection conn = new SqlConnection(builder.ConnectionString))
    {
    try
    {
        conn.Open();
        // Do Some stuff with SqlConnection
    }
    catch (SqlException ex)
    {
        ex.Message.ToString();
    }
  }
}

Когда блок using заканчивается, он автоматически вызывает метод dispose для переменной using, которая здесь SqlConnection.Обратите внимание, что вызов dispose для SqlConnection также вызовет его метод Close (), вы можете исследовать его в отражателе.

0 голосов
/ 19 мая 2011

Убедитесь, что не генерируется исключение, в противном случае вызов conn.Close() может никогда не выполняться.

0 голосов
/ 19 мая 2011

Попробуйте это

using (SqlConnection conn = new SqlConnection(builder.ConnectionString)
    {
        conn.Open();
        conn.Close();
        conn.Dispose();
    }
0 голосов
/ 19 мая 2011

Я думаю con.Dispose отсутствует.

Альтернативный

использование оператора для экземпляра SQL-соединения

using(sqlconnection con = new sqlconnection())
{
   Your logic
}

При этом соединение автоматически удаляется.

0 голосов
/ 19 мая 2011

попробуйте ввести соединение в использование, как-то так:

protected void OpenConnection_Click(object sender, EventArgs e)
{
    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
    builder.DataSource = "MyServerName";
    builder.InitialCatalog = "Northwnd";
    builder.IntegratedSecurity = true;
    builder.ApplicationName = "My Test ASP";

    using(var conn = new SqlConnection(builder.ConnectionString)) 
    {
        try
        {
            conn.Open();
        }
        catch (SqlException ex)
        {
            ex.Message.ToString();
        }
    }
}

использование автоматически удалит соединение для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...