Errore MSSQL "Il provider sottostante non è riuscito all'apertura"


220

Stavo usando un .mdfper connettermi ad un databasee entityClient. Ora voglio cambiare la stringa di connessione in modo che non ci siano .mdffile.

Il seguente è connectionStringcorretto?

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

Perché ottengo sempre l'errore:

Il provider sottostante non è riuscito in Open


2
Ho lo stesso problema qui quando provo a eseguire IIS. Se corro in VS Server non ottengo alcun errore.
Zote,

11
Ho avuto lo stesso problema e rimosso Integrated Securitydalla stringa di connessione, ho creato un utente e mi sono assicurato che avessero le sysadminautorizzazioni e l' ho aggiunto alla stringa di connessione.
fulvio

dove si trova il tuo DB, se si trova su un'applicazione ospitata su IIS, dovresti posizionare il tuo DB nella cartella App_Data e modificare la stringa di connessione generata dal modello Entityframework per cercarla lì. stackoverflow.com/questions/9809442/...
Eran otzap

Ho riscontrato questo problema ed è stato risolto inserendo la password nella stringa di connessione.
satyrFrost

La semplice rimozione della sicurezza integrata ha funzionato per me durante l'esecuzione sotto IIS
Jon

Risposte:


215

Ho riscontrato questo errore e ho trovato alcune soluzioni:

Guardando la tua stringa di connessione, sembra valida. Ho trovato questo post sul blog , il problema qui è che stavano usando la sicurezza integrata . Se si esegue IIS, l'utente IIS deve accedere al database.

Se si utilizza Entity Framework con Transazioni , Entity Framework apre e chiude automaticamente una connessione con ciascuna chiamata al database. Pertanto, quando si utilizzano le transazioni, si sta tentando di distribuire una transazione su più connessioni. Ciò si eleva a MSDTC .

( Vedi questo riferimento per maggiori informazioni. )

La modifica del mio codice con il seguente risolto:

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

7
Come si fa quando si utilizza Linq per accedere alle tabelle (usando EF4)?
Brett Rigby,

2
@Brett Rigby: stackoverflow.com/questions/794707/... coperchi come fare questo con LINQ / EF.
Scott Stafford,

63
Se si utilizza EF / DBContext, la chiamata corretta è context.Database.Connection.Open ();
live-love

2
Mi piacerebbe leggere il tuo post invece di scremarlo per il codice quando l'ho trovato per la prima volta. Il mio problema (come sottolineato in questa risposta) era che l'utente AppPool per il contesto del plugin CRM 2011 non aveva accesso in scrittura al database che avevo impostato. Quando ho aggiunto l'utente a SQL, il plugin ha funzionato come un fascino.
Mike_Matthews_II

2
Nella mia configurazione non avevo una stringa di connessione che prende il nome dal contesto che stavo creando ....... controlla anche quello.
Bill Blankenship,

38

context.Connection.Open() non ha aiutato a risolvere il mio problema, quindi ho provato ad abilitare "Consenti client remoti" nella configurazione DTC, niente più errori.

In Windows 7 è possibile aprire la configurazione DTC eseguendo dcomcnfg, Servizi componenti -> Computer -> Risorse del computer -> Coordinatore delle transazioni distribuite -> Fare clic con il tasto destro del mouse su DTC locale -> Sicurezza.


11
In Windows 7 è possibile aprire la configurazione DTC eseguendo dcomcnfg , Servizi componenti -> Computer -> Risorse del computer -> Coordinatore delle transazioni distribuite -> Fare clic con il tasto destro del mouse su DTC locale -> Sicurezza.
kerem,

7
In realtà è il tasto destro del mouse su DTC locale -> Proprietà -> Sicurezza
Otto Abnormalverbraucher

27

Dovresti vedere innerException per vedere qual è la causa interna del lancio dell'errore.

Nel mio caso, l'errore originale era:

Impossibile aprire il file fisico "D: \ Projects2 \ xCU \ xCU \ App_Data \ xCUData_log.ldf". Errore del sistema operativo 5: "5 (Accesso negato.)". Un tentativo di collegare un database con nome automatico per il file D: \ Projects2 \ xCU \ xCU \ App_Data \ xCUData.mdf non è riuscito. Esiste un database con lo stesso nome o non è possibile aprire il file specificato o si trova nella condivisione UNC.

che è stato risolto dando l'autorizzazione completa all'utente corrente per l'accesso a file mdfe ldffile correlati usando le proprietà dei file.


24

Ho riscontrato che il problema era che avevo il percorso del server all'interno della stringa di connessione in una di queste varianti:

SERVER\SQLEXPRESS
SERVER

Quando davvero dovrei avere:

.\SQLEXPRESS

Per qualche motivo ho ricevuto l'errore ogni volta che ha avuto difficoltà a individuare l'istanza di SQL.


6
Ciò potrebbe essere dovuto al fatto che non hai abilitato le named pipe abilitate come metodo di connessione per SQL Server.
Paul,

1
@Paul, grazie. Era probabile che si trattasse di una nuova installazione di SQL, che veniva implementata con pipe denominate disabilitate. Grazie per il testa a testa. +1
dooburt,

1
Grazie per questo, ho avuto questo problema a causa della disabilitazione delle pipe con nome.
Patrick Allwood,

15

Questo è solo un problema comune. Anche io ho affrontato questo problema. Sulla macchina di sviluppo, configurata con l'autenticazione di Windows, funziona perfettamente:

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

Una volta ospitato in IIS con la stessa configurazione, ho ricevuto questo errore:

Il provider sottostante non è riuscito in Open

È stato risolto il cambiamento connectionStringnel file di configurazione:

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

Altri errori comuni potrebbero essere:

  1. Il servizio di database potrebbe essere arrestato
  2. Attributi dell'origine dati che puntano a un database locale con autenticazione di Windows e ospitati in IIS
  3. Nome utente e password potrebbero essere errati.

Per me il problema è stato quando ho creato il modello di dati EF che ha creato una stringa di connessione che utilizza i dati di accesso dalle connessioni dati in VS. Nessun utente o password era nella stringa di connessione, quindi rimuovila Integrated Security=Truee sostituiscila con user id=sa;password=notmyrealpasswordper risolvere questo problema di distribuzione.
LostNomad311

10

Quando ricevi questa eccezione, assicurati di espandere i dettagli e guarda i dettagli interni dell'eccezione poiché forniranno dettagli sul perché l'accesso non è riuscito. Nel mio caso la stringa di connessione conteneva un utente che non aveva accesso al mio database.

Indipendentemente dal fatto che si utilizzi la sicurezza integrata (il contesto dell'utente Windows registrato) o un singolo account SQL, assicurarsi che l'utente disponga dell'accesso corretto in "Sicurezza" per il database a cui si sta tentando di accedere per evitare questo problema.


Ho lo stesso problema del post originale, verificato il mio nome host e verificato, nell'eccezione interna, che sto usando il nome utente corretto. La sicurezza dell'utente SSMS sembra corretta: l'account SQL Server è configurato correttamente e ha accesso pubblico al database. Ma l'accesso non è riuscito.
Codici con Hammer,

Qual è lo inner exceptionstato del problema? Questa è stata la mia risposta qui, che fornirà i dettagli aggiuntivi nascosti necessari per comprendere il vero problema di fondo. Il inner exceptionnon si verifica che si ha l'accesso corretto - è un non un'eccezione un chiarimento.
atconway,

Login failed for user 'user'.
Codici con Hammer,

Ho anche provato ad aggiungere NT AUTHORITY\NETWORK SERVICEall'elenco degli utenti di SQL Server. Ho ancora lo stesso errore di accesso rifiutato.
Codici con Hammer,

RISOLTO. Ho dovuto cambiare data sourcein hostname\SQLEXPRESS. Ci avevo provato hostnamee in .\SQLEXPRESSprecedenza. Quindi sono stato in grado di connettermi con la sicurezza integrata. Curiosamente, questo è l'opposto della risposta di Dooburt . Curioso, il nome utente di SQL Server non è mai stato in grado di connettersi da Visual Studio.
Codici con Hammer,


4

Il servizio SQL Server Express non è stato impostato per l'avvio automatico.

1) Vai al pannello di controllo 2) Strumenti di amministrazione 3) Servizio 4) Imposta SQL Server Express per l'avvio automatico facendo clic su di esso 5) Fai clic destro e avvia il servizio

Spero che possa essere d'aiuto.


3

Ciò può accadere anche se si ripristina un database e l'utente esiste già con uno schema diverso, lasciando impossibile assegnare le autorizzazioni corrette.

Per correggere questa corsa:

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

Assolutamente questo era il problema. Ho appena ripristinato da un backup. Dai un'occhiata all'analisi dei dettagli.
nesimtunc,


2

Assicurarsi che ciascun valore dell'elemento nella stringa di connessione fornita sia corretto. Nel mio caso, stavo ottenendo lo stesso errore perché il nome del catalogo (nome del database) specificato nella stringa di connessione era errato.


1

Ho avuto un problema simile con le eccezioni a causa dello stato della connessione, quindi mi sono reso conto che la mia variabile di classe del servizio di dominio era contrassegnata come statica (per errore).

La mia ipotesi è che una volta caricata la libreria di servizi in memoria, ogni nuova chiamata finisce con lo stesso valore di variabile statica (istanza del servizio di dominio), causando conflitti attraverso lo stato della connessione.

Penso anche che ogni chiamata del client abbia portato a un nuovo thread, quindi più thread che accedono alla stessa istanza del servizio di dominio equivalgono a un disastro ferroviario.


Questo è ciò che ha fatto anche per me. Sembra che se lo contrassegni come statico, causa solo tutti i tipi di problemi con l'istanza con cui sta cercando di funzionare.
Michael J. Gray

1

Ho avuto lo stesso problema, ma ciò che ha funzionato per me è stato rimuovere questo dalla stringa di connessione:

persist security info=True


1

Ho avuto un errore simile con l'eccezione interna come di seguito:

l'operazione non è valida per lo stato della transazione

Potrei risolverlo abilitando le impostazioni di sicurezza DTC.

Vai a Proprietà di DTC, sotto la scheda Sicurezza, controlla sotto

  • Accesso DTC alla rete
  • Consenti client remoti
  • Comunicazione del gestore transazioni
  • Consenti in entrata
  • Consenti in uscita

1

Se si verifica questo errore in un'applicazione Web ASP.NET, oltre alle altre cose menzionate, controllare quanto segue:

  1. Autorizzazioni di sicurezza dell'utente del database (a cui gli utenti sono autorizzati ad accedere al database.
  2. Controllare il pool di applicazioni in IIS e assicurarsi che sia quello corretto a cui è consentito l'accesso al database.

1

Mi sono liberato di questo ripristinando IIS , ma usando ancora Integrated Authenticationnella stringa di connessione.


1

La definizione di una nuova regola di Windows Firewall per SQL Server (e per la porta 1433) sulla macchina server risolve questo errore (se il nome del server, il nome di accesso dell'utente o la password non sono errati nella stringa di connessione ...).


0

Un errore comune che ho fatto perché stavo spostando l'applicazione da un PC all'altro e nessuno dei precedenti ha funzionato è che ho dimenticato di copiare la stringa di connessione su App.Config e Web.Config!


0

Ho avuto un problema simile: nelle mie esecuzioni nei casi di test ho sempre avuto questo errore. Ho scoperto che il mio "Servizio di transazione distribuita" non è stato avviato (esegui: services.msc -> avvia "Servizio di transazione distribuita" (meglio impostarlo per l'avvio automatico)). Dopo averlo fatto, ha funzionato come un fascino ...


0

Ho copiato i file del database (.mdf / .ldf) nella cartella App_Data per eliminare questa eccezione.


0

Stavo anche affrontando lo stesso problema. Ora l'ho fatto rimuovendo il nome utente e la password dalla stringa di connessione.


0

Per me è stato solo un semplice errore:

Ho usato Amazon EC2 e ho usato il mio indirizzo IP elastico nella stringa di connessione, ma quando ho cambiato gli indirizzi IP ho dimenticato di aggiornare la mia stringa di connessione.


0

Ho avuto questo errore improvvisamente accadere all'improvviso su uno dei nostri siti. Nel mio caso, si è scoperto che la password dell'utente SQL era scaduta! Deselezionare la casella di scadenza della password in SQL Server Management Studio ha funzionato!



0

In IIS impostare l' account account identità di servizio come account utente o account amministratore o account ant che disponga dell'autorizzazione per eseguire l'operazione su quel database.


0

Nel mio caso avevo una discrepanza tra il nome della stringa di connessione che stavo registrando nel costruttore del contesto e il nome nel mio web.config. Semplice errore causato da copia e incolla: D

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


0

ho lo stesso errore che ho riscontrato quando cambio la mia connessione String su nuova origine dati dimentico di cambiare il nome utente e il passowrd per il nuovo database


0

Ho anche avuto questo errore accadere se il nome dell'istanza di SQL Server non è specificato e l'host SQL ha più istanze SQL installate. Ecco un paio di esempi per chiarire:

La stringa di connessione seguente genera l'eccezione "Il provider sottostante non è riuscito su Apri" senza eccezioni interne in un'app .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"

La seguente stringa di connessione viene eseguita come previsto in un'app WebForms .net in cui l'ambiente SQL ha più istanze. Raro lo so, ma ho alcune istanze SQL diverse nella mia casella di sviluppo per ospitare progetti diversi:

 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

nel mio caso l'indirizzo del server è stato modificato dall'amministratore del server, quindi ho dovuto cambiare la stringa di connessione con il nuovo indirizzo del server


0

Ho avuto questo problema perché il login al pool di applicazioni in cui era in esecuzione questa app era cambiato.

In IIS:

  • Trova il pool di applicazioni facendo clic sul tuo sito e andando su Impostazioni di base.

  • Vai a Pool di applicazioni.

  • Fai clic sul pool di applicazioni del tuo sito.

  • Fai clic su Impostazioni avanzate.

  • In Identità, immettere l'accesso e la password dell'account.

  • Riavvia il tuo sito e riprova.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.