1

建立与服务器的连接时发生错误。连接到 SQL Server 2005 时,此故障可能是由于在默认设置下 SQL Server 不允许远程连接造成的。(提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)

您好,我是在 SQL Server 2005 上开发的新手。我已经使用 SQL Server 2000 工作了几年,但是在完成连接到服务器的常规操作后,我在 Web 服务器上遇到了这个异常。

谷歌上有几个链接指向我可能的解决方案,但它们都没有解决我的问题。我在“Surface Area 不管...”对话框上进行了更改(这到底是什么?为什么 SQL Server 发生了如此大的变化???现在看起来很复杂)。

我已确保正确配置 SQL Server 2005 以允许数据库服务器实例上的传入连接。我还选择了自动作为启动类型,以便在每次系统启动时自动启动 SQL Server Browser 服务。不,没有防火墙在运行。

我尝试更改连接字符串以使用端口进行连接、使用 IP 进行连接、使用实例名称进行连接......

似乎没有任何效果,我仍然遇到同样的错误。有什么提示吗?

回答人们提出的问题:是的,我可以使用 Management Studio 从另一台计算机进行连接。是的,我确定它已配置为接受本地和远程 TCP/IP 以及命名管道。是的,我重新启动了服务器。

我正在使用已启用的混合模式安全性。我已经启用了 sa 用户。我能够使用 .udl 文件连接到数据库,并且我检查了我的连接字符串是否正常。我可以使用 DBArtisan 和 SQL Server 客户端工具连接到数据库。我可以在服务器和不同的机器上做到这一点。即使有这一切...

该网站仍然无法连接。

新更新...我整天都在为这个问题苦苦挣扎,但仍然没有找到原因。我发布的错误消息似乎是.net 在无法连接时给出的一般错误。我在连接字符串上放置了垃圾(键入不存在的服务器),但仍然出现相同的错误。

这些是我在服务器上使用的一些连接字符串:

connectionString="集成安全=SSPI;数据源=SERVER;初始目录=db;网络库=DBMSSOCN;"

connectionString="数据源=SERVER;初始目录=db;用户ID=sa;密码=xxxxx;"

connectionString="数据源=SERVER\MSSQLSERVER;初始目录=db;用户ID=sa;密码=xxxxx;"

我尝试使用一些奇怪的命令注册 sql server 实例,我在这里发现:http: //kb.discountasp.net/article.aspx ?id=1041 为此,我使用了 aspnet_regsql.exe 工具。它仍然无法正常工作...

我也知道服务器上安装了最新版本的 MDAC。我唯一怀疑的是服务器有两个数据库引擎:SERVER 和 server\sqlexpress

这与问题有关吗?

4

9 回答 9

1

我唯一怀疑的是服务器有两个数据库引擎:SERVER 和 server\sqlexpress

我认为这是问题的根源。您打算连接到哪一个?您需要指定要连接的“实例”。

假设您打算连接到 SERVER 实例,则连接字符串应如下所示(假设默认实例名称):

数据源= YOURSERVER\MSSQLSERVER ; 初始目录=db;用户 ID=sa;密码=xxxxx;

或者对于 sql express,连接字符串如下所示: Data Source= YOURSERVER\sqlexpress ; 初始目录=db;用户 ID=sa; 密码=xxxxx;

于 2008-09-15T19:56:25.753 回答
0

您可以通过 Management Studio 从另一台计算机连接到 SQL Server 吗?这可能会帮助您缩小是 SQL Server 配置还是连接字符串配置。

于 2008-09-15T15:22:26.257 回答
0

重新检查表面区域配置,并确保允许 TCP/IP 连接。

于 2008-09-15T15:23:00.357 回答
0

这可能是很多事情。我要检查的第一件事是确保您可以使用 SQL Server Management Studio 连接到服务器。其次,检查您的连接字符串以确保它是正确的。表面积配置不应应用于本地连接。

于 2008-09-15T15:23:25.863 回答
0

尝试在服务器上重新安装最新的 MDAC。我曾经有一个类似的问题,这解决了它。

[ http://www.microsoft.com/downloads/details.aspx?familyid=6c050fe3-c795-4b7d-b037-185d0506396c&displaylang=en][1]

于 2008-09-15T15:53:31.220 回答
0

基于错误看起来代码正在尝试使用命名管道而不是 TCPIP 进行连接。您实际上可能需要在连接字符串中明确指出 sql 提供程序应使用 tcpip 进行连接,因此您的连接字符串如下所示。

使用集成身份验证(Windows):

集成安全=SSPI;数据源=服务器名;初始目录= DATABASENAME ; 网络库=DBMSSOCN ;

使用 SQL 身份验证:

UID=用户名;密码=密码;数据源=服务器名;初始目录= DATABASENAME ; 网络库=DBMSSOCN ;

我以前见过类似的情况,由于某种原因,默认情况下“命名管道”被用作传输/连接层,特别是因为 Web 应用程序和 sql 服务器都在同一台机器上运行。我通常总是使用 tcpip 作为传输或网络库。

另一种故障排除技术是使用 UDL(或数据链接文件)对连接进行故障排除。这允许您在连接提供程序(ODBC、OLEDB 等)之间切换并设置其他连接选项。

  1. 在机器的桌面上右键单击并选择新建 -> 文本文档。
  2. 将 *.txt 文件重命名为 TestConnect.udl(名称无关紧要,只需 .udl 扩展名即可)。您应该看到图标从文本文件图标变为在数据网格顶部显示计算机的图标,或类似的东西(换句话说,窗口应该有一个图标。)。
  3. 现在双击该文件,您将看到一个“数据链接属性”小程序出现。
  4. 单击提供程序选项卡,您将看到不同连接提供程序的列表。我首先选择“Microsoft OLE DB Provider for SQL Server”。我们可以使用它来确认 OLE DB 是否可以连接。
  5. 单击下一步,然后输入服务器名称或 IP 地址。选择 Windows NT 集成安全性。(您可以随时返回并将其更改为使用 sql 登录。)此时您可以单击“测试连接”。如果连接成功,则从下拉列表中选择一个数据库名称。
  6. 最后,如果连接失败,请选择“全部”选项卡,然后查找“网络库”并编辑其值,将其设置为“DBMSSOCN”。
  7. 返回连接选项卡并再次单击“测试连接”。
  8. 这次重复步骤 4 和 5 并选择“SQL Native Client”。

希望这可以帮助。

于 2008-09-15T16:02:18.610 回答
0

在提示符下:

osql -E -S

... 给你一个 > 提示?

于 2008-09-15T16:15:00.217 回答
0

您是否尝试在连接字符串中指定实例名称?显然 sql server express 对实例名称特别挑剔。

我还开始研究 SQL Server 配置管理器。那么您是否点击了“SQL Server 2005 网络配置”,然后查看了“ InstanceName的协议”?并且您启用了 TCP/IP 和命名管道?

您是否还查看了“SQL Native Client Configuration”->“Client Protocols”,并且您看到那里也启用了 TCP/IP 和命名管道?

使用SQL Server 2005的Surface Area Configuration工具,点击“Surface Area Configuration for Services and Connections”,然后在“Database Engine”-->“Remote Connections”下选择什么?由于您似乎正在尝试使用命名管道进行连接,因此您需要确保选择“本地和远程连接”和“同时使用 tcp/ip 和命名管道”。

您可能知道,一旦进行了任何更改,您必须通过 Management Studio 停止并重新启动 sql server 实例(您不需要重新启动整个机器,尽管重新启动整个机器会到达那里)。

还有我的最后一条建议。暂时离开这个,然后让你的思绪离开它几分钟。当您重新潜入时,您可能会发现以前错过或忽略的东西。

于 2008-09-15T19:14:20.863 回答
0

我解决了连接问题。问题出在我的应用程序上。问题的原因是开发(而不是生产)数据库的连接字符串由生成数据集的对话框之一硬编码。此对话框将连接字符串放置在 web.config 和名为“Settings.settings.cs”的隐藏源代码文件中。通过将连接字符串固定到正确的位置解决了该问题。

该错误消息完全具有误导性,但通过遵循堆栈跟踪中提供的所有方法,我能够发现这一点。

因此,如果您发现此错误消息,则有很多可能的原因。您的第一个赌注是遵循此错误的通常步骤,即检查服务器是否允许远程和本地连接,并重新启动浏览器服务。

If that doesn't work, check the stack trace, look for code that is in your application, put a break point there and explore all the properties on the connection string. At least that's how I solved it.

于 2008-09-16T18:20:50.577 回答