Microsoft OLE DB提供程序针对SQL Server的错误“80004005”

5
我已经将一个经典的ASP网站迁移到了新服务器,但出现了以下错误信息。
我尝试了不同的连接字符串,但都无法正常工作。
我甚至不确定连接字符串是否是问题所在。
新服务器是Windows 2012 Server,SQL Server 2008 R2 Express机器。
Microsoft OLE DB Provider for SQL Server error '80004005'

[DBNETLIB][ConnectionOpen (Connect()).]SQL Server does not exist or access denied.

/scripts/dbcode.asp, line 31 

Application("C2M_ConnectionString") = "Provider=SQLNCLI10;Server=(local);Database=mysite_live;Uid=mysitec_Live;Pwd=mypass;"

1
scripts/dbcode.asp文件的第31行是什么? - Mike C.
2
它可能是32/64位不兼容性吗?请看这里:[链接](http://www.a2zmenu.com/Blogs/Miscellaneous/Microsoft-OLE-DB-Provider-for-ODBC-Drivers-error-80004005.aspx) - Dalex
1
有点好奇,旧服务器还在运行吗?它能在旧服务器上运行/曾经能够吗?如果是的话,旧服务器上使用的IIS版本是什么?SQL Server是否也迁移了?旧的SQL Server版本是多少? - Mike C.
1
你查看了SQL Server错误日志吗?那些日志显示了什么?有登录/授权失败的记录吗? - JodyT
@Burt 你解决了这个问题吗?如果是这样,为什么你没有接受一个答案或者自己留下答案呢? - user692942
显示剩余4条评论
12个回答

10
如果这是一个Express实例,那么很可能它不是默认实例,而是一个命名实例。所以您可能想表达的是:
... "Provider=SQLNCLI10;Server=.\SQLEXPRESS; ...
--- instead of just (local) ---^^^^^^^^^^^^

否则,你需要在该机器上的SQL Server配置管理器中展示服务器属性,以便我们能够告诉你如何更正你的连接字符串。

这只是我的猜测。如果您将sqlexpress实例移动到此服务器,请确保它正在运行,并且您在服务器名称中拥有正确的实例。 - darin
1
猜得不错,但它是默认实例,我被难住了,认为可能与SQL浏览器或防火墙有关。 - Burt
尝试过 SQL Server 浏览器和防火墙,所有设置似乎都正确。 - Burt

4

步骤一:启用TCP/IP协议 开始菜单 >> 所有程序 >> Microsoft SQL Server >> 配置工具 >> SQL Server配置管理器 >> SQL Server网络配置 >> MSSQLSERVER的协议 >> 右键单击“TCP/IP”,选择“启用”。

步骤二:将数据源属性中的特定机器名称更改为“(local)”将解决SQL SERVER 2012中的问题。


4
正如Aaron Bertrand所提到的那样,查看连接属性(在Sql Server配置中检查以下是否启用:Name Pipes和TCP/Ip)将是很有趣的。 由于您可以从SSMS连接,我想询问一下该服务器上是否允许远程连接。另外,能否告诉我Sql浏览器服务是否正在运行?
这是一个链接,我会经常使用它作为SQL Server可能出现的连接问题的提醒或检查清单。 SQL连接问题 最后,请尝试使用提供程序“SQLNCLI”而不是“SQLNCLI10”。

我认为 sqlncli 没有不工作的理由,但你尝试过将 sqloledb 作为提供程序吗? - John
我按照以下博客文章的步骤进行操作,一切都如预期所示。命名管道、TCP/IP和防火墙都已正确配置。SQL Server浏览器已启动。http://blogs.msdn.com/b/walzenbach/archive/2010/04/14/how-to-enable-remote-connections-in-sql-server-2008.aspx - Burt
1
+1 对于 SQL Authority 链接,它确实解决了我的问题(在我的情况下,是在 SQL Server 配置中启用 TCP/IP)。Pinal Dave 在处理服务器方面真是太棒了。 - undefined

2
尝试通过在连接字符串中ping服务器进行连接测试。您的应用程序所在的服务器应该能够使用您指定的凭据在端口上进行通信。如果您正在本地开发,请尝试指定“localhost”。如果服务器是集群化的或者您安装了实例,则需要指定该实例。同时请确保服务器已配置为混合模式身份验证(如果使用SQL凭据)。 或者,尝试使用以下连接字符串:Data Source = localhost; Initial Catalog = DBNAME; Persist Security Info = True; User ID = MyUserName; Password = MyPassword;

感谢您的快速回复,这是一个实时服务器,其中运行着其他ASP.Net站点,我已经迁移了它们,并且它们可以正常连接到同一台SQL Server。 SQL服务器位于同一台计算机上,因此(local)或localhost应该可以工作。还有其他想法吗? - Burt
@Burt 有没有可能用户名或密码错误?虽然我假设连接字符串中的用户名是虚拟的,但以防万一,我注意到您的Uid中“MySite”中的“e”被写成“c”。 - Ann L.
@AnnL,谢谢你的帮助,我很确定用户名和密码是正确的(你说得对,我在这里替换了它们)。 - Burt

2
您是否尝试使用服务器IP地址来代替“(local)”呢?类似这样:Server=192.168.1.1;(当然您需要使用真实的服务器IP地址)。 如果您尝试使用服务器IP地址,请在“SQL Server配置器”中检查SQL Server是否正在侦听您在连接中使用的IP地址。(SQL Server配置器截图) 其他有用的检查/尝试:
  • 同时检查DB是否位于默认的SQL Server实例中,还是位于命名实例中。
  • 您是否已经检查防火墙是否具有开放SQL Server端口的TCP/IP规则?
  • 您是否尝试使用其他软件通过TCP/IP连接方式连接到SQL Server?

2

SQL Server Browser服务在安装时默认处于禁用状态。我建议您启用并启动它。有关更多信息,请参见此链接和标题为“使用SQL Server Browser”的部分,以了解为什么这可能是您的问题。

如果您不想启用该服务,则可以启用TCP/IP协议(默认情况下禁用),指定静态端口号,并使用127.0.01,<端口号>来标识服务器。


2
这可能是一个权限问题,请检查服务器是否使用与SQL管理相同的配置细节进行连接。 另外,用户名/密码可能是错误的。

谢谢Jinesh,我可以使用凭据连接,所以我认为这排除了用户名或密码的问题。还有其他想法吗? - Burt
你说的“我可以使用凭据连接”是什么意思?从哪里连接?SSMS?在机器上?细节,细节,细节。我们都在猜测,你能猜到为什么吗? - Aaron Bertrand
我们有SQL Server Management Studio,可以输入服务器、用户名和密码。我们可以在那里输入我们的详细信息,并检查该系统是否可以访问数据库。 - Jinesh Jain
抱歉,我应该更加明确。像Jinesh建议的那样,我可以在SQL Server管理工具中输入连接字符串中指定的用户名、密码和服务器。我已经成功地从SQL Server管理工具连接上了。 - Burt
2
您可以参考此URL http://www.sqlstrings.com/sql-server-asp-conection.htm,其中提供程序名称是根据不同的标准指定的,您可以使用此验证连接字符串。 - Jinesh Jain

2
这可能是x86/x64的问题吗?
以下线程似乎表明(本地)别名是32位别名,在64位服务器上失败: http://social.msdn.microsoft.com/Forums/en-US/sqldataaccess/thread/c701d510-90e5-4dd0-b14f-ca1d694d6615 (请注意,错误与您所遇到的完全相同)
当您在服务器上测试.udl时,您是否同时测试了x86和x64?
根据此博客文章的建议(http://blogs.msdn.com/b/farukcelik/archive/2007/12/31/udl-test-on-a-64-bit-machine.aspx),您可以测试本地udl:
  • 在64位中只需双击它(与运行“C:\ Program Files \ Common Files \ System \ Ole DB \ oledb32.dll”,OpenDSLFile C:\ test.udl相同
  • 在32位中通过双击运行C:\ Windows \ syswow64 \ rundll32.exe“C:\ Program Files(x86)\ Common Files \ System \ Ole DB \ oledb32.dll”,OpenDSLFile C:\ test.udl
如果您可以确认这是别名的问题,我建议您按照此处的指南创建一个新别名。

2
以下是我的建议:

以下是我会做的事情:

编辑:请注意,这篇SO文章,在下面有一个有趣的方法可以创建正确的连接字符串。

  1. 打开SSMS(Sql Server Management Studio),复制/粘贴用户名/密码。不要输入,复制/粘贴。验证是否存在问题。
  2. 启动代码(这是我接下来要做的事情,因为在我的情况下这将是最容易的事情),并跳转到第31行以验证是否已正确设置所有内容。这里有一些信息可以帮助你完成此操作。我知道,在生产上进行此操作可能是不可能的,所以您可能会跳过此步骤。但如果有可能,我会在我的本地计算机上设置它,并验证是否存在连接问题。如果我在本地遇到此错误,则有更好的机会修复它。
  3. 验证Provider=SQLNCLI10是否已安装在生产服务器上。我会按照这篇 SO 文章,使用gbn发布的答案。
  4. 您有其他工作网站吗?其中任何一个是经典的asp吗?即使不是,我也会比较另一个站点中的连接字符串与您在此处使用的字符串。确保没有明显的差异。
  5. 启动SQL Server Profiler并开始跟踪。连接到该网站并导致错误,然后转到分析器,看看它是否提供了其他错误信息。
  6. 如果所有这些都失败了,我会开始浏览此内容

很抱歉我不能直接指出问题所在!

祝你好运!


没关系,迈克,我非常感谢你花时间帮助我。希望我能找到问题的根源。今晚我会尝试解决它,希望能解决。 - Burt
我忘了那个UDF技巧,我用它来生成连接字符串,但我仍然得到相同的错误。相当确定除了连接字符串之外还有其他因素在起作用。 - Burt
@Burt 你能在生产服务器上测试.udl连接吗? - AardVark71
生产服务器上的UDL已连接,但未通过asp页面连接。这让我想知道是否完全是连接字符串的问题。 - Burt
可能是32位/64位的问题吗?我不知道你的asp是否映射到了32位,但是尝试在32位上测试它,方法是运行C:\Windows\syswow64\rundll32.exe "C:\Program Files (x86)\Common Files\System\Ole DB\oledb32.dll",OpenDSLFile C:<yourpath>\test.udl - AardVark71

2
第31行代码中:
cmd.ActiveConnection = Application("C2M_ConnectionString")

你是如何实例化cmd的?
也许cmd在新环境中的行为与以前不同,而不是ConnectionString错误。
编辑后添加:
我看到你已经从IIS 7升级到了IIS 8。在IIS 7上运行Classic ASP站点需要手动更改服务器默认设置,例如“允许父路径”。有可能一些必要的调整没有迁移过来吗?
如果你没有开启Option Strict On,可以尝试开启它-它通常会揭示这种微妙问题的源头。(当然,首先你将被迫声明所有变量,这对于完成的代码来说非常乏味。)

2
设置 cmd = server.CreateObject("ADODB.Command") <<< 这是它的实例化方式,不确定有什么不同。 - Burt

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