Ошибка транспортного уровня при получении результатов с сервера [закрыт]

169

Я получаю ошибку SQL Server:

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

Я использую Sql Server 2008 SP1, Windows 2008 Standard 64 bit.

Это веб-приложение .Net 4.0. Это происходит при запросе к серверу. Это прерывисто. Любая идея, как я могу решить это?

Чак Конвей
источник
3
Это может произойти, если база данных была создана в более старой версии SQL Express / MSDE, в которой для AUTO_CLOSE установлено значение True. Или экземпляр службы SQL Server был перезапущен.
Devstuff
1
Я могу быть вызван отложенным действием на твоей БД. этот результат в блокировке БД.
пикс
4
Отмеченный ответ не является ответом. Ответ Майкла Оливеро ниже, который на самом деле предоставляет контент, и следуя ему, я решил проблему, когда столкнулся с ней. (Вручную закрыть временный веб-сервер на моем компьютере разработчика.) Я рекомендую изменить ответ.
Адам Миллер
3
@Flexo Это закрыто как не по теме? Я только что случился со мной с совершенно новыми установками VS 2017 и MS SQL 2016 Enterprise. В то время как он работал просто отлично с VS 2015 сообщества.
Эдвард
1
Это не должно быть не по теме. Проблема не имеет ничего общего с используемым кодом, поэтому MCVE не может быть создан для него. Кроме того, причина закрытия гласит: this one was resolved in a manner unlikely to help future readers- но 179 тысяч человек сталкивались с этим вопросом.
Нисарг

Ответы:

102

Соединение с базой данных закрыто сервером базы данных. Соединение остается действительным в пуле соединений вашего приложения; в результате, когда вы берете общую строку подключения и пытаетесь выполнить ее, она не может достичь базы данных. Если вы разрабатываете Visual Studio, просто закройте временный веб-сервер на панели задач.

Если это происходит в рабочей среде, сброс пула приложений для вашего веб-сайта должен перезапустить пул соединений.

Майкл Оливеро
источник
1
Это фактический ответ.
TheHuge_
2
В моем конкретном случае у меня была MultipleActiveResultSets=Trueнастройка в строке подключения, которая вызвала ту же ошибку.
Семен Выскубов
17

Попробуйте следующую команду в командной строке:

netsh interface tcp set global autotuning=disabled

Это отключает возможности автоматического масштабирования сетевого стека

Simmo
источник
20
Можете ли вы предоставить некоторые подробности о том, что это на самом деле делает? Есть ли какие-либо причины против установки такого значения в глобальном масштабе?
Дрю Ноакс
1
он отключает возможности автоматического масштабирования сетевого стека.
Симмо
Не работает в Windows XP SP3. Интерфейс Netsh не имеет подкоманды tcp в Windows XP, однако он хорошо работает в Windows 7 SP1.
Нараянан
Я знаю, что это старое, но это было единственное решение, которое работало для меня (большинство проблем / решений вращаются вокруг веб-сервера / приложения, моя ситуация - приложение для настольного компьютера и сервер локальной сети, IIS или что-то подобное). Почему отключение автонастройки / автомасштабирования решило эту проблему?
Трент
1
в моем случае ReOpen из SQL Server Management Studio решил проблему
Алекс
15

У меня такая же проблема. Я перезапустил Visual Studio, и это решило проблему

Piris
источник
12

Для тех, кто не использует IIS, у меня возникла эта проблема при отладке в Visual Studio 2010. Я завершил все процессы отладчика: WebDev.WebServer40.EXE, который решил эту проблему.

jth_92
источник
Пожалуйста, расскажите о том, как вы завершили этот процесс. Я новичок, и я не знаю, что вы подразумеваете под "завершил весь процесс
Unbreakable
@ Unbreakable Я только что использовал диспетчер задач. В диспетчере задач вы можете увидеть все запущенные процессы с именем WebDev.WebServer40.EXE. Смотрите betanews.com/2015/10/08/how-to-kill-a-windows-process, чтобы узнать, как завершить процесс Windows.
Jth_92
8

Ошибки транспортного уровня часто связаны с разрывом соединения с сервером sql ... обычно сетевым.

Timeout Expired обычно генерируется, когда выполнение sql-запроса занимает слишком много времени.

Так что несколько вариантов могут быть:

  1. Проверьте соединение в VPN (если используется) или любом другом инструменте
  2. Перезагрузите IIS
  3. Перезагрузить машину
  4. Оптимизировать SQL-запросы.
NG.
источник
Простой ответ, но сэкономил мое время.
Кирк
7

Все, что вам нужно, это остановить ASP.NET Development Server и снова запустить проект

MishMish
источник
4

Если вы подключены к базе данных через Microsoft SQL Server Management, закройте все ваши подключения и повторите попытку. Возникла эта ошибка при подключении к другой базе данных Azure и работала для меня, когда она закрывалась. Все еще не знаю почему ..

watabou
источник
Это было исправление, которое работало для меня. Я закрыл SQL Server Management Studio и больше никогда не видел эту ошибку.
Бивик
4

Получал это всегда после примерно 5 минут работы. Расследовал и обнаружил, что предупреждение от e1iexpress всегда появлялось до сбоя. По-видимому, это ошибка, связанная с некоторыми адаптерами TCP / IP. Но переход с WiFi на аппаратный не повлиял на это.

Итак, попробовал Plan B и перезапустил Visual Studio. Тогда все работало нормально.

При ближайшем рассмотрении я заметил, что при правильной работе сообщение The Thread '<No Name>' has exited with code 0появлялось почти в то же время, когда во время предыдущих попыток произошел сбой запуска. В некоторых поисках Google обнаруживается, что это сообщение появляется, когда (среди прочего) сервер обрезает пул потоков.

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

Горячие лижет
источник
4

Посмотрите на блог MSDN, в котором подробно описана эта ошибка:

Удаление подключений

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

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

Недействительные соединения удаляются из пула соединений только тогда, когда они закрыты или восстановлены.

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

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

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

По сути, вы видите это исключение в последнем предложении.

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

И вы получите свое исключение.

Есть несколько общих причин для этого.

  1. Сервер был перезапущен, это закроет существующие соединения.

В этом случае посмотрите журнал SQL Server, который обычно находится по адресу: C: \ Program Files \ Microsoft SQL Server \\ MSSQL \ LOG.

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

2009-04-16 11: 32: 15.62 Сервер регистрирует сообщения SQL Server в файле 'C: \ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ LOG \ ERRORLOG'.

  1. Кто-то или что-то убило используемый SPID.

Опять же, посмотрите в журнал SQL Server. Если вы обнаружите убийство, попробуйте соотнести эту временную метку со временем исключения.

2009-04-16 11: 34: 09.57 spidXX Идентификатор процесса XX был уничтожен именем хоста xxxxx, идентификатор процесса хоста XXXX.

  1. Снова происходит отработка отказа (например, в настройке зеркала), посмотрите журнал SQL Server.

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

2009-04-16 11: 35: 12.93 spidXX Зеркальная база данных «» меняет роли с «ОСНОВНОГО» на «ЗЕРКАЛО» из-за сбоя.

Рахул Трипати
источник
3

Вы получаете это сообщение, когда ваш сценарий заставляет SQL Service останавливаться по некоторым причинам. поэтому, если вы снова запустите службу SQL, возможно, ваша проблема будет решена.

Мухаммед Шейхолеслам
источник
Просьба сообщить о том, как запустить службу SQL. Я новичок, и я только что создал приложение asp.net mvc 5. и когда я запускаю «enable-migrations», все в порядке, затем я запускаю «add -igration» sdfd «, все в порядке, а затем, когда я нажимаю на update-database, я получаю эту ошибку. Пожалуйста, сообщите мне
Unbreakable
3

Я знаю, что это не может помочь всем (кто знает, может быть, да), но у меня была та же проблема, и через некоторое время мы поняли, что причина была в чем-то не в самом коде.

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

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

route add p YourServerNetwork mask NetworkMask Router 

Образец:

route add p 172.16.12.0 mask 255.255.255.0 192.168.11.2 

Я надеюсь, что это кому-то поможет, лучше иметь это, по крайней мере, в качестве подсказки, поэтому, если вы сталкиваетесь с этим, вы знаете, как решить эту проблему.

coloboxp
источник
2

Я получил ту же ошибку в среде разработки Visual Studion 2012, остановил IIS Express и перезапустил приложение, оно заработало.

Мурти М
источник
2

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

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

введите описание изображения здесь

user3447136
источник
1

Я была такая же проблема. Я решил это, обрезав SQL Server LOG. Проверьте это, а затем сообщите нам, помогло ли вам это решение.

Лукас
источник
1

Для меня ответ - обновить ОС с 2008R2 до 2012R2, решение iisreset или restart apppool у меня не сработало. Я также попытался включить настройку TCP Chimney Offload, но я не перезагружал сервер, потому что это рабочий сервер, который тоже не работал.

Брюс Лю
источник
1

Для меня решение было совершенно другим.

В моем случае у меня был объектный источник, для которого требовался параметр datetimestamp. Несмотря на то, что параметр ODS ConvertEmptyStringToNull был истинным, 1/1/0001 передавался в SelectMethod. Это, в свою очередь, вызвало исключение переполнения даты и времени sql, когда дата и время были переданы серверу sql.

Добавлена ​​дополнительная проверка для datetime.year! = 0001, и это решило ее для меня.

Странно, что это вызовет ошибку транспортного уровня, а не ошибку переполнения даты и времени. В любом случае ..

KonaRin
источник
1
это никак не связано, это должно было быть случайно
Michiel Cornille
1

Недавно мы столкнулись с этой ошибкой между нашим бизнес-сервером и сервером базы данных. Для нас решением было отключить «IP Offloading» на сетевых интерфейсах. Тогда ошибка ушла.

Дейв
источник
1

Одна из причин, по которой я обнаружил эту ошибку, - « Размер пакета = xxxxx » в строке подключения. если значение xxxx слишком велико, мы увидим эту ошибку. Удалите это значение и дайте SQL-серверу обработать его или оставьте его низким, в зависимости от возможностей сети.

Нареш Миттал
источник
1

Это случилось со мной, когда я пытался восстановить базу данных SQL и установил следующий флажок на Optionsвкладке,

введите описание изображения здесь

Поскольку это отдельный сервер баз данных, просто закрытие SSMS и повторное его открытие решили эту проблему для меня.

Мухаммед Раджа
источник
1

Это происходит, когда база данных удаляется и воссоздает некоторые общие ресурсы, все еще считая, что база данных по-прежнему существует, поэтому при повторном запуске запроса на выполнение для создания таблиц в базе данных после ее повторного создания ошибка не будет отображаться снова и Command(s) completed successfully.сообщение покажет вместо сообщения об ошибке Msg 233, Level 20, State 0, Line 0 A transport-level error has occurred when sending the request to the server. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.).

Просто игнорируйте эту ошибку, когда вы отбрасываете и воссоздаете базы данных, и без проблем выполняйте ваши DDL-запросы.

Ашраф Абусада
источник
0

Я недавно столкнулся с той же проблемой, но я не смог получить ответ в Google. Мысль поделиться этим здесь, чтобы он мог помочь кому-то в будущем.

Ошибка:

При выполнении запроса запрос будет выдавать мало информации, тогда он выдаст ошибку ниже.

«Ошибка транспортного уровня при получении вывода с сервера (TCP: поставщик, ошибка: 0 - указанное сетевое имя больше не доступно»)

Решение:

  1. Проверьте провайдера этого связанного сервера
  2. В свойствах этого провайдера включите опцию «Разрешить inprocess» для этого конкретного провайдера, чтобы устранить проблему.
Pradeepa.PK
источник