提问人:popo7ich 提问时间:10/22/2023 最后编辑:Black catpopo7ich 更新时间:10/24/2023 访问量:126
无法通过 .NET 应用程序使用命名管道连接到 SQL Server
Cannot connect to SQL Server using Named Pipes through .NET application
问:
首先,我正在尝试使这项工作,因为我的 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) 没有成功。
笔记:
- Windows 10 客户端和 Windows 2012 服务器上均未启用防火墙。
- SQL Server 上只有一个实例(默认为 MSSQLServer)。
- 已在 SQL 配置管理器中为 SQL 实例启用共享内存、命名管道和 TCP/IP 协议。
- Named Pipes 使用其默认值(未定义别名)。
- 当然,我已经重新启动了SQL Server服务,甚至重新启动了服务器。
在这一点上测试/复制问题,如果有人想帮助这个即将开枪自杀的家伙,我正在使用 Visual Studio - 视图 - 服务器资源管理器 - 数据连接 - 添加连接 - 数据提供程序 .NET Framework Data Provider for SQL Server,测试与 SQL Server 的正确/成功连接(使用 TCP/IP),然后转到“高级”并将“网络库”调整为“命名管道”(见下文)。再次测试连接按钮,如果您弄清楚如何获得成功的结果,请告诉我如何操作!(新连接属性中的连接字符串应该可以解决问题)
Visual Studio - 使用命名管道测试新的 SQL 连接
提前感谢您抽出时间接受采访。
答:
命名管道不会更快。在现代 Windows 中,它通过 TCP/IP 运行以进行远程连接。
评论
虽然我还没有找到使用 Named Pipes 协议连接到 SQL Server 的方法,但我认为我走错了道路,专注于让它工作。正如我最初提到的,我的主要目标是改善与数据库的“初始连接”,我已经做到了这一点。因此,如果这对那里的任何人有帮助,这似乎是一个与网络相关的问题。不确定是否在 Hyper-V 虚拟交换机级别,但无论如何:
- 在客户端工作站上调整主机文件,并向服务器添加直接条目(即 172.22.152.7 MyServer)。
- 请务必在服务器上设置固定 IP。
有了上述情况,初始连接从 3-5 秒缩短到几乎立即(0.5 秒)。
附加说明:
- 不是必须的,但由于我不使用/不需要 IPv6,所以我在虚拟交换机和服务器的 NIC 上禁用了它。
- 我认为将服务器的 IP 地址直接放在连接字符串中也可以做到。但是,最终,您可能需要更改 IP,因此,我认为在主机文件级别进行调整会更好/更容易。
感谢您的关注,
M.
评论
我读到,通过强制/使用命名管道而不是 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”
下面是指向更多连接字符串选项的链接。
评论