Erro MSSQL 'O provedor subjacente falhou ao abrir'


220

Eu estava usando um .mdfpara conectar a um databasee entityClient. Agora eu quero alterar a cadeia de conexão para que não haja .mdfarquivo.

O seguinte está connectionStringcorreto?

<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" />

Porque eu sempre recebo o erro:

O provedor subjacente falhou em Abrir


2
Eu tenho o mesmo problema aqui quando tento executar no IIS. Se eu executar no VS Server, não recebo nenhum erro.
Zote

11
Eu tive o mesmo problema e removi Integrated Securitya string de conexão, criei um usuário e verifiquei se ele tinha sysadminpermissões e adicionei esse usuário à string de conexão.
fulvio 13/03/12

onde está localizado o seu banco de dados, se estiver em um aplicativo hospedado no IIS, você deve colocá-lo na pasta App_Data e editar a cadeia de conexão gerada pelo modelo Entityframework para procurá-lo lá. stackoverflow.com/questions/9809442/…
eran otzap

Eu tive esse problema e foi resolvido inserindo a senha na cadeia de conexão.
precisa saber é o seguinte

Simplesmente removendo Segurança Integrada trabalhou para mim quando executados no IIS
Jon

Respostas:


215

Eu tive esse erro e encontrei algumas soluções:

Olhando para a sua cadeia de conexão, ela parece válida. Encontrei este post no blog , o problema aqui é que eles estavam usando a Segurança Integrada . Se você estiver executando no IIS, seu usuário do IIS precisará acessar o banco de dados.

Se você estiver usando o Entity Framework with Transactions , o Entity Framework abrirá e fechará automaticamente uma conexão com cada chamada ao banco de dados. Portanto, ao usar transações, você está tentando espalhar uma transação por várias conexões. Isso eleva para MSDTC .

( Consulte esta referência para obter mais informações. )

Alterar meu código para o seguinte corrigiu:

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

7
Como isso é feito ao usar o Linq para acessar as tabelas (usando EF4)?
Brett Rigby

2
@Brett Rigby: stackoverflow.com/questions/794707/… aborda como fazer isso com o Linq / EF.
22311 Scott Stafford

63
Se você estiver usando EF / DBContext, a chamada correta será context.Database.Connection.Open ();
live-love

2
Eu gostaria de ler sua postagem em vez de procurar por código quando a encontrei. Meu problema (conforme apontado nesta resposta) foi que o usuário do AppPool para o contexto do plug-in CRM 2011 não tinha acesso de gravação ao banco de dados que eu configurei. Quando adicionei o usuário ao SQL, o Plugin funcionou como um encanto.
Mike_Matthews_II

2
Eu não tinha uma cadeia de conexão na minha configuração com o nome do contexto que eu estava criando ....... verifique isso também.
Bill Blankenship

38

context.Connection.Open() não ajudou a resolver o meu problema, tentei ativar "Permitir clientes remotos" na configuração do DTC, sem mais erros.

No Windows 7, você pode abrir a configuração do DTC executando dcomcnfg, Serviços de componentes -> Computadores -> Meu computador -> Coordenador de transações distribuídas -> Clique com o botão direito do mouse em DTC local -> Segurança.


11
No Windows 7, você pode abrir a configuração do DTC executando dcomcnfg , Serviços de componentes -> Computadores -> Meu computador -> Coordenador de transações distribuídas -> Clique com o botão direito do mouse em DTC local -> Segurança.
Kerem 3/03

7
Na verdade, clique com o botão direito do mouse em DTC local -> Propriedades -> Segurança
Otto Abnormalverbraucher

27

Você deve ver innerException para ver qual é a causa interna do lançamento do erro.

No meu caso, o erro original foi:

Não foi possível abrir o arquivo físico "D: \ Projects2 \ xCU \ xCU \ App_Data \ xCUData_log.ldf". Erro do sistema operacional 5: "5 (acesso negado.)". Uma tentativa de anexar um banco de dados nomeado automaticamente para o arquivo D: \ Projects2 \ xCU \ xCU \ App_Data \ xCUData.mdf falhou. Existe um banco de dados com o mesmo nome ou o arquivo especificado não pode ser aberto ou está localizado no compartilhamento UNC.

que foi resolvido dando permissão total ao usuário atual para acessar arquivos mdfe relacionados ldfusando as propriedades dos arquivos.


24

Achei que o problema era que eu tinha o caminho do servidor dentro da cadeia de conexão em uma destas variantes:

SERVER\SQLEXPRESS
SERVER

Quando realmente eu deveria ter:

.\SQLEXPRESS

Por algum motivo, recebi o erro sempre que havia dificuldade em localizar a instância do SQL.


6
Isso pode ocorrer porque você não possui pipes nomeados ativados como método de conexão para o SQL Server.
Paul

1
@ Paul, obrigado. Provavelmente, como se tratasse de uma nova instalação do SQL, lançada com os pipes nomeados desativados. Obrigado pelo aviso. 1
dooburt

1
Obrigado por isso, tive esse problema devido à desativação de pipes nomeados.
Patrick Allwood

15

Este é apenas um problema comum. Até eu já enfrentei esse problema. Na máquina de desenvolvimento, configurada com autenticação do Windows, ela funciona perfeitamente:

<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" />

Uma vez hospedado no IIS com a mesma configuração, recebi este erro:

O provedor subjacente falhou em Abrir

Foi resolvido alterando connectionStringo arquivo de configuração:

<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" />

Outros erros comuns podem ser:

  1. Serviço de banco de dados pode ser parado
  2. Atributos de fonte de dados apontando para um banco de dados local com autenticação do Windows e hospedado no IIS
  3. Nome de usuário e senha podem estar errados.

Para mim, o problema foi quando eu criei o modelo de dados EF, ele criou uma cadeia de conexão que usa os dados de logon do Data Connections no VS. Nenhum usuário ou senha estava na cadeia de conexão. Remova Integrated Security=Truee substitua-o por user id=sa;password=notmyrealpasswordpara corrigir esse problema de implantação.
LostNomad311

10

Ao receber esta exceção, certifique-se de expandir os detalhes e observe os detalhes internos da exceção, pois ela fornecerá detalhes sobre por que o logon falhou. No meu caso, a cadeia de conexão continha um usuário que não tinha acesso ao meu banco de dados.

Independentemente de você usar a Segurança Integrada (o contexto do Usuário Windows logado) ou uma conta SQL individual, verifique se o usuário tem acesso adequado em 'Segurança' ao banco de dados que você está tentando acessar para evitar esse problema.


Eu tenho o mesmo problema que a postagem original, verifiquei meu nome de host e verifiquei na exceção interna que estou usando o nome de usuário correto. A segurança do usuário do SSMS parece correta - a conta do SQL Server está configurada corretamente e tem acesso público ao banco de dados. Mas, o login falhou.
Códigos com Hammer

Qual inner exceptioné o problema do estado? Essa foi a minha resposta aqui, que fornecerá os detalhes adicionais ocultos necessários para entender o verdadeiro problema subjacente. O inner exceptionnão verificará se você tem o logon correto - é uma exceção, não um esclarecimento.
Atletway

Login failed for user 'user'.
Códigos com Hammer

Eu também tentei adicionar NT AUTHORITY\NETWORK SERVICEà lista de usuários do SQL Server. Eu ainda tenho a mesma falha de login rejeitada.
Códigos com Hammer

RESOLVIDO. Eu precisava mudar data sourcepara hostname\SQLEXPRESS. Eu tinha tentado hostnamee .\SQLEXPRESSanteriormente. Então, consegui me conectar com a segurança integrada. Curiosamente, esse é o oposto da resposta de dooburt . Mais curioso, o nome de usuário do SQL Server nunca conseguiu se conectar a partir do Visual Studio.
Códigos com Hammer


4

O serviço SQL Server Express não foi definido para iniciar automaticamente.

1) Vá para o painel de controle 2) Ferramentas administrativas 3) Serviço 4) Configure o SQL Server express para iniciar automaticamente clicando nele 5) Clique com o botão direito do mouse e inicie o serviço

Espero que ajude.


3

Isso também pode acontecer se você restaurar um banco de dados e o usuário já existir com um esquema diferente, deixando-o incapaz de atribuir as permissões corretas.

Para corrigir esta execução:

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

Absolutamente este foi o problema. Acabei de restaurar de um backup. Dê uma olhada nos detalhes para analisar.
Nesimtunc 29/07


2

Verifique se cada valor do elemento na cadeia de conexão que está sendo fornecida está correto. No meu caso, estava recebendo o mesmo erro porque o nome do catálogo (nome do banco de dados) especificado na cadeia de conexão estava incorreto.


1

Eu tive um problema semelhante com exceções devido ao estado da conexão e percebi que minha variável de classe de serviço de domínio foi marcada como estática (por engano).

Meu palpite é que, uma vez que a biblioteca de serviço é carregada na memória, cada nova chamada acaba usando o mesmo valor de variável estática (instância de serviço de domínio), causando conflitos por meio do estado da conexão.

Penso também que cada chamada de cliente resultou em um novo thread, de modo que vários threads acessando a mesma instância de serviço de domínio foram equivalentes a um acidente de trem.


Isso foi o que fez por mim também. Parece que se você marcar como estático, isso causa todos os tipos de problemas com a instância com a qual está tentando trabalhar.
Michael J. Gray

1

Eu tive o mesmo problema, mas o que funcionou para mim foi remover isso da seqüência de conexão:

persist security info=True


1

Eu tive um erro semelhante com a exceção interna como abaixo:

operação não é válida para o estado da transação

Eu poderia resolvê-lo ativando as configurações de segurança do DTC.

Vá para Propriedades do DTC, na guia Segurança, verifique o abaixo

  • Acesso ao DTC em rede
  • Permitir clientes remotos
  • Comunicação do Transaction Manager
  • Permitir entrada
  • Permitir saída

1

Se você receber esse erro em um aplicativo Web ASP.NET, além de outras coisas mencionadas, verifique o seguinte:

  1. Permissões de segurança do usuário do banco de dados (quais usuários têm acesso permitido ao seu banco de dados.
  2. Verifique seu pool de aplicativos no IIS e verifique se é o correto que tem acesso permitido ao seu banco de dados.

1

Eu me livrei disso redefinindo o IIS , mas ainda usando Integrated Authenticationa string de conexão.


1

A definição de uma nova regra do Firewall do Windows para o SQL Server (e para a porta 1433) na máquina do servidor resolve esse erro (se o nome do servidor, o nome de login do usuário ou a senha não estiverem incorretos na cadeia de conexão ...).


0

Um erro comum que eu cometi porque estava movendo o aplicativo de um PC para outro e nenhum dos itens acima funcionou foi que eu esqueci de copiar a cadeia de conexão para App.Config e Web.Config!


0

Eu tive um problema semelhante: nas execuções de meus casos de teste, sempre recebia esse erro. Descobri que meu "Serviço de Transação Distribuída" não foi iniciado (execute: services.msc -> start "Serviço de Transação Distribuída" (melhor configurá-lo para iniciar automaticamente)). Depois que fiz isso, funcionou como um encanto ...


0

Copiei os arquivos do banco de dados (.mdf / .ldf) para a pasta App_Data para se livrar dessa exceção.


0

Eu também estava enfrentando o mesmo problema. Agora eu fiz isso removendo o nome de usuário e a senha da string de conexão.


0

Para mim, foi apenas um simples erro:

Usei o Amazon EC2 e meu endereço IP elástico na cadeia de conexão, mas quando mudei os endereços IP, esqueci de atualizar minha cadeia de conexão.


0

De repente, ocorreu esse erro inesperadamente em um de nossos sites. No meu caso, descobriu-se que a senha do usuário SQL expirou! Desmarcar a caixa de expiração de senha no SQL Server Management Studio fez o truque!



0

Em IIS definir o App Identidade do Pool de usuário Conta de Serviço como ou conta de administrador ou conta de formiga que tem permissão para fazer a operação no banco de dados.


0

No meu caso, havia uma incompatibilidade entre o nome da cadeia de conexão que estava registrando no construtor do contexto e o nome no meu web.config. Erro simples causado por copiar e colar: D

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


0

Eu tenho o mesmo erro que encontrei quando altero minha connectionString para nova fonte de dados. Eu esqueço de alterar o nome de usuário e a senha do novo banco de dados


0

Também ocorreu esse erro se o nome da instância do SQL Server não for especificado e o host SQL tiver várias instâncias do SQL instaladas. Aqui estão alguns exemplos para esclarecer:

A cadeia de conexão abaixo resulta na exceção "O provedor subjacente falhou ao abrir" sem exceção interna em um aplicativo .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"

A seguinte cadeia de conexão é executada conforme o esperado em um aplicativo .net WebForms em que o ambiente SQL possui várias instâncias. Raro eu sei, mas tenho algumas instâncias SQL diferentes na minha caixa de desenvolvimento para acomodar projetos diferentes:

 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

no meu caso, o endereço do servidor foi alterado pelo administrador do servidor, então tive que alterar a cadeia de conexão para o novo endereço do servidor


0

Eu tive esse problema porque o login no Pool de aplicativos em que este aplicativo estava sendo executado havia sido alterado.

No IIS:

  • Encontre o pool de aplicativos clicando em seu site e acessando Configurações básicas.

  • Vá para Pools de aplicativos.

  • Clique no pool de aplicativos do seu site.

  • Clique em Configurações avançadas.

  • Em Identidade, insira o login e a senha da conta.

  • Reinicie seu site e tente novamente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.