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

senzacionale
fonte
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
}
Christian Payne
fonte
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.

kerem
fonte
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.

Majid
fonte
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.

dooburt
fonte
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.
JaiSankarN
fonte
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.

atconway
fonte
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
6

Eu tive um problema semelhante com o SQL Server Express Edition no Windows Server 2003 . Simplesmente adicionei o serviço de rede como usuário na segurança do banco de dados.

Par6
fonte
4
Você pode descrever como você faz isso?
Peter Mortensen
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.

user2033790
fonte
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
79E09796
fonte
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.

Rajesh
fonte
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.

James Wilkins
fonte
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

FV01
fonte
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
sparhea
fonte
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.
alexk
fonte
1

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

Ravi Thiagarajan
fonte
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 ...).

Gökhan Yılmaz
fonte
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!

rikket
fonte
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 ...

iber
fonte
0

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

mdc
fonte
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.

user2650536
fonte
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.

Erez Robinson
fonte
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!

Connell
fonte
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.

Jaydeep Shil
fonte
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);
    }

dEVmARCO
fonte
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

Hamza Yahia
fonte
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"
Sam Ellis
fonte
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

Ali Sadri
fonte
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.

amor ao vivo
fonte