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


220

我当时使用.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" />

因为我总是收到错误:

基础提供程序在打开时失败


2
当我尝试在IIS下运行时,我在这里遇到了同样的问题。如果我在VS Server中运行,则不会出现任何错误。
Zote

11
我遇到了同样的问题,并将其Integrated Security从连接字符串中删除,创建了一个用户,并确保他们具有sysadmin权限并将该用户添加到连接字符串中。
fulvio

数据库位于哪里,如果它位于IIS上托管的应用程序上,则应将数据库放在App_Data文件夹中,然后编辑Entityframework模型生成的连接字符串以在其中查找。stackoverflow.com/questions/9809442/...
埃兰otzap

我遇到了这个问题,可以通过在连接字符串中插入密码来解决。
satyrFrost 2012年

在IIS下运行时,简单地删除Integrated Security对我
Jon

Answers:


215

我遇到此错误,找到了一些解决方案:

查看您的连接字符串,它看起来有效。我发现了此博客文章,这里的问题是他们正在使用集成安全性。如果您在IIS上运行,则IIS用户需要访问数据库。

如果您将Entity Framework 与Transactions一起使用,则Entity Framework会自动打开和关闭每个数据库调用的连接。因此,在使用事务时,您尝试将事务分布到多个连接上。这将提升为MSDTC

有关更多信息,请参见此参考。

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

using (DatabaseEntities context = new DatabaseEntities())
{
    context.Connection.Open();
    // the rest
}

7
使用Linq访问表(使用EF4)时如何完成?
Brett Rigby 2010年

2
@Brett Rigby:stackoverflow.com/questions/794707/…涵盖了如何使用Linq / EF进行此操作。
Scott Stafford

63
如果使用的是EF / DBContext,则正确的调用是context.Database.Connection.Open();。
live-love

2
我希望我能读到您的文章,而不是在我第一次发现它时就略读一下代码。我的问题(如在此答案中指出的那样)是CRM 2011插件上下文的AppPool用户没有对我要设置的数据库的写权限。当我将用户添加到SQL时,该插件的工作就像一个魅力。
Mike_Matthews_II

2
我的配置中没有以我创建的上下文命名的连接字符串.......也请检查一下。
Bill Blankenship 2013年

38

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

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


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

7
实际上是右键单击“本地DTC”->“属性”->“安全性”
Otto Abnormalverbraucher”,2007年

27

您应该看到innerException以查看引发错误的内在原因。

就我而言,原始错误是:

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

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


24

我发现问题在于,在其中一种变体中,连接字符串中包含服务器路径:

SERVER\SQLEXPRESS
SERVER

我什么时候应该拥有:

.\SQLEXPRESS

由于某种原因,只要找不到SQL实例,我都会收到该错误。


6
那可能是因为您没有启用命名管道作为SQL Server的连接方法。
保罗,

1
@保罗,谢谢。可能是因为这是SQL的新安装,但在禁用命名管道的情况下推出了该产品。感谢您的单挑。+1
dooburt 2011年

1
谢谢,由于命名管道被禁用,我遇到了这个问题。
Patrick Allwood

15

这仅是常见问题。即使我也遇到过这个问题。在配置了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" />

其他常见错误可能是:

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

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

10

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

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


我遇到了与原始帖子相同的问题,验证了我的主机名,并在内部异常中验证了我使用的是正确的用户名。SSMS用户安全性看起来正确-SQL Server帐户已正确设置,并具有对数据库的公共访问权限。但是,登录失败。
Hammer的代码,2014年

inner exception问题是什么状态?这就是我的回答,它将提供理解真正的根本问题所需的隐藏的其他细节。该inner exception不会验证您是否有正确的登录-这是一个例外,而不是澄清。
atconway

Login failed for user 'user'.
Hammer的代码,2014年

我也尝试添加NT AUTHORITY\NETWORK SERVICE到SQL Server用户列表。我仍然遇到相同的拒绝登录失败。
Hammer的代码,2014年

解决了。我需要更改data sourcehostname\SQLEXPRESS。我曾经尝试过hostname.\SQLEXPRESS以前。然后,我就可以与集成安全性进行连接。奇怪的是,这与dooburt的回答相反。奇怪的是,SQL Server用户名从未能够从Visual Studio连接。
Hammer的代码2014年


4

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

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

我希望这会有所帮助。


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

绝对是问题所在。我刚刚从备份中恢复。快来看看详细分析。
nesimtunc


2

确保提供的连接字符串中的每个元素值正确。就我而言,由于连接字符串中指定的目录名称(数据库名称)不正确,导致出现相同的错误。


1

由于连接状态,我有一个类似的例外问题,然后我意识到我将域服务类变量标记为静态(错误)。

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

我还认为,每个客户端调用都产生一个新线程,因此访问同一域服务实例的多个线程等同于火车残骸。


这也是为我做的。如果将其标记为静态,似乎只会导致尝试使用的实例出现各种问题。
Michael J. Gray

1

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

persist security info=True


1

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

该操作对于交易状态无效

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

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

  • 网络DTC访问
  • 允许远程客户端
  • 交易经理沟通
  • 允许入站
  • 允许出站

1

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

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



0

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


0

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


0

我将数据库文件(.mdf / .ldf)复制到App_Data文件夹中,以摆脱此异常。


0

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





0

IIS中,设置“ 应用程序池标识为服务帐户”用户或管理员帐户或具有对该数据库执行操作权限的ant帐户。


0

就我而言,我在上下文构造函数中注册的连接字符串名称与web.config中的名称不匹配。由复制和粘贴引起的简单错误:D

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



0

如果未指定SQL Server实例名称,并且SQL主机安装了多个SQL实例,则也会发生此错误。这里有几个例子可以说明:

下面的连接字符串导致“ .NET WebForms应用程序中没有内部异常”的异常“底层提供程序在打开时失败”:

 connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient"

下面的连接字符串在SQL环境具有多个实例的.net WebForms应用程序中按预期执行。我知道的很少,但是我的开发箱上有几个不同的SQL实例可以容纳不同的项目:

 connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost\SQLSERVER2014;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient"


0

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

在IIS中:

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

  • 转到应用程序池。

  • 单击站点的应用程序池。

  • 单击高级设置。

  • 在“身份”中,输入帐户登录名和密码。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.