连接SQL Server时出现Instance failure. (System.Data)错误求助
先把你遇到的错误信息贴出来方便参考:
===================================
无法连接至SQL_ServerName。Instance failure. (System.Data)
程序位置: at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover, Boolean isFirstTransparentAttempt, SqlAuthenticationMethod authType, Boolean disableTnir) ...
此外还提示:无法连接至SQL Server:SQL Server实例失败。(System.Data)
这个错误本质是客户端找不到或连不上目标SQL Server实例,下面是我整理的几个经过大量验证的排查步骤,按顺序试大概率能解决:
先确认SQL Server实例本身是否在运行
按下Win + R输入services.msc打开服务管理器,找到对应实例的服务(默认实例叫SQL Server (MSSQLSERVER),命名实例是SQL Server (你的实例名)),查看状态是否为“正在运行”。如果没启动,右键点击启动,顺便把启动类型改成“自动”,避免下次重启后再次失效。检查你输入的实例名称是否准确
别小看这个细节,很多人栽在这里:如果是命名实例,连接格式必须是服务器名\实例名(比如DESKTOP-ABC123\SQLEXPRESS);默认实例直接用服务器名/IP即可。拼写一定要准确,虽然大小写不敏感,但多一个或少一个字符都会导致失败。确保SQL Server允许远程连接(本地连接也建议检查)
打开SQL Server配置管理器,展开“SQL Server网络配置”→ 目标实例的“协议”:- 先启用
TCP/IP协议; - 双击
TCP/IP,切换到“IP地址”标签页,找到你正在使用的网卡IP,确认“TCP端口”为1433(默认值,命名实例如果是动态端口可以先查询端口号,或者直接设置固定端口更稳定),并且“已启用”选项设为“是”。
修改完成后记得重启SQL Server服务,让设置生效。
- 先启用
检查防火墙是否拦截了连接请求
如果是远程连接,目标服务器的Windows防火墙(或第三方防火墙)必须开放SQL Server对应的端口(默认1433),或者直接允许sqlservr.exe程序通行。本地连接可以临时关闭防火墙测试,要是能连上了,就去防火墙里添加一条允许规则即可。SQL Server Browser服务需运行(针对命名实例)
命名实例依赖SQL Server Browser服务将实例名映射到对应的端口,所以必须确保这个服务在services.msc中处于运行状态。默认实例不需要此服务,但开启也不会有负面影响。检查代码中的连接字符串是否有误
如果你是通过代码连接(比如C#的SqlConnection),要确保连接字符串格式正确:
采用SQL身份验证的连接字符串:Data Source=SQL_ServerName;Initial Catalog=你的数据库名;User ID=登录名;Password=密码;采用Windows身份验证的连接字符串:
Data Source=SQL_ServerName;Initial Catalog=你的数据库名;Integrated Security=True;重点检查
Data Source后面的实例名是否写错,有没有多余的空格或特殊符号。
要是这些步骤都尝试后仍未解决,你可以用telnet 服务器IP 端口号(比如telnet 192.168.1.10 1433)测试端口是否通畅,或者用SQL Server Management Studio直接连接,说不定能获取更具体的错误提示,方便进一步排查。
内容的提问来源于stack exchange,提问作者Justin Lessard

