更新后的 SqlClient 错误 Windows - "The incoming tabular data stream (TDS) remote procedure call > (RPC) protocol stream is incorrect"

SqlClient error after updating Windows - "The incoming tabular data stream (TDS) remote procedure call > (RPC) protocol stream is incorrect"

自从将 Windows 10 更新为 1803 后,每当我 运行 一个 EF 查询加入了一个接受标量参数的 table 值函数时,我就开始收到这个错误.

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()

我在 .NET 4.6 框架项目中使用 Entity Framework v6.2。我使用 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 的连接,查询 运行s。 运行 以上 EF 查询生成的 SQL 在 SSMS 中正常。

编辑 5/15/2018: 我已经确认这是由 .NET Framework 4.7.2 引起的。我在我的 Windows 10 1709 计算机上手动安装了 .NET 4.7.2,然后错误再次启动。

我们正在调查这可能是 .NET Framework 上的 SqlClient 的回归。任何可以提供重现项目的人,请在 https://github.com/Microsoft/dotnet/issues/749 处 post 请求它。

临时解决方法: 根据 ChainbridgeTech 在我的连接字符串中将 MultipleActiveResultSets 从 TRUE 更改为 FALSE ,错误停止。

这已被报告并正在处理中。他们仍然需要一个复制品,我仍在努力隔离我可以制作的可共享数据 public:

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

重复问题

我的解决方案是将因使用 .Include 而死的查询转换为 .Include Optimized,现在可以使用了。

Microsoft 正在积极研究此问题。根据我们目前所知,该问题与使用 async/await 时带有 MARS(多个活动结果集)的 .NET framework 4.7.2 有关。

已知的解决方法包括回滚 Windows/.NET 框架更新,不使用 MARS 或不使用 async/await。

如果您有其他信息可以帮助我们缩小范围,请添加到 https://github.com/Microsoft/dotnet/issues/749

的问题报告中

我叫 Peter Carlin,在 SQL 服务器团队工作。我首先要为这件事以及对 .NET Framework 4.7.2 用户的影响表示歉意。接下来我想更详细地解释发生了什么以及微软是如何修复它的。

问题是由于 SQL 中 Always Encrypted 功能的改进所致。这些改进扩展了可在 Always Encrypted 中完成的操作集,但它们尚未准备好供应用程序使用。这些改进涉及对 SqlClient 和 SQL 服务器端的更改。我们在 .NET Framework 4.7.2 中引入了一个错误,使得在某些情况下(与 MARS 相关)SqlClient 错误地认为添加的功能正在使用中并向 SQL 发送无效请求。 SQL 拒绝那些在该线程中看到错误消息的人。仅当连接到也支持添加功能的 SQL 服务器时才会发生这种情况。 SQL 数据库最先获得最新的 SQL 更改,并且最近部署了添加的功能。

我们的即时修复是确保 SQL 数据库就像它没有添加的功能一样运行,因此不会遇到 4.7.2 中的 SqlClient 端错误。这就是我们能够通过 SQL 数据库端更改来解决问题的原因。

我们正以最快的速度 wise/safe 部署、验证修复程序。此时,修复已部署到我们大约 10% 的生产能力,预计将于 5 月 21 日星期一完成。