无法通过 .NET 应用程序使用命名管道连接到 SQL Server

Cannot connect to SQL Server using Named Pipes through .NET application

提问人:popo7ich 提问时间:10/22/2023 最后编辑:Black catpopo7ich 更新时间:10/24/2023 访问量:126

问:

首先,我正在尝试使这项工作,因为我的 Windows 窗体应用程序(从 Windows 10 运行)与我的 SQL Server 2012 VM 的“初始连接”花费的时间太长(一旦连接正常)。我读到,通过强制/使用命名管道而不是 TCP/IP,上述内容应该有相当大的改进。

话虽如此,我已经读了“很多”,是的,我发现了类似的帖子,但有同样的常规错误:

找不到服务器或无法访问服务器...命名管道提供程序,错误:40 - 无法打开与 SQL Server 的连接

我无法弄清楚如何使用 NP 协议连接到 SQL。我尝试直接通过应用程序连接字符串强制它(Server=np:MyServer 或 np:\MyServer\pipe\sql\query 或 \MyServer\pipe\MSSQL$MSSQLSERVER\sql\query 或 ;Network Library=dbnmpntw) 没有成功。

笔记:

  1. Windows 10 客户端和 Windows 2012 服务器上均未启用防火墙。
  2. SQL Server 上只有一个实例(默认为 MSSQLServer)。
  3. 已在 SQL 配置管理器中为 SQL 实例启用共享内存、命名管道和 TCP/IP 协议。
  4. Named Pipes 使用其默认值(未定义别名)。
  5. 当然,我已经重新启动了SQL Server服务,甚至重新启动了服务器。

在这一点上测试/复制问题,如果有人想帮助这个即将开枪自杀的家伙,我正在使用 Visual Studio - 视图 - 服务器资源管理器 - 数据连接 - 添加连接 - 数据提供程序 .NET Framework Data Provider for SQL Server,测试与 SQL Server 的正确/成功连接(使用 TCP/IP),然后转到“高级”并将“网络库”调整为“命名管道”(见下文)。再次测试连接按钮,如果您弄清楚如何获得成功的结果,请告诉我如何操作!(新连接属性中的连接字符串应该可以解决问题)

Visual Studio - 使用命名管道测试新的 SQL 连接

Visual Studio - Test new SQL Connection with Named Pipes

提前感谢您抽出时间接受采访。

sql-server vb.net visual-studio 连接字符串 命名管道

评论

0赞 David Browne - Microsoft 10/22/2023
连接需要多长时间?这不太可能是网络问题。
0赞 popo7ich 10/23/2023
嗨,大卫,在 3-5 秒内。VM/服务器 Windows/SQL2012 在 Hyper-V 中,相同的 Windows 10 笔记本电脑(客户端和服务器的内存使用率为 70%,处理器 Core i7 2.8Ghz 4 核)。Ping 到服务器 <1ms。
0赞 Andrew Morton 10/24/2023
数据库是否启用了自动关闭?这可能会导致第一次连接速度变慢。
0赞 popo7ich 10/24/2023
否定的,我正在使用默认值,我可以确认自动关闭设置为 False,谢谢。

答:

1赞 David Browne - Microsoft 10/22/2023 #1

命名管道不会更快。在现代 Windows 中,它通过 TCP/IP 运行以进行远程连接。

评论

0赞 David Browne - Microsoft 10/23/2023
只是这无济于事。所以不要打扰。连接所花费的时间可能是由于其他原因造成的,例如资源利用率高。
0赞 popo7ich 10/23/2023
事实上,我注意到建议在连接字符串中强制命名管道的帖子很旧(7-10 年前),所以,是的,你的陈述对我来说很有意义。话虽如此,你是说 NP 甚至不能在我当前的情况下使用吗?
1赞 popo7ich 10/23/2023
会考虑到这一点,谢谢大卫的回复。
1赞 popo7ich 10/23/2023 #2

虽然我还没有找到使用 Named Pipes 协议连接到 SQL Server 的方法,但我认为我走错了道路,专注于让它工作。正如我最初提到的,我的主要目标是改善与数据库的“初始连接”,我已经做到了这一点。因此,如果这对那里的任何人有帮助,这似乎是一个与网络相关的问题。不确定是否在 Hyper-V 虚拟交换机级别,但无论如何:

  1. 在客户端工作站上调整主机文件,并向服务器添加直接条目(即 172.22.152.7 MyServer)。
  2. 请务必在服务器上设置固定 IP。

有了上述情况,初始连接从 3-5 秒缩短到几乎立即(0.5 秒)。

附加说明:

  1. 不是必须的,但由于我不使用/不需要 IPv6,所以我在虚拟交换机和服务器的 NIC 上禁用了它。
  2. 我认为将服务器的 IP 地址直接放在连接字符串中也可以做到。但是,最终,您可能需要更改 IP,因此,我认为在主机文件级别进行调整会更好/更容易。

感谢您的关注,

M.

评论

0赞 Jiachen Li-MSFT 10/24/2023
嗨,很高兴知道您已经找到了解决此问题的解决方案!请考虑回答并接受它作为答案,以将其状态更改为“已回答”。看看我可以回答我自己的问题..,只是一个提醒:)
0赞 popo7ich 10/24/2023
嗨,佳辰,我刚刚做到了,谢谢!
0赞 granadaCoder 10/24/2023 #3

我读到,通过强制/使用命名管道而不是 TCP/IP,上述内容应该有相当大的改进。 //

这种笼统的陈述太过假设。 您必须设置两种协议(tcp 或 named-pipes)并执行“改进”数字/比较的实际指标。

我是根据个人经验说的。我们(我的公司作为软件供应商)有一个客户站点......他们在命名的管道下可怕地运行。我们切换到 tcp-ip,一切都运行得很好。

我对现场旅行记忆犹新。我的“预订酒店”预订“用完了”(我不得不多住几天),我不得不在便宜的时髦汽车旅馆多住一晚。所以相信我,我记得。正是在这次在客户现场的长途旅行中,我最初了解了网络协议/库设置。“dbmssocn”和我成了朋友。(请参阅我回答中的以下列表)

请注意,在 windows-clients 上,如果未指定 network-library...。Windows 机器本身将有一个默认值(在 Windows 注册表中)...因此,如果不在连接字符串中显式显示,则依赖于 windows-client-machine-registry-default 的默认值。这可能会产生其不同的行为影响。<<再读一遍,这是等式中不理解的部分,一些开发人员在找到适合他们情况的神奇组合时不会考虑,然后开始编写“一揽子语句”,例如“TCP-IP 臭味,始终使用命名管道”。

Network protocol codes
NAME    NETWORK LIBRARY
dbnmpntw    Named Pipes
dbmslpcn    Shared Memory (local machine connections only, might fail when moving to production...)
dbmssocn    Winsock TCP/IP
dbmsspxn    SPX/IPX
dbmsvinn    Banyan Vines
dbmsrpcn    Multi-Protocol (Windows RPC)
dbmsadsn    Apple Talk
dbmsgnet    VIA

但更重要的是,我终于能够通过将 TO tcp-ip FROM 命名管道更改为 tcp-ip 来保持良好的状态。 因此,为什么你的问题“触动了神经”:)

话虽如此,我的建议是:

在 tcp/ip 下提供“更精确的字符串”是我将开始的地方。 它必须做的“解决”越少......越好。

https://www.connectionstrings.com/define-sql-server-network-protocol/

提供程序 = sqloledb;数据来源=190.190.200.100,1433;网络 库=DBMSSOCN;初始目录=pubs;用户 ID=我的用户名;密码=myPassword;

我的经验是,你给它一个IP-ADDRESS(不是服务器“名称”)......还有一个港口......以及要使用的网络库...这是“尽快找到它”的最佳设置。

注意,也可以指定“网络库”,即命名的管道式......但恕我直言,我会先从 tcp/ip 开始。如果你到了那个点,你可以在互联网上搜索

“网络库 = dbnmpntw”

下面是指向更多连接字符串选项的链接。

https://learn.microsoft.com/en-us/sql/relational-databases/native-client/applications/using-connection-string-keywords-with-sql-server-native-client

评论

0赞 popo7ich 10/24/2023
您好,感谢您的回复。是的,在我的研究过程中,我发现并尝试直接在连接字符串上强制使用“Network Library=dbnmpntw”,但没有工作(顺便说一句,我提到了它)。尽管我认为您在定义连接字符串时提供了尽可能具体的良好建议,但我可以确认,区别在于指定服务器 IP 而不是名称。不知何故,至少在我当前的情况下,解析名称需要太多时间。不过,我更喜欢将服务器名称保留在 conn 字符串中,并调整 hosts 文件,如下所述。再次感谢!