从服务器接收结果时发生传输级错误。 “管道已经结束了。”

Posted

技术标签:

【中文标题】从服务器接收结果时发生传输级错误。 “管道已经结束了。”【英文标题】:A transport-level error has occurred when receiving results from the server. "The pipe has been ended." 【发布时间】:2018-06-11 08:29:17 【问题描述】:

我目前在连接 SQL localdb 的 SQL 服务器 express 实例的构建服务器上运行一些单元测试时遇到以下异常。

System.Data.SqlClient.SqlException: A transport-level error has occurred when receiving results from the server. (provider: Named Pipes Provider, error: 0 - The pipe has been ended.) ---> System.ComponentModel.Win32Exception: The pipe has been ended.

由于各种原因,例如读取或插入单元测试的测试数据,此错误最近一直弹出。

我们的开发机器和构建服务器使用 SQL 本地数据库 (MSSQLLOCALDB) 的默认实例,我们只在构建服务器上看到过这个问题。这可能是因为构建服务器在同一台服务器上并行运行多组单元测试,并且管道正在为我们结束吗?每组单元测试都使用自己的数据库,因此它们不应相互冲突。

查看 Stack Overflow 和 Google 上的类似问题,我尝试通过为 SQLEXPRESS 启用“命名管道”和“TCP/IP”协议来解决该问题,但未能成功解决该问题。

任何帮助将不胜感激,如果需要,我可以提供任何额外信息。

谢谢

【问题讨论】:

我们能看到抛出这个异常的区域周围的代码吗?我猜你是用 C# 编写的。 @Dragonthoughts 是的,我们正在为我们的 ORM 使用 C# 以及 Dapper 和 Dapper Extensions 的混合。这是 Dapper 的最小方法,我们只是调用标准的 Dapper Extensions 插入方法,如此处所示 (github.com/tmsmith/Dapper-Extensions#simple-insert-operation)。到目前为止,我们的方法实现还没有看到这个错误,只是单元测试抛出了这个异常。 【参考方案1】:

原来我们用于创建本地数据库的 nuget 包比预期更早地关闭了默认实例的管道。我们通过为每组测试创建一个新的 localdb 实例并在测试运行后删除该实例来解决此问题。

【讨论】:

以上是关于从服务器接收结果时发生传输级错误。 “管道已经结束了。”的主要内容,如果未能解决你的问题,请参考以下文章

记一次数据库奇怪问题 “在从服务器接收结果时发生传输级错误。 (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。)"...

在向服务器发送请求时发生传输级错误。

接收 HTTP 响应时发生 WCF 服务错误

在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。)

在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 -

SQL Server相关知识和经验的碎片化记录