Ошибка SqlClient после обновления Windows - "Входящий поток табличных данных (TDS) удаленный вызов процедуры> (RPC) поток протокола неверен"

После обновления Windows 10 до 1803 я начал получать эту ошибку каждый раз, когда запускаю запрос EF, который присоединяется к функции с табличным значением, которая принимает скалярный параметр.

Message: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 2 (""): Data type 0x00 is unknown.

Stack Trace: at System.Data.SqlClient.SqlCommand.<>c.b__180_0(Task1 result) at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke() at System.Threading.Tasks.Task.Execute() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.d__c.MoveNext()

Я использую Entity Framework v6.2 в проектах платформы .NET 4.6. Я убедился, что тот же код работает без проблем на другом компьютере с Windows 10 1709. Я обновил компьютер до Windows 10 1803 без каких-либо других изменений, и у меня появилась ошибка, указанная выше. Код, вызывающий ошибку:

var query = from fs in db.ViewWithInformation
            join e in db.GetEventsForPerson(personnelId) on fs.Event_Id equals e.Event_Id
            where !fs.Is_Deleted
            select fs;
return await query.ToArrayAsync();

Если я удалю соединение с db.GetEventsForPerson, запрос будет выполнен. SQL, сгенерированный указанным выше запросом EF, отлично работает в SSMS.

Изменить 15/5/2018: Я подтвердил, что это специально вызвано .NET Framework 4.7.2. Я вручную установил .NET 4.7.2 на свой компьютер с Windows 10 1709, и ошибка снова началась.

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

DotnetShadow 15.05.2018 09:02

Я открыл заявку на GitHub и упомянул там эту проблему: github.com/aspnet/EntityFramework6/issues/537

DotnetShadow 15.05.2018 09:11

Спасибо, что помогли подтвердить, что я не сумасшедший. Полезно знать об асинхронной части. Я восстановил систему до 1709 на моем основном рабочем ПК, и я снова в работе.

Zach Green 15.05.2018 14:39

Обновление - инженеры разработали исправление на стороне сервера базы данных SQL и проходят процедуру безопасного развертывания. ETA 24-48 часов.

Joyce Lee 19.05.2018 19:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
4
5 203
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Мы исследуем это как возможную регрессию в SqlClient в .NET Framework. Любой, кто может предоставить репро-проект, разместит его на https://github.com/Microsoft/dotnet/issues/749.

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

Zach Green 16.05.2018 15:17

Временное решение: На ChainbridgeTech измените MultipleActiveResultSets с TRUE на FALSE в моей строке подключения, и ошибка прекратится.

Об этом сообщалось, и сейчас над этим работают. Им все еще нужна репродукция, и я все еще работаю над выделением общих данных, которые я могу опубликовать:

https://github.com/Microsoft/dotnet/issues/749

Повторяющийся выпуск Ошибка TDS при вызовах SQL Azure Entity Framework после обновления Windows 10 за апрель 2018 г.

Решением для меня было преобразовать запрос, который умирал от использования .Include, в .IncludeOptimized, и теперь он работает.

Microsoft активно занимается этим вопросом. Насколько нам известно, проблема связана с .NET framework 4.7.2 с MARS (множественные активные наборы результатов) при использовании async / await.

Известные обходные пути включают откат обновления Windows / .NET framework, без использования MARS или без использования async / await.

Если у вас есть дополнительная информация, которая поможет нам сузить круг вопросов, добавьте в отчет о проблеме на https://github.com/Microsoft/dotnet/issues/749

Обновление - на основании нашего расследования затронуты только клиенты базы данных SQL Azure. Мы планируем развернуть исправление на стороне службы Azure SQL DB примерно через 24 часа. Между тем, упомянутые выше обходные пути действительны (откат обновления, отключение MARS или удаление async / await).

Tomas Talius 19.05.2018 01:41
Ответ принят как подходящий

Меня зовут Питер Карлин, я работаю в команде SQL Server. Сначала я хочу извиниться за этот инцидент и за то, что он повлиял на пользователей .NET Framework 4.7.2. Далее я хочу более подробно объяснить, что произошло, и как Microsoft это исправляет.

Проблемы возникают из-за улучшений функции Always Encrypted в SQL. Эти улучшения расширяют набор операций, которые можно выполнять в Always Encrypted, однако они еще не готовы для использования приложениями. Эти улучшения включают изменения как на стороне SqlClient, так и на стороне SQL-сервера. Мы ввели ошибку в .NET Framework 4.7.2, так что в некоторых случаях (связанных с MARS) SqlClient неправильно считает, что добавленные функции уже используются, и отправляет недопустимые запросы в SQL. SQL отклоняет сообщения об ошибках, представленные в этой ветке. Это происходит только при подключении к серверу SQL, который также поддерживает дополнительные функции. База данных SQL первой получает последние изменения SQL и недавно развернула дополнительные функции.

Наше немедленное исправление состоит в том, чтобы убедиться, что база данных SQL работает так, как будто она не имеет дополнительных функций, поэтому ошибка стороны SqlClient в 4.7.2 не встречается. Вот почему мы можем решить проблему с помощью изменения стороны базы данных SQL.

Мы работаем так быстро, как разумно / безопасно, чтобы развернуть, проверить исправление. На данный момент исправление развернуто примерно на 10% наших производственных мощностей с ожидаемым завершением к понедельнику 21 мая.

Спасибо за быстрый ответ. Я убедился, что исправлены все серверы SQL Azure, к которым я подключаюсь.

Zach Green 22.05.2018 00:56

Другие вопросы по теме