无法连接到服务器 - 一个与网络或实例相关的错误

515

当我尝试连接到SQL Server时,出现以下错误:

在建立与SQL Server的连接时发生了与网络相关或特定实例的错误。无法找到服务器或服务器不可访问。请验证实例名称是否正确,并确认 SQL Server 已配置为允许远程连接。(提供程序:命名管道提供程序,错误: 40 - 无法打开到 SQL Server 的连接)

当我尝试在Visual Studio 2010中将我的数据库配置为网格视图时,就会出现此错误。我不知道如何调试这个错误。

您该如何调试这个错误?除了错误消息中提到的步骤外,我还应该采取哪些步骤来确定真正发生了什么?


14
用ping测试SQL Server连接不可靠,在Windows Server中默认禁用ICMP回显请求。无效的用户名或密码并不是错误提示的意思,那是完全不同的错误。 - Sean Airey
2
请尝试阅读这篇文章,它详细介绍了诊断连接问题所需的所有步骤:http://social.technet.microsoft.com/wiki/contents/articles/2102.how-to-troubleshoot-connecting-to-the-sql-server-database-engine.aspx - Sean Airey
4
如果您在首次设置SQL Server {version} Express时出现此错误,请参见我的回答及其截图。我再次回到StackOverflow并重新使用了我的回答,因为它是唯一有效的解决方法。https://dev59.com/IHM_5IYBdhLWcg3waSX9 - Entree
这个问题在Meta上进行了讨论。 - Joe
2
我也遇到过同样的错误。在我的情况下,我没有正确拼写服务器名称。有时候问题就出在这些简单的地方。 - Tarzan
显示剩余10条评论
57个回答

4

当我试图将服务器从IIS Express更改为Local IIS(同时使用LocalDB)时,我的问题开始了。

enter image description here

我正在使用LocalDB(用于开发目的),当我尝试从Local IIS切换回IIS Express时,Visual Studio已经将我的数据源从Data Source=(LocalDb)\MSSQLLocalDB切换到Data Source=.\SQLEXPRESS

错误的连接字符串

<add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SurveyTestsDB.mdf;Initial Catalog=SurveyTestsDB;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient" />

正确的连接字符串

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\SurveyTestsDB.mdf;Initial Catalog=SurveyTestsDB;Integrated Security=True" providerName="System.Data.SqlClient" />

希望这能帮助某些人。


不要犯傻瓜错误,在连接字符串中使用“/”代替“\”。 - andrew pate

4

在我的情况下,MSSQLSERVER服务出现了问题,因此我重新启动了该服务并解决了问题。

因此,我建议通过以下方式进入服务应用程序:按Windows键,搜索"Services",然后找到您的Sql实例,通常为"SQL Server (MSSQLSERVER)",右键单击服务,然后单击“启动”,如果禁用,则单击“重启”。


有超过3个人给出了相同的答案,甚至在你回答之前就已经附上了截图。 - Dush
你最后的陈述“如果禁用,请单击重新启动”是不正确的。如果它被禁用,你无法重新启动。你需要将禁用状态更改为“手动”或“自动”,然后“启动”服务。 - Dush

4

虽然以上解决方案在90%的情况下应该有效,但如果你仍在阅读这个答案!!!你可能正在尝试连接到一个不同于预期的服务器。这可能是由于配置文件指向与您认为要连接的实际服务器不同的SQL服务器。

我至少遇到过这种情况。


1
我也遇到过这种情况。在诊断防火墙之前应该先检查一下。我的连接字符串是正确的,但我在解决方案中运行了错误的项目... - VSO

4

尝试在连接字符串的末尾添加一个,和端口号(例如,1433)。


4

为什么这个错误如此烦人和嘈杂,只是因为它可能发生在各种情况下。

我已经尝试了所有上面的方法,但还是没有解决。所以请确保在向下浏览之前已经像我一样做了同样的事情。

也许我无法立即解决您的情况,但我可以指出一个方向或思路(最终滑到这里的人)。 我已经开始思考我的运行程序出现错误后,我确定实例名称正确并按照上述方法设置了我的数据库以允许远程控制。然后,我怀疑我的SQL连接代码片段出现了问题。

我的问题的解决方案:

  • 检查我的sqlconnection函数

  • 点击查看其配置

  • 新建一个连接

enter image description here

  • 选择您的服务器名称

enter image description here

我经过深思熟虑后解决了连接过程中出现的问题,希望我的思路能帮助你解决错误。


这帮助我发现当使用Entity Framework时,需要从LocalDB连接字符串中删除端口号。 - ryanwebjackson

4

摘要

为了解决在本地应用程序访问远程数据库时遇到的问题,请使用SQL Server Configuration Manager为远程数据库添加别名。

详细信息

最近,我从Windows 7转换到Windows 10笔记本电脑时遇到了这个问题。我正在运行一个本地开发和运行环境,访问我们在远程服务器上的Dev数据库。我们通过SQL Server Client Network Utility(cliconfg.exe)设置的服务器别名访问Dev数据库。在确认别名在实用程序的64位和32位版本中都正确设置,并且可以通过SSMS从新笔记本电脑访问数据库服务器之后,我仍然收到了OP(当然不是OP的IP地址)看到的错误。

必须使用SQL Server Configuration Manager为远程Dev数据库服务器添加别名。问题得到了解决。

enter image description here


4
当我在Visual Studio中遇到这个错误时,它是由以下C#代码执行引起的,该代码试图获取我的SQL Server数据以在网格中显示。断点恰好发生在connect.Open()所在的行上。
“在建立与SQL Server的连接时发生了与特定实例相关联的网络错误。找不到服务器或无法访问。请验证实例名称是否正确,并且SQL Server已配置为允许远程连接。 (提供程序:命名管道提供程序,错误:40-无法打开到SQL Server的连接)”请注意保留HTML标记。
        using (var connect = Connections.mySqlConnection)
        {
            const string query = "SELECT Name, Birthdate, Narrative FROM Friends";
            using (var command = new SqlCommand(query, connect))
            {
                connect.Open();
                using (var dr = command.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        // blah
                    }
                }
            }
        }

这是一个难以解释的问题,因为SQL查询非常简单,我有正确的连接字符串,并且数据库服务器可用。我决定在SQL管理工具中手动运行实际的SQL查询,它顺利地运行并返回了多个记录。但在查询结果中有一件事情引起了我的注意:Friends表中的varchar(max)类型字段内部存在一些格式不正确的HTML文本(具体来说,是“叙述”列数据内部的一些编码注释符号,类似于<!--)。可疑的数据行看起来像这样:

Name    Birthdate    Narrative
====    =========    ============== 
Fred    21-Oct-79    &lt;!--HTML Comment -->Once upon a time...

请注意编码的HTML符号 "&lt;",它代表了一个"<"字符。不知怎么的,它出现在了数据库中,我的C#代码无法捕获它!每次都会在connect.Open()行失败!在我手动编辑数据库表Friends的一行数据并替换为未编码的"<"字符后,一切正常!以下是该行应该看起来的样子:
Name    Birthdate    Narrative
====    =========    ============== 
Fred    21-Oct-79    <!--HTML Comment -->Once upon a time...

我使用下面这个简单的 UPDATE 语句来编辑了一个有问题的数据行。但如果你有多个包含编码 HTML 的不良行,你可能需要使用更复杂的 REPLACE 函数来进行更新:

UPDATE Friends SET Narrative = '<!--HTML Comment -->Once upon a time...' WHERE Narrative LIKE '&lt%'

所以,这个故事的寓意是(至少在我的情况下),在将HTML内容存储到数据库之前对其进行清洗,这样就不会出现这种神秘的SQL Server错误了!(如果需要更多信息,请进行另一次独立的StackOverflow搜索,正确地清理/解码您的HTML内容也值得讨论!)

这很棒,非常有帮助。 - Dush

3

Web.config中的XML标记排列顺序很重要

首先,

<configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>

完成

<connectionStrings>
  <add name="SqlConnectionString" connectionString="Data Source=.; Initial Catalog=TestDB; Trusted_Connection=True;" providerName="System.Data.SqlClient" />
</connectionStrings>

3
除了尝试 Teo Chuen Wei Bryan 建议的所有操作,确保在连接字符串中也引用了正确的服务器/实例名称。
如果您正在使用数据库服务器上的主机名/实例的简短形式或 web.config 文件中,请确保使用完全限定域名 (FQDN)/实例。
此外,要从未安装 SQL Server 客户端的服务器测试连接:
--> 创建一个文本文件并将其文件扩展名更改为 .udl。
--> 右键单击该文件,然后可以看到连接选项卡。
--> 输入服务器名称和登录信息以测试与数据库服务器的连接。
希望这能有所帮助。

3

如果您在生产环境中突然遇到此错误,且没有任何更改,请按照以下顺序尝试以下4个方法以查看是否可以解决问题。

  1. 重新启动SQL Server服务。
  2. 重新启动调用SQL Server的服务(例如IIS)。(如果服务调用开始时间和获取响应错误的时间非常短(大约一两秒),则问题可能出在这里)
  3. 重新启动SQL Server所在的服务器。
  4. 重新启动调用服务的服务器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接