MSSQL错误:“底层提供程序打开失败”

245

我之前在使用.mdf文件连接数据库entityClient,现在我想要更改连接字符串,以便不再使用.mdf文件。

以下的connectionString是否正确?

<connectionStrings>
   <!--<add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQL2008;AttachDbFilename=|DataDirectory|\NData.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />-->
   <add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQL2008;Initial Catalog=NData;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

因为我总是遇到以下错误:

底层提供程序在打开时失败


2
当我尝试在IIS下运行时,我遇到了同样的问题。如果我在VS服务器中运行,则不会出现错误。 - Zote
14
我遇到了相同的问题并从连接字符串中删除了 Integrated Security,创建了一个用户并确保他们拥有 sysadmin 权限,并将该用户添加到连接字符串。 - fulvio
我曾经遇到过这个问题,后来通过在连接字符串中插入密码解决了它。 - satyrFrost
当我在IIS下运行时,简单地移除集成安全性就解决了我的问题。 - Jon
另请参阅:https://dev59.com/f2035IYBdhLWcg3wcvqS#5416812 - 可能您没有像我一样创建数据库 :( - VMAtm
显示剩余2条评论
31个回答

232
我遇到了这个错误并找到了一些解决方案:
从您的连接字符串看,它是有效的。我在这篇博客文章中发现问题是他们使用了集成安全性。如果您正在运行IIS,则您的IIS用户需要访问数据库。
如果您正在使用实体框架与事务,每次与数据库通信时,实体框架会自动打开和关闭一个连接。因此,在使用事务时,您正在尝试将一个事务分散到多个连接上。这会引发MSDTC
(请参阅此参考资料以获取更多信息。)
将我的代码更改为以下内容即可修复:
using (DatabaseEntities context = new DatabaseEntities())
{
    context.Connection.Open();
    // the rest
}

7
当使用 Linq 访问表(使用 EF4)时,如何实现这一点? - Brett Rigby
2
@Brett Rigby:https://dev59.com/questions/K3RA5IYBdhLWcg3w4SDo#794785 讲述了如何在Linq/EF中实现此功能。 - Scott Stafford
68
如果您正在使用 EF/DBContext,正确的调用方式是 context.Database.Connection.Open()。 - live-love
3
我希望我刚开始发现它的时候能够仔细阅读你的帖子,而不是只浏览其中的代码。正如这个答案所指出的那样,我的问题是CRM 2011插件上下文的AppPool用户没有对我设置的数据库进行写访问权限。当我将该用户添加到SQL中时,插件就可以完美地工作了。 - Mike_Matthews_II
2
我的配置文件中没有以我正在创建的上下文命名的连接字符串......也要检查一下。 - Bill Blankenship
显示剩余3条评论

41

context.Connection.Open()没有帮助解决我的问题,所以我尝试在DTC配置中启用"允许远程客户端",没有出现错误。

在Windows 7中,您可以通过运行dcomcnfg、组件服务->计算机->我的计算机->分布式事务协调器->右键单击本地DTC->安全来打开DTC配置。


11
在Windows 7中,您可以通过运行dcomcnfg,打开DTC配置界面,路径为:组件服务-> 计算机-> 我的计算机-> 分布式事务协调器->右键单击本地DTC->安全。 - kerem
8
实际上,正确操作是右键单击本地 DTC -> 属性 -> 安全。 - Otto Abnormalverbraucher

30

您应该查看 innerException 以了解抛出错误的内部原因。

在我的情况下,最初的错误是:

无法打开物理文件“D:\Projects2\xCU\xCU\App_Data\xCUData_log.ldf”。操作系统错误5:“5(拒绝访问)”。尝试附加一个自动命名的数据库到文件D:\Projects2\xCU\xCU\App_Data\xCUData.mdf 失败。已存在同名数据库,或指定的文件无法打开,或位于 UNC 共享上。

通过对文件属性进行设置,为当前用户授予访问相关 mdfldf 文件的完全权限,问题得到解决。


25

我发现问题是我在这些变量之一的连接字符串中使用了服务器路径:

SERVER\SQLEXPRESS
SERVER

我真正应该做的是:

.\SQLEXPRESS

由于某种原因,每当它难以定位SQL实例时就会出现错误。


6
可能是因为你没有启用命名管道作为 SQL Server 的连接方法。 - Paul
1
@Paul,谢谢。由于这是新安装的SQL,可能默认禁用了命名管道。感谢提醒。+1 - dooburt
1
谢谢,我遇到了这个问题,因为命名管道被禁用了。 - Patrick Allwood

16

这是一个常见问题。即使我也遇到了这个问题。在使用Windows身份验证配置的开发机器上,它可以正常工作:

<add name="ShoppingCartAdminEntities" connectionString="metadata=res://*/ShoppingCartAPIModel.csdl|res://*/ShoppingCartAPIModel.ssdl|res://*/ShoppingCartAPIModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQlExpress;initial catalog=ShoppingCartAdmin;Integrated Security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

在使用相同配置的IIS中托管时,我遇到了以下错误:

The underlying provider failed on Open

通过更改配置文件中的connectionString解决了该问题:

<add name="MyEntities" connectionString="metadata=res://*/ShoppingCartAPIModel.csdl|res://*/ShoppingCartAPIModel.ssdl|res://*/ShoppingCartAPIModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MACHINE_Name\SQlExpress;initial catalog=ShoppingCartAdmin;persist security info=True;user id=sa;password=notmyrealpassword;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

其他常见错误可能包括:

  1. 数据库服务可能已停止
  2. 数据源属性指向使用Windows身份验证并托管在IIS中的本地数据库
  3. 用户名和密码可能错误。

对我来说,问题出在我创建 EF 数据模型时,它创建了一个连接字符串,该连接字符串使用 VS 中的数据连接中的登录数据。连接字符串中没有用户或密码,因此,删除 Integrated Security=True 并将其替换为 user id=sa;password=notmyrealpassword 可以解决这个部署问题。 - LostNomad311

13
当您收到此异常时,请确保扩展详细信息并查看内部异常详细信息,因为它将提供有关登录失败原因的详细信息。在我的情况下,连接字符串包含一个无法访问我的数据库的用户。
无论您是使用集成安全性(已登录的Windows用户的上下文)还是个人SQL帐户,请确保该用户在“安全性”下具有访问所需的适当访问权限以防止出现此问题。

我遇到了与原帖相同的问题,已验证我的主机名,并在内部异常中验证了我正在使用正确的用户名。SSMS用户安全性看起来是正确的 - SQL Server帐户已正确设置并具有对数据库的公共访问权限。但是,登录失败了。 - Codes with Hammer
“内部异常”表明了什么问题?这就是我的答案,它将提供隐藏的额外细节,以便理解真正的潜在问题。 “内部异常”不会验证您是否拥有正确的登录 - 它是一个异常而不是说明。 - atconway
Login failed for user 'user'. - Codes with Hammer
我也尝试将 NT AUTHORITY\NETWORK SERVICE 添加到 SQL Server 用户列表中。但仍然出现了相同的登录失败。 - Codes with Hammer
已解决。我需要将“数据源”更改为“hostname\SQLEXPRESS”。我之前尝试过“hostname”和“.\SQLEXPRESS”。然后我能够使用集成安全连接。有趣的是,这与dooburt的答案相反。更奇怪的是,SQL Server用户名从Visual Studio无法连接。 - Codes with Hammer
显示剩余2条评论

5

SQL Server Express服务未设置为自动启动。

1)进入控制面板 2)管理工具 3)服务 4)通过单击设置SQL Server Express自动启动 5)右键单击并启动服务

希望这能有所帮助。


5

4
你能描述一下你是如何做到的吗? - Peter Mortensen
这太模糊了。 - Payedimaunt

3

如果恢复数据库时已经存在具有不同模式的用户,则也可能会发生此情况,导致您无法分配正确的权限。

要纠正这个问题,请运行以下命令:

USE your_database
EXEC sp_change_users_login 'Auto_Fix', 'user', NULL, 'cf'
GO
EXEC sp_change_users_login 'update_one', 'user', 'user'
GO

这绝对是问题所在。我刚刚从备份中恢复了数据。请查看此链接以获取详细分析:http://www.fileformat.info/tip/microsoft/sql_orphan_user.htm - nesimtunc

2

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