更新 Windows 后 SqlClient 错误 - “传入的表格数据流 (TDS) 远程过程调用 > (RPC) 协议流不正确”

问题描述 投票:0回答:6

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

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

堆栈跟踪:位于 System.Data.SqlClient.SqlCommand.<>c.b__180_0(Task1 结果)在 System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke() at System.Threading.Tasks.Task.Execute() --- 堆栈跟踪结束 之前抛出异常的位置 --- at 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 中运行良好。

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

sql-server azure-sql-database sqlclient .net-4.7.2
6个回答
8
投票

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

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

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

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


3
投票

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


2
投票

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

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

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

Windows 2018 年 4 月 10 日更新后,Azure 实体框架 SQL 调用上出现 TDS 错误的重复问题


1
投票

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

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

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


0
投票

我的解决方案是将因使用 .Include 而无法使用的查询转换为 .IncludeOptimized,现在它可以工作了。


0
投票

我在使用 Dapper/EF 的原始 SQL 查询的查询中使用 DateOnly 时遇到此错误。通过将 WHERE 子句中的 DateOnly 输入转换为 DateTime 解决了该问题。如果您遇到类似的错误,请考虑重新访问您的查询。

© www.soinside.com 2019 - 2024. All rights reserved.