【问题标题】:SqlClient error after updating Windows - "The incoming tabular data stream (TDS) remote procedure call > (RPC) protocol stream is incorrect"更新 Windows 后出现 SqlClient 错误 - “传入的表格数据流 (TDS) 远程过程调用 > (RPC) 协议流不正确”
【发布时间】:2018-10-24 16:48:44
【问题描述】:

自从将 Windows 10 更新到 1803 后,每当我运行一个 EF 查询来连接一个接受标量参数的表值函数时,我都开始收到此错误。

消息:传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。参数 2 (""):数据类型 0x00 未知。

堆栈跟踪:在 System.Data.SqlClient.SqlCommand.c.b__180_0(Task1 结果)在 System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke() 在 System.Threading.Tasks.Task.Execute() --- 堆栈跟踪结束 以前抛出异常的位置---在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 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 的连接,查询就会运行。上面 EF 查询生成的 SQL 在 SSMS 中运行良好。

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

【问题讨论】:

  • 我有完全相同的问题,相同的代码适用于 Windows 7。我尝试了许多不同的方法,但仍然无法正常工作。我设法让它工作的一种方法是使用非异步方法
  • 我在 GitHub 上打开了一张票,并在那里引用了这个问题:github.com/aspnet/EntityFramework6/issues/537
  • 感谢您帮助确认我没有疯。很高兴了解异步部分。我在我的主要工作 PC 上将系统还原回 1709,然后我又恢复了运行。
  • 更新 - 工程师开发了一个 SQL DB 服务器端修复程序,并正在通过安全部署过程推出。预计 24-48 小时。

标签: sql-server azure-sql-database sqlclient .net-4.7.2


【解决方案1】:

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

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

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

我们正在以明智/安全的速度尽快部署、验证和修复。目前,该修复已部署到我们生产能力的大约 10%,预计在 5 月 21 日星期一之前完成。

【讨论】:

  • 感谢您的快速回复。我已经验证这已经修复了我连接到的所有 SQL Azure 服务器。
【解决方案2】:

我们正在调查这可能是 .NET Framework 上 SqlClient 的回归。任何可以提供复制项目的人,请将其发布到https://github.com/Microsoft/dotnet/issues/749

【讨论】:

  • 到目前为止,我只能使用 EDMX 为我的数据库重新创建它。一个指向更简单的 EDMX 的 repro 项目没有引发错误。在错误停止之前,我仍在尝试简化我的 EDMX 副本。
【解决方案3】:

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

已报告此问题并正在处理中。他们仍然需要复制,我仍在努力隔离我可以公开的可共享数据:

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

TDS Error on Azure Entity Framework SQL Calls after Windows 10 April 2018 Update的重复问题

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • 更新 - 根据我们的调查,只有 Azure SQL DB 客户受到影响。我们计划在大约 24 小时内在 Azure SQL DB 服务端部署一个修复程序。同时,上面提到的解决方法是有效的(回滚更新、禁用 MARS 或删除 async/await)。
    【解决方案5】:

    对我来说,解决方案是将因使用 .Include 而濒临死亡的查询转换为 .IncludeOptimized,现在它可以工作了。

    【讨论】:

      猜你喜欢
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      相关资源
      最近更新 更多