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

Posted

技术标签:

【中文标题】MSSQL 错误“底层提供程序在打开时失败”【英文标题】:MSSQL Error 'The underlying provider failed on Open' 【发布时间】:2011-01-29 07:42:29 【问题描述】:

我使用.mdf 连接到databaseentityClient。现在我想更改连接字符串,这样就没有.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" />

因为我总是得到错误:

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

【问题讨论】:

当我尝试在 IIS 下运行时,我遇到了同样的问题。如果我在 VS Server 中运行,我不会收到任何错误。 我遇到了同样的问题并从连接字符串中删除了Integrated Security,创建了一个用户并确保他们拥有sysadmin 权限并将该用户添加到连接字符串中。 您的数据库位于何处,如果它位于 IIS 上托管的应用程序上,您应该将您的数据库放在 App_Data 文件夹中并编辑 Entityframework 模型生成的连接字符串以在那里查找它。 ***.com/questions/9809442/… 我遇到了这个问题,通过在连接字符串中插入密码解决了。 在 IIS 下运行时只需删除集成安全对我有用 【参考方案1】:

我遇到了这个错误并找到了一些解决方案:

查看您的连接字符串,它看起来是有效的。我找到了this blog post,这里的问题是他们使用的是Integrated Security。如果您在 IIS 上运行,则您的 IIS 用户需要访问数据库。

如果您使用Entity Frameworkwith Transactions,实体框架会自动打开和关闭每个数据库调用的连接。因此,在使用事务时,您试图将事务分散到多个连接上。这将提升为MSDTC。

(See this reference for more information.)

将我的代码更改为以下修复它:

using (DatabaseEntities context = new DatabaseEntities())

    context.Connection.Open();
    // the rest

【讨论】:

使用 Linq 访问表(使用 EF4)时这是如何完成的? @Brett Rigby:***.com/questions/794707/… 介绍了如何使用 Linq/EF 进行此操作。 如果你使用的是EF/DBContext,那么正确的调用是context.Database.Connection.Open(); 我希望我在第一次找到您的帖子时阅读您的帖子,而不是略读它的代码。我的问题(正如在这个答案中指出的那样)是 CRM 2011 插件上下文的 AppPool 用户对我设置的数据库没有写访问权限。当我将用户添加到 SQL 时,插件就像一个魅力。 我的配置中没有以我创建的上下文命名的连接字符串......也检查一下。【参考方案2】:

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

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

【讨论】:

在 Windows 7 中,您可以通过运行 dcomcnfg 打开 DTC 配置,组件服务 -> 计算机 -> 我的电脑 -> 分布式事务协调器 -> 右键单击​​本地 DTC - > 安全性。 其实就是右键本地DTC->属性->安全【参考方案3】:

你应该看到 innerException 看看抛出的内部原因是什么 错误是。

在我的例子中,原来的错误是:

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

通过授予当前用户使用文件属性访问相关mdfldf 文件的完全权限来解决。

【讨论】:

【参考方案4】:

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

SERVER\SQLEXPRESS
SERVER

当我真正应该拥有的时候:

.\SQLEXPRESS

由于某种原因,每当它难以定位 SQL 实例时,我都会收到错误消息。

【讨论】:

这可能是因为您没有启用命名管道作为 SQL Server 的连接方法。 @Paul,谢谢。这很可能是因为它是新安装的 SQL,它在禁用命名管道的情况下推出。感谢您的提醒。 +1 谢谢,由于命名管道被禁用,我遇到了这个问题。【参考方案5】:

这只是常见问题。甚至我也遇到过这个问题。在开发机上,配置了 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 中,我收到此错误:

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

已解决在配置文件中更改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" />

其他常见错误可能是:

    可以停止数据库服务 指向具有 Windows 身份验证并托管在 IIS 中的本地数据库的数据源属性 用户名和密码可能有误。

【讨论】:

对我来说,问题是当我创建 EF 数据模型时,它创建了一个连接字符串,该字符串使用来自 VS 中的数据连接的登录数据。连接字符串中没有用户或密码,因此,删除 Integrated Security=True 并将其替换为 user id=sa;password=notmyrealpassword 以解决此部署问题。【参考方案6】:

当您收到此异常时,请确保展开详细信息并查看内部异常详细信息,因为它将提供有关为什么登录失败的详细信息。在我的情况下,连接字符串包含一个无权访问我的数据库的用户。

无论您是使用集成安全性(登录的 Windows 用户的上下文)还是单个 SQL 帐户,请确保用户在“安全性”下对您尝试访问的数据库具有适当的访问权限,以防止出现此问题.

【讨论】:

我遇到了与原始帖子相同的问题,验证了我的主机名,并在内部异常中验证了我使用了正确的用户名。 SSMS 用户安全看起来是正确的——SQL Server 帐户设置正确并且可以公开访问数据库。但是,登录失败。 inner exception 状态是什么问题?这就是我在这里的回答,它将提供理解真正潜在问题所需的隐藏的额外细节。 inner exception 不会验证您是否有正确的登录 - 这是一个例外而不是澄清。 Login failed for user 'user'. 我还尝试将NT AUTHORITY\NETWORK SERVICE 添加到 SQL Server 用户列表中。我仍然遇到同样的拒绝登录失败。 已解决。我需要将data source 更改为hostname\SQLEXPRESS。我之前尝试过hostname.\SQLEXPRESS。然后我能够连接到集成安全性。奇怪的是,这与 dooburt 的答案相反。奇怪的是,SQL Server 用户名永远无法从 Visual Studio 连接。【参考方案7】:

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

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

我希望这会有所帮助。

【讨论】:

【参考方案8】:

Windows Server 2003 上的 SQL Server Express Edition 也有类似的问题。我只是将网络服务添加为数据库安全中的用户。

【讨论】:

你能描述一下你是怎么做到的吗? 这太模糊了【参考方案9】:

如果您恢复数据库并且用户已经存在不同的架构,也会发生这种情况,导致您无法分配正确的权限。

要更正此运行:

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

【讨论】:

这绝对是问题所在。我刚刚从备份中恢复。以look 进行详细分析。【参考方案10】:

我在这里发布了一个类似的问题,使用托管在 Amazon RDS 上的 SQL 2012 数据库。问题出在连接字符串中 - 我在那里有 "Application Name""App" 属性。一旦我删除了这些,它就起作用了。

Entity Framework 5 and Amazon RDS - "The underlying provider failed on Open."

【讨论】:

【参考方案11】:

确保提供的连接字符串中的每个元素值都是正确的。就我而言,我遇到了同样的错误,因为连接字符串中指定的目录名称(数据库名称)不正确。

【讨论】:

【参考方案12】:

由于连接状态,我遇到了类似的异常问题,然后我意识到我的域服务类变量标记为静态(错误地)。

我的猜测是,一旦将服务库加载到内存中,每个新调用最终都会使用相同的静态变量值(域服务实例),从而通过连接状态引起冲突。

我还认为每个客户端调用都会导致一个新线程,因此访问同一个域服务实例的多个线程等同于火车失事。

【讨论】:

这也是为我做的。似乎如果您将其标记为静态,它只会导致它尝试使用的实例出现各种问题。【参考方案13】:

我遇到了同样的问题,但对我有用的是从连接字符串中删除它:

persist security info=True

【讨论】:

【参考方案14】:

我在内部异常中遇到了类似的错误,如下所示:

操作对交易状态无效

我可以通过启用 DTC 安全设置来解决它。

转到 DTC 的属性,在安全选项卡下,检查以下内容

网络 DTC 访问 允许远程客户端 事务管理器通信 允许入站 允许出站

【讨论】:

【参考方案15】:

如果您碰巧在 ASP.NET Web 应用程序上遇到此错误,除了提到的其他事项外,请检查以下内容:

    数据库用户安全权限(允许哪些用户访问您的数据库。 检查 IIS 中的应用程序池,确保它是允许访问数据库的正确应用程序池。

【讨论】:

【参考方案16】:

我通过重置IIS 摆脱了这个问题,但仍然在连接字符串中使用Integrated Authentication

【讨论】:

【参考方案17】:

在服务器机器上为SQL Server(和端口1433)定义一个新的Windows Firewall规则可以解决这个错误(如果你的服务器名、用户登录名或密码在你的连接字符串中没有错...)。

【讨论】:

【参考方案18】:

我犯的一个常见错误是我将应用程序从一台电脑移动到另一台电脑,而上述方法均无效,我忘记将连接字符串复制到 App.Config 和 Web.Config!

【讨论】:

【参考方案19】:

我有一个类似的问题:在我的测试用例执行中,我总是遇到这个错误。我发现我的“分布式事务服务”没有启动(运行:services.msc -> 启动“分布式事务服务”(最好将其设置为自动启动))。在我这样做之后,它就像一个魅力......

【讨论】:

【参考方案20】:

我也面临同样的问题。现在我通过从连接字符串中删除用户名和密码来完成它。

【讨论】:

【参考方案21】:

对我来说,这只是一个简单的错误:

我使用了Amazon EC2,并在连接字符串中使用了我的弹性 IP 地址,但是当我更改 IP 地址时,我忘记了更新我的连接字符串。

【讨论】:

【参考方案22】:

我在我们的一个网站上突然发生了这个错误。在我的例子中,原来 SQL 用户的密码已经过期了!取消勾选SQL Server Management Studio 中的密码过期框就成功了!

【讨论】:

【参考方案23】:

几天前我遇到了同样的问题,使用“Integrated Security=True;”在连接字符串中,您需要在“localsystem”下运行应用程序池标识当然不推荐这样做,但为了测试它可以完成这项工作。

这是在 IIS 7 中更改身份的方法: http://www.iis.net/learn/manage/configuring-security/application-pool-identities

【讨论】:

【参考方案24】:

IIS 中将 App Pool Identity 设置为有权对该数据库执行操作的服务帐户用户或管理员帐户或 ant 帐户。

【讨论】:

【参考方案25】:

在我的情况下,我在上下文的构造函数中注册的连接字符串名称与我的 web.config 中的名称不匹配。复制粘贴导致的简单错误:D

    public DataContext()
        : base(nameOrConnectionString: "ConnStringName")
    
        Database.SetInitializer<DataContext>(null);
    

【讨论】:

【参考方案26】:

我遇到了这个问题,因为运行此应用的应用程序池登录已更改。

在 IIS 中:

通过单击您的站点并转到基本设置来查找应用程序池。

转到应用程序池。

点击您网站的应用程序池。

点击高级设置。

在 Identity 中,输入帐户登录名和密码。

重新启动您的网站,然后重试。

【讨论】:

【参考方案27】:

没有一个答案对我有用

我认为我们中的一些人都会犯愚蠢的错误,失败的方式有 100 种......

我的问题是新项目,我在另一个项目中设置了所有配置,但调用方是一个 Web Api 项目,我必须在其中复制相同的连接字符串到 Web api 项目中。

考虑到我什至没有更新 dbcontext 或来自 web api 的任何东西,我认为这太疯狂了。

否则类库会尝试查找名为

的数据库
TokenApi.Core.CalContext   

其中我的项目名为TokenApi.CoreCalContext是连接字符串的名称和文件名

【讨论】:

【参考方案28】:

我已经这样解决了。

第 1 步: 打开互联网信息服务管理器

第 2 步: 单击左侧导航树中的应用程序池。

第 3 步: 选择您的版本池。就我而言,我使用的是 ASP .Net v4.0。如果您没有此版本,请选择 DefaultAppPool。

第 4 步: 右键单击第 3 步,然后选择高级设置。

第 5 步: 在属性窗口中选择标识,然后单击按钮更改值。

第 6 步: 在内置帐户组合框中选择本地系统,然后单击确定。 而已。现在运行您的应用程序。一切正常。

Codeproject Solution : the-underlying-provider-failed-on-open

【讨论】:

换句话说,您的应用程序池在其下运行的登录名应该具有数据库访问权限,以防您使用集成安全性。【参考方案29】:

我在网上搜索这个问题。我在连接字符串中输入了错误的名称,请检查 web.config 中的连接字符串。我有name="AppTest",但应该是name="App"

在我的 AppTestContext.cs 文件中:

public AppTestContext() : this("App")  

错误的连接字符串:

<add connectionString="Data Source=127.0.0.1;Initial Catalog=AppTest;Integrated Security=SSPI;MultipleActiveResultSets=True" name="AppTest" providerName="System.Data.SqlClient" />

正确的连接字符串:

<add connectionString="Data Source=127.0.0.1;Initial Catalog=AppTest;Integrated Security=SSPI;MultipleActiveResultSets=True" name="App" providerName="System.Data.SqlClient" />

【讨论】:

【参考方案30】:

您可以尝试替换元数据:

metadata=res://<em>/conString.csdl|res://</em>/conString.ssdl|res://*/conString.msl

到:

metadata=res://*/;

【讨论】:

但是为什么呢?有什么好处?为什么这是解决方案?

以上是关于MSSQL 错误“底层提供程序在打开时失败”的主要内容,如果未能解决你的问题,请参考以下文章

当 WCF 服务到 TCP/IP 时,底层提供程序在开放实体框架上失败

实体框架“找不到查询模式的实现”

EF4 连接问题

实体框架 SDF 数据库大小问题

致命错误:未捕获的错误:调用未定义的函数 mssql_query() [重复]

MSSQL over PHP 的连接错误