MSSQL错误'基础提供程序在Open上失败'

时间:2010-03-19 04:36:11

标签: c# sql-server entity-framework database-connection

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

因为我总是得到错误:

  

底层提供程序在Open

上失败

39 个答案:

答案 0 :(得分:204)

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

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

如果您使用的是Entity Framework with Transactions,则Entity Framework会自动打开和关闭与每个数据库调用的连接。因此,在使用事务时,您尝试通过多个连接传播事务。这会升至MSDTC

See this reference for more information.

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

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

答案 1 :(得分:38)

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

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

答案 2 :(得分:26)

您应该看到 innerException 以查看投掷的内在原因 错误是。

在我的情况下,原始错误是:

  

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

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

答案 3 :(得分:23)

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

SERVER\SQLEXPRESS
SERVER

我真的应该拥有:

.\SQLEXPRESS

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

答案 4 :(得分: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中使用相同的配置托管后,我收到此错误:

  

底层提供程序在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. 用户名和密码可能有误。

答案 5 :(得分:10)

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

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

答案 6 :(得分:6)

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

答案 7 :(得分: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

答案 8 :(得分:3)

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

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

我希望这会有所帮助。

答案 9 :(得分:2)

确保提供的连接字符串中的每个元素值都是正确的。在我的情况下,我得到了相同的错误,因为连接字符串中指定的目录(数据库名称)的名称不正确。

答案 10 :(得分:2)

我在这里发布了一个类似的问题,使用托管在Amazon RDS上的SQL 2012数据库。问题出在连接字符串中 - 我有“应用程序名称”“App”属性。一旦我删除了它,它就有用了。

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

答案 11 :(得分:1)

在服务器计算机上为Windows Firewall(以及端口1433)定义新的SQL Server规则可以解决此错误(如果您的服务器名,用户登录名或密码在您的连接字符串中没有错误。 )。

答案 12 :(得分:1)

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

答案 13 :(得分:1)

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

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

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

答案 14 :(得分:1)

我对内部异常有类似的错误,如下所示:

  

操作对交易状态无效

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

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

  • 网络DTC访问
  • 允许RemoteClients
  • 交易经理沟通
  • 允许入站
  • 允许出站

答案 15 :(得分:1)

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

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

答案 16 :(得分:0)

添加此 集成安全性= True;

,它应该可以工作。 我将此添加到我的配置,它开始工作。

答案 17 :(得分:0)

我有同样的错误,当我更改我的connectionString时,我发现了这些错误 到新的数据源 我忘记更改新数据库的用户名和密码

答案 18 :(得分: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"

以下连接字符串在.net WebForms应用程序中按预期执行,其中SQL环境具有多个实例。很少见,但我在开发箱上有几个不同的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"

答案 19 :(得分:0)

在我的情况下,服务器管理员已更改服务器地址,因此我不得不将连接字符串更改为新的服务器地址

答案 20 :(得分:0)

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

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

答案 21 :(得分:0)

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

在IIS中:

  • 点击您的网站并转到基本设置,找到应用程序池。

  • 转到应用程序池。

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

  • 点击高级设置。

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

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

答案 22 :(得分:0)

没有任何答案适合我

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

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

我认为这很疯狂,因为我甚至没有从web api中新建dbcontext或其他东西。

否则类库试图寻找名为

的数据库
TokenApi.Core.CalContext   

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

答案 23 :(得分:0)

我只在我的web.config Connectionstring中包含了密码,这对我有用。

<add name="Test2016Entities" connectionString="metadata=res://*/Models.PersonDataContext.csdl|res://*/Models.PersonDataContext.ssdl|res://*/Models.PersonDataContext.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=KEDAR-PC;initial catalog=Test2016;user id=sa;password=mypc123;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

答案 24 :(得分:0)

我已经解决了这个问题。

  

第1步:   打开Internet信息服务管理器

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

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

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

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

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

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

答案 25 :(得分:0)

您好,如果您正在使用Context Class 您可以使用以下代码:

 <ScrollView contentContainerStyle={{ flexGrow: 1 }}>
    ...
</ScrollView>

答案 26 :(得分:0)

我正在网上搜索这个问题。我在连接字符串中输入了错误的名称,请检查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" />

答案 27 :(得分:0)

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

答案 28 :(得分:0)

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

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

答案 29 :(得分:0)

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

答案 30 :(得分:0)

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

答案 31 :(得分:0)

我的一个网站突然发生了这个错误。就我而言,事实证明SQL用户的密码已经过期!在SQL Server Management Studio中取消密码到期框就行了!

答案 32 :(得分:0)

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

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

答案 33 :(得分:0)

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

答案 34 :(得分:0)

我做的一个常见错误,因为我将应用程序从一台PC移动到另一台,而上述工作都没有,因为我忘了将连接字符串复制到App.Config和Web.Config!

答案 35 :(得分:0)

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

persist security info=True

答案 36 :(得分:-1)

@majidgeek的答案包含最有用的信息:检查InnerException属性。在我的例子中,InnerException有自己的InnerException,它指出了我的问题:Windows防火墙阻止了MSDTC。一旦我启用了分布式事务处理协调器的传入和传出规则,一切都很顺利。

答案 37 :(得分:-1)

您可以尝试替换元数据:

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

为:

metadata=res://*/;

答案 38 :(得分:-2)

我刚删除Entity Framework 5并将其替换为LINQ to SQL。它更容易......而且没有更奇怪的例外处理。

实体框架5,浪费时间。

有时我们真的应该问自己,实体框架5是否值得为它所引入的所有麻烦而感到非常简单。