如何编写访问远程机器Microsoft SQL Server的有效连接字符串
SQL Server远程连接40错误排查方案
按以下优先级逐一排查,90%以上的同类问题都能解决:
- 先配置目标数据库服务器的SQL Server协议
- 远程登录数据库所在服务器,打开SQL Server配置管理器,找到你正在使用的SQL Server实例,在「SQL Server网络配置」-「对应实例的协议」里,启用TCP/IP协议,Named Pipes可以保持禁用,远程连接优先走TCP/IP协议,你当前报错默认走Named Pipes就是TCP连接失败后的回退行为。
- 右键TCP/IP打开属性页,切到「IP地址」标签,拉到最底部的
IPAll分组,确认TCP端口设置为1433(如果用自定义端口请记好后续要用),同时把列表里所有需要被访问的IP段对应的「已启用」选项改成「是」。 - 所有协议配置修改完成后,必须在服务列表里重启对应SQL Server实例的服务,配置才会生效。
- 放行服务器端防火墙端口
- 检查目标服务器的Windows防火墙、第三方安全软件的入站规则,必须放通对应TCP端口:用默认1433端口的话,添加规则允许TCP 1433、UDP 1434端口的入站访问,其中UDP 1434是SQL Browser服务用的,用来解析命名实例。
- 如果你用的是SQL Server命名实例且开了动态端口,要么直接把TCP端口固定成你自定义的值再放行对应端口,要么直接添加规则允许SQL Server实例对应的程序文件入站,避免动态端口被拦截。同时把SQL Browser服务的启动类型改成「自动」并保持运行状态。
- 修正连接字符串配置
- 你用Windows集成认证的话确实不需要填写user id和password,但要注意运行程序的Windows账号必须提前在目标SQL Server上分配好对应数据库的访问权限,同时连接串要明确写全参数,不要依赖本地默认配置,参考格式如下:
// 默认实例、固定1433端口的连接写法 conn = new SqlConnection("Data Source=目标服务器IP,1433; Initial Catalog=Database1; Integrated Security=True; Encrypt=False; TrustServerCertificate=True"); // 命名实例的连接写法:Data Source=目标服务器IP\实例名,对应端口- 测试阶段建议先加上
Encrypt=False; TrustServerCertificate=True参数,避免因服务器和本地的证书配置不匹配导致连接被拦截,等连通后再根据安全需求调整加密配置。
- 连通性预验证
- 不要一开始就跑代码调试,先在开发机上做基础连通性检查:打开命令提示符,先执行
ping 目标服务器IP确认基础网络通,再执行telnet 目标服务器IP 1433(端口换成你实际配置的端口),如果telnet打开后是空白黑窗口没有报错,说明端口连通性正常;如果提示连接失败,问题一定出在网络策略、防火墙或者SQL Server端口配置上,和代码无关。 - 可以先在本地用SSMS连接目标数据库,SSMS能正常连通的话,直接复制SSMS连接成功后生成的连接字符串到代码里用,能避免很多参数配置错误。
- 不要一开始就跑代码调试,先在开发机上做基础连通性检查:打开命令提示符,先执行
- 关于你提到的Inner Exception「系统找不到指定的文件」:这个报错是因为本地客户端优先尝试通过命名管道找本地的SQL Server实例连接文件,TCP远程连接失败后触发回退查找逻辑才会抛出,TCP连通性问题解决后这个报错会同步消失。
内容的提问来源于stack exchange,提问作者Dar
相关产品推荐
相关产品推荐

