MSSQL错误“底层提供程序在打开时失败”
我正在使用.mdf
连接到database
和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="Data Source=.\SQL2008;AttachDbFilename=|DataDirectory|\NData.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True"" 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="Data Source=.\SQL2008;Initial Catalog=NData;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
因为我总是得到错误:
底层提供程序在打开时失败
我有这个错误,发现了一些解决方案:
看着你的连接字符串,它看起来有效。 我发现这个博客文章 ,这里的问题是,他们正在使用集成安全 。 如果您在IIS上运行,则您的IIS用户需要访问数据库。
如果您将实体框架 与事务一起使用,则实体框架会自动打开并关闭每个数据库调用的连接。 所以当使用交易时,您正试图通过多个连接分摊交易。 这提升到MSDTC 。
( 有关更多信息,请参阅此参考。 )
改变我的代码到以下修复它:
using (DatabaseEntities context = new DatabaseEntities()) { context.Connection.Open(); // the rest }
context.Connection.Open()
没有帮助解决我的问题,所以我试图在DTC配置中启用“允许远程客户端”,没有更多的错误。
在Windows 7中,您可以通过运行dcomcnfg,组件服务 – >计算机 – >我的电脑 – >分布式事务处理协调器 – >右键单击本地DTC – >安全来打开DTC配置。
我发现问题是我在这些变体之一中的连接字符串中有服务器路径:
SERVER\SQLEXPRESS SERVER
当真的我应该有:
.\SQLEXPRESS
出于某种原因,我无法找到SQL实例时遇到的错误。
你应该看到innerException来看看抛出错误的内在原因是什么。
就我而言,原来的错误是:
无法打开物理文件“D:\ Projects2 \ xCU \ xCU \ App_Data \ xCUData_log.ldf”。 操作系统错误5:“5(访问被拒绝)”。 尝试为文件D:\ Projects2 \ xCU \ xCU \ App_Data \ xCUData.mdf附加一个自动命名的数据库失败。 名称相同的数据库存在,或指定的文件无法打开,或位于UNC共享上。
这是通过给予当前用户使用文件属性访问相关的mdf
和ldf
文件的完全权限来解决的。
当您收到此异常时,请确保展开详细信息并查看内部异常详细信息,因为它将提供有关登录失败原因的详细信息。 在我的情况下,连接字符串包含一个用户没有访问我的数据库。
无论您是使用集成安全性(已登录的Windows用户的上下文)还是单个SQL帐户,请确保用户在“安全”下对您试图访问的数据库具有适当的访问权限,以防止此问题。
这只是常见问题。 即使我面对这个问题。 在配置了Windows身份验证的开发机器上,它完美地工作:
<add name="ShoppingCartAdminEntities" connectionString="metadata=res://*/ShoppingCartAPIModel.csdl|res://*/ShoppingCartAPIModel.ssdl|res://*/ShoppingCartAPIModel.msl;provider=System.Data.SqlClient;provider connection string="data source=.\SQlExpress;initial catalog=ShoppingCartAdmin;Integrated Security=True;multipleactiveresultsets=True;application name=EntityFramework"" 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="data source=MACHINE_Name\SQlExpress;initial catalog=ShoppingCartAdmin;persist security info=True;user id=sa;password=notmyrealpassword;multipleactiveresultsets=True;application name=EntityFramework"" providerName="System.Data.EntityClient" />
其他常见的错误可能是:
- 数据库服务可以停止
- 数据源属性指向具有Windows身份验证的本地数据库,并在IIS中托管
- 用户名和密码可能是错误的。
在Windows Server 2003上,我遇到了与SQL Server Express Edition类似的问题。 我只是将数据库安全中的用户添加到网络服务中。
如果还原数据库并且用户已经以不同的架构存在,则也会发生这种情况,从而无法分配正确的权限。
要纠正这个运行:
USE your_database EXEC sp_change_users_login 'Auto_Fix', 'user', NULL, 'cf' GO EXEC sp_change_users_login 'update_one', 'user', 'user' GO
SQL Server Express服务未被自动设置为“开启”。
1)转到控制面板2)管理工具3)服务4)设置SQL Server快速启动自动点击5)右键单击并启动服务
我希望这会有所帮助。
确保提供的连接字符串中的每个元素值都是正确的。 在我的情况下,我得到了同样的错误,因为连接字符串中指定的目录(数据库名称)的名称是不正确的。
由于连接状态,我有一个类似的异常问题,然后我意识到我有我的域服务类变量标记为静态(错误)。
我的猜测是,一旦服务库被加载到内存中,每个新的调用结束使用相同的静态变量值(域服务实例),导致通过连接状态的冲突。
我还认为每个客户端调用都会产生一个新的线程,所以多个线程访问相同的域服务实例就等同于一个列车残骸。
我在这里发布了一个类似的问题,使用Amazon RDS上托管的SQL 2012 db。 问题出在连接字符串 – 我有“应用程序名称”和“应用程序”属性在那里。 一旦我删除这些,它的工作。
实体框架5和Amazon RDS – “底层提供程序在打开时失败”。
我有一个类似的错误,内部例外如下:
操作对交易状态无效
我可以通过启用DTC安全设置来解决这个问题。
转到DTC的属性,在安全选项卡下,检查下面
- 网络DTC访问
- 允许RemoteClient
- 事务管理器通信
- 允许入站
- 允许出站
如果碰巧在ASP.NET Web应用程序中出现此错误,除了提到的其他内容,请检查以下内容:
- 数据库用户安全权限(允许哪些用户访问您的数据库。
- 在IIS中检查您的应用程序池,并确保它是允许访问您的数据库的正确的一个。
我摆脱了这一点,通过重置IIS ,但仍在连接字符串中使用Integrated Authentication
。
为服务器计算机上的SQL Server (和端口1433)定义新的Windows防火墙规则解决了此错误(如果您的服务器名,用户登录名或密码在连接字符串中没有错误…)。
我有同样的问题,但什么对我来说是从连接字符串中删除:
persist security info=True
我曾经犯过一个常见的错误,因为我把应用程序从一台电脑移到另一台,上面没有任何工作,我忘了将连接字符串复制到App.Config和Web.Config中!
我有一个类似的问题:在我的测试用例执行中,我总是得到这个错误。 我发现,我的“分布式事务服务”没有启动(运行:services.msc – >启动“分布式事务服务”(最好设置为自动启动))。 我这样做后,它就像一个魅力…
我将数据库文件(.mdf / .ldf)复制到App_Data文件夹以摆脱此异常。
我也面临同样的问题。 现在我已经通过从连接字符串中删除用户名和密码来完成了。
对我来说,这只是一个简单的错误:
我使用Amazon EC2 ,并且在连接字符串中使用了我的弹性IP地址,但是当我更改IP地址时,我忘记更新连接字符串。
我在我们的某个网站上突然发生了这个错误。 就我而言,事实证明,SQL用户的密码已过期! 在SQL Server Management Studio中取消密码过期框没有办法了!
我前几天也遇到了同样的问题,使用“Integrated Security = True”。 在连接字符串中,您需要在“localsystem”下运行应用程序池标识。当然,这不是建议的,但是为了测试,它完成了这项工作。
这是如何在IIS 7中更改身份的: http : //www.iis.net/learn/manage/configuring-security/application-pool-identities
在IIS中,将“ 应用程序池身份标识为服务帐户”用户或管理员帐户或ant帐户设置为具有对该数据库执行操作的权限。
在我的情况下,我之间的连接字符串名称,我正在注册的上下文的构造函数与我的web.config中的名称不匹配。 D.复制和粘贴导致的简单错误:D
public DataContext() : base(nameOrConnectionString: "ConnStringName") { Database.SetInitializer<DataContext>(null); }
我有同样的错误,我发现,当我改变我的connectionString新的数据源,我忘了更改新数据库的用户名和密码
如果未指定SQL Server实例名称,并且SQL主机安装了多个SQL实例,则也会发生此错误。 这里有几个例子来说明:
下面的连接字符串会导致出现异常“底层提供程序在打开时失败”,.NET WebForms应用程序中没有内部异常:
connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string="Data Source=localhost;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True"" 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="Data Source=localhost\SQLSERVER2014;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient"
在我的情况下,服务器地址已被服务器管理员更改,所以我不得不将连接字符串更改为新的服务器地址
我有这个问题,因为应用程序池登录这个应用程序正在运行下已经改变。
在IIS中:
-
通过点击您的网站并转到基本设置来查找应用程序池。
-
转到应用程序池。
-
点击您的网站的应用程序池。
-
点击高级设置。
-
在身份,输入帐户登录名和密码。
-
重新启动您的网站,然后重试。