Соединение SQL принудительно закрыто - PullRequest
2 голосов
/ 31 января 2012

У меня проблемы с SQL-запросом к Server 2008 из IIS7. У меня есть библиотека классов VB.NET, которая выполняет оператор обновления. Базовый код, используемый для создания соединения, не изменился, но внезапно запрос не выполняется в наших средах тестирования и разработки. Однако он все еще работает с тем же сервером / базой данных, используя немного более старый код в нашей производственной среде.

Я попытался установить тайм-аут соединения в web.config, и я не могу объяснить причину.

Базовая структура запроса:

Dim conn = New SqlConnection()
conn.ConnectionString = "Data Source=someserver\sqlexpress2008;Initial Catalog=DatabaseName;User ID=sa;Password=pass"
conn.Open()
Using cmd As SqlCommand = conn.CreateCommand()
    cmd.CommandText = "UPDATE ..."
    cmd.Parameters.AddWithValue("@UName", user.name)
    cmd.ExecuteNonQuery() 'fails with error
End Using

Ошибка:

Произошла ошибка транспортного уровня при отправке запроса сервер. (поставщик: поставщик TCP, ошибка: 0 - существующее соединение было принудительно закрывается удаленным хостом.)

Я попытался перезапустить IIS и сервер SQL, и у меня совершенно нет идей. Мне просто нужно исправить

Ответы [ 5 ]

2 голосов
/ 31 января 2012

Это помогло другому человеку, который недавно застрял.Вы можете исследовать проблему с сервера базы данных, настроив SQL Server Profiler .

. Вы можете найти много информации о SQL Profiler, просто погуглив.Вот сайт с видео , которое может помочь вам начать работу.Для начала вы сможете увидеть, достигает ли запрос даже сервер базы данных.

2 голосов
/ 31 января 2012

Вам необходимо открыть соединение перед звонком SqlCommand.ExecuteNonQuery(). Вы делаете это по телефону SqlConnection.Open().

Dim conn = New SqlConnection() 
conn.ConnectionString = "Data Source=someserver\sqlexpress2008;Initial Catalog=DatabaseName;User ID=sa;Password=pass" 
Using cmd As SqlCommand = conn.CreateCommand() 
    cmd.CommandText = "UPDATE ..." 
    cmd.Parameters.AddWithValue("@UName", user.name) 

    conn.Open()
    cmd.ExecuteNonQuery() 'fails with error 
    conn.Close()
End Using 

Также убедитесь, что ваша база данных не в однопользовательском режиме.

1 голос
/ 31 января 2012

Это был кошмар, чтобы выследить.Оказалось, это вызвано ужасной причудами в VB.NET.Nullable datetime, кажется, приведен к DateTime.MinValue, что привело к вставке DateTime.MinValue в sql datetime.Исправление заключалось в проверке либо !property.HasValue && property.Value != DateTime.MinValue при настройке параметров для команды.

0 голосов
/ 31 января 2012

Как сказал Lcarus, сервер базы данных разрывает соединение по неизвестной причине.Вы можете проверить журналы, чтобы verfiy.Путь к журналу будет C:\Program Files\Microsoft SQL Server\<your instance>\MSSQL\LOG

из блога MSDN Блог MSDN

, это будет происходить, когда соединение берется из пула соединений, приложение не выполняетзнать, что физическое соединение прервано, попытка использовать его осуществляется при условии, что физическое соединение все еще существует.

0 голосов
/ 31 января 2012

Это ошибка сетевого уровня. Сервер базы данных по какой-то причине разрывает соединение. Чтобы устранить эту проблему, я бы открыл соединение с использованием SSMS с серверами DEV и TEST и убедился, что могу выполнять простые запросы без проблем. Маловероятно, что проблема связана с вашей библиотекой, так как вы получите тайм-аут или другие ошибки.

...