MSSQL-Fehler 'Der zugrunde liegende Anbieter ist beim Öffnen fehlgeschlagen'

220

Ich habe ein verwendet, um eine .mdfVerbindung zu einem databaseund herzustellen entityClient. Jetzt möchte ich die Verbindungszeichenfolge so ändern, dass keine .mdfDatei mehr vorhanden ist.

Ist das folgende connectionStringrichtig?

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

Weil ich immer den Fehler bekomme:

Der zugrunde liegende Anbieter ist beim Öffnen fehlgeschlagen

senzacionale
quelle
2
Ich habe hier das gleiche Problem, wenn ich versuche, unter IIS auszuführen. Wenn ich in VS Server laufe, erhalte ich keine Fehlermeldung.
Zote
11
Ich hatte das gleiche Problem und entfernte es Integrated Securityaus dem Verbindungsstring, erstellte einen Benutzer und stellte sicher, dass er über sysadminBerechtigungen verfügt, und fügte diesen Benutzer dem Verbindungsstring hinzu.
Fulvio
Wo befindet sich Ihre Datenbank? Wenn sie sich in einer auf IIS gehosteten Anwendung befindet, sollten Sie Ihre Datenbank in Ihrem Ordner App_Data ablegen und die vom Entityframework-Modell generierte Verbindungszeichenfolge bearbeiten, um dort danach zu suchen. stackoverflow.com/questions/9809442/…
eran otzap
Ich hatte dieses Problem und es wurde gelöst, indem das Passwort in die Verbindungszeichenfolge eingefügt wurde.
SatyrFrost
Das einfache Entfernen von Integrated Security funktionierte für mich, wenn ich unter IIS
Jon

Antworten:

215

Ich hatte diesen Fehler und fand einige Lösungen:

Wenn Sie sich Ihre Verbindungszeichenfolge ansehen, sieht sie gültig aus. Ich habe diesen Blog-Beitrag gefunden . Das Problem hier ist, dass sie Integrated Security verwenden . Wenn Sie mit IIS ausgeführt werden, benötigt Ihr IIS-Benutzer Zugriff auf die Datenbank.

Wenn Sie Entity Framework mit Transaktionen verwenden , öffnet und schließt Entity Framework bei jedem Datenbankaufruf automatisch eine Verbindung. Wenn Sie also Transaktionen verwenden, versuchen Sie, eine Transaktion auf mehrere Verbindungen zu verteilen. Dies erhöht sich zu MSDTC .

( Weitere Informationen finden Sie in dieser Referenz. )

Das Ändern meines Codes in das Folgende hat das Problem behoben:

using (DatabaseEntities context = new DatabaseEntities())
{
    context.Connection.Open();
    // the rest
}
Christian Payne
quelle
7
Wie wird dies gemacht, wenn mit Linq auf die Tabellen zugegriffen wird (mit EF4)?
Brett Rigby
2
@Brett Rigby: stackoverflow.com/questions/794707/… beschreibt, wie dies mit Linq / EF gemacht wird.
Scott Stafford
63
Wenn Sie EF / DBContext verwenden, lautet der richtige Aufruf context.Database.Connection.Open ();
Live-Liebe
2
Ich wünschte, ich würde Ihren Beitrag lesen, anstatt ihn nach Code zu durchsuchen, als ich ihn zum ersten Mal fand. Mein Problem (wie in dieser Antwort ausgeführt) war, dass der AppPool-Benutzer für den CRM 2011-Plugin-Kontext keinen Schreibzugriff auf die von mir eingerichtete Datenbank hatte. Als ich den Benutzer zu SQL hinzufügte, funktionierte das Plugin wie ein Zauber.
Mike_Matthews_II
2
Ich hatte keine Verbindungszeichenfolge in meiner Konfiguration, die nach dem von mir erstellten Kontext benannt ist. Überprüfen Sie dies auch.
Bill Blankenship
38

context.Connection.Open() hat nicht geholfen, mein Problem zu lösen, also habe ich versucht, "Remote-Clients zulassen" in der DTC-Konfiguration zu aktivieren, kein Fehler mehr.

In Windows 7 können Sie die DTC-Konfiguration öffnen, indem Sie dcomcnfg, Komponentendienste -> Computer -> Arbeitsplatz -> Verteilter Transaktionskoordinator -> Rechtsklick auf Lokaler DTC -> Sicherheit ausführen.

kerem
quelle
11
In Windows 7 können Sie die DTC-Konfiguration öffnen , indem Sie dcomcnfg , Komponentendienste -> Computer -> Arbeitsplatz -> Verteilter Transaktionskoordinator -> Rechtsklick auf Lokaler DTC -> Sicherheit ausführen .
Zerem
7
Eigentlich ist es Rechtsklick auf lokalen DTC -> Eigenschaften -> Sicherheit
Otto Abnormalverbraucher
27

Sie sollten innerException sehen, um zu sehen, was die innere Ursache für das Auslösen von Fehlern ist.

In meinem Fall war der ursprüngliche Fehler:

Die physische Datei "D: \ Projects2 \ xCU \ xCU \ App_Data \ xCUData_log.ldf" kann nicht geöffnet werden. Betriebssystemfehler 5: "5 (Zugriff verweigert.)". Der Versuch, eine automatisch benannte Datenbank für die Datei D: \ Projects2 \ xCU \ xCU \ App_Data \ xCUData.mdf anzuhängen, ist fehlgeschlagen. Eine Datenbank mit demselben Namen ist vorhanden, oder die angegebene Datei kann nicht geöffnet werden oder befindet sich auf der UNC-Freigabe.

Dies wurde gelöst, indem dem aktuellen Benutzer die vollständige Berechtigung zum Zugriff auf verwandte Dateien mdfund ldfDateien mithilfe der Dateieigenschaften erteilt wurde .

Majid
quelle
24

Ich fand das Problem, dass ich den Serverpfad innerhalb der Verbindungszeichenfolge in einer dieser Varianten hatte:

SERVER\SQLEXPRESS
SERVER

Wann sollte ich wirklich haben:

.\SQLEXPRESS

Aus irgendeinem Grund wurde der Fehler immer dann angezeigt, wenn es schwierig war, die SQL-Instanz zu finden.

Dooburt
quelle
6
Dies kann daran liegen, dass Sie Named Pipes nicht als Verbindungsmethode für SQL Server aktiviert haben.
Paul
1
@ Paul, danke. Es war wahrscheinlich, dass es sich um eine Neuinstallation von SQL handelte, die mit deaktivierten Named Pipes eingeführt wird. Danke für die Warnung. +1
Dooburt
1
Vielen Dank dafür, ich hatte dieses Problem, weil Named Pipes deaktiviert waren.
Patrick Allwood
15

Dies ist nur ein häufiges Problem. Sogar ich habe mich diesem Problem gestellt. Auf dem mit Windows-Authentifizierung konfigurierten Entwicklungscomputer funktioniert dies einwandfrei:

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

Nach dem Hosting in IIS mit derselben Konfiguration wurde folgende Fehlermeldung angezeigt:

Der zugrunde liegende Anbieter ist beim Öffnen fehlgeschlagen

Es wurde eine Änderung connectionStringin der Konfigurationsdatei behoben :

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

Andere häufige Fehler könnten sein:

  1. Der Datenbankdienst konnte gestoppt werden
  2. Datenquellenattribute, die auf eine lokale Datenbank mit Windows-Authentifizierung verweisen und in IIS gehostet werden
  3. Benutzername und Passwort könnten falsch sein.
JaiSankarN
quelle
Für mich bestand das Problem darin, dass beim Erstellen des EF-Datenmodells eine Verbindungszeichenfolge erstellt wurde, die die Anmeldedaten aus den Datenverbindungen in VS verwendet. Die Verbindungszeichenfolge enthielt weder einen Benutzer noch ein Kennwort. Entfernen Sie sie Integrated Security=Trueund ersetzen Sie sie durch user id=sa;password=notmyrealpassword, um dieses Bereitstellungsproblem zu beheben.
LostNomad311
10

Wenn Sie diese Ausnahme erhalten, stellen Sie sicher, dass Sie die Details erweitern und die inneren Ausnahmedetails betrachten, da sie Details zum Warum enthalten die Anmeldung fehlgeschlagen ist. In meinem Fall enthielt die Verbindungszeichenfolge einen Benutzer, der keinen Zugriff auf meine Datenbank hatte.

Unabhängig davon, ob Sie Integrated Security (den Kontext des angemeldeten Windows-Benutzers) oder ein einzelnes SQL-Konto verwenden, stellen Sie sicher, dass der Benutzer unter "Sicherheit" für die Datenbank, auf die Sie zugreifen möchten, über den richtigen Zugriff verfügt, um dieses Problem zu vermeiden.

atconway
quelle
Ich habe das gleiche Problem wie der ursprüngliche Beitrag, habe meinen Hostnamen überprüft und in der inneren Ausnahme überprüft, dass ich den richtigen Benutzernamen verwende. Die Sicherheit von SSMS-Benutzern sieht korrekt aus - das SQL Server-Konto ist ordnungsgemäß eingerichtet und hat öffentlichen Zugriff auf die Datenbank. Die Anmeldung ist jedoch fehlgeschlagen.
Codes mit Hammer
Was ist der inner exceptionStaat das Problem? Das war meine Antwort hier, dass es die versteckten zusätzlichen Details liefert, die erforderlich sind, um das wahre zugrunde liegende Problem zu verstehen. Das inner exceptionwird nicht überprüfen, ob Sie die richtige Anmeldung haben - es ist eine Ausnahme, keine Klarstellung.
Atconway
Login failed for user 'user'.
Codes mit Hammer
Ich habe auch versucht NT AUTHORITY\NETWORK SERVICE, der SQL Server-Benutzerliste hinzuzufügen . Ich habe immer noch den gleichen abgelehnten Anmeldefehler.
Codes mit Hammer
Gelöst. Ich musste ändern data sourcezu hostname\SQLEXPRESS. Ich hatte es versucht hostnameund .\SQLEXPRESSvorher. Dann konnte ich mich mit integrierter Sicherheit verbinden. Seltsamerweise ist dies das Gegenteil von Dooburts Antwort. Seltsamerweise konnte der SQL Server-Benutzername nie eine Verbindung über Visual Studio herstellen.
Codes mit Hammer
6

Ich hatte ein ähnliches Problem mit der SQL Server Express Edition unter Windows Server 2003 . Ich habe einfach den Netzwerkdienst als Benutzer in die Datenbanksicherheit aufgenommen.

Par6
quelle
4
Können Sie beschreiben, wie Sie das machen?
Peter Mortensen
4

Der SQL Server Express-Dienst wurde nicht so eingestellt, dass er automatisch gestartet wird.

1) Gehen Sie zur Systemsteuerung. 2) Verwaltung 3) Dienst. 4) Stellen Sie SQL Server Express so ein, dass es automatisch gestartet wird, indem Sie darauf klicken. 5) Klicken Sie mit der rechten Maustaste und starten Sie den Dienst

Ich hoffe das wird helfen.

user2033790
quelle
3

Dies kann auch passieren, wenn Sie eine Datenbank wiederherstellen und der Benutzer bereits mit einem anderen Schema existiert, sodass Sie nicht die richtigen Berechtigungen zuweisen können.

So korrigieren Sie diesen Lauf:

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
quelle
Absolut das war das Problem. Ich habe gerade von einem Backup wiederhergestellt. Schauen Sie sich die Detailanalyse an.
Nesimtunc
2

Stellen Sie sicher, dass jeder Elementwert in der angegebenen Verbindungszeichenfolge korrekt ist. In meinem Fall wurde der gleiche Fehler angezeigt, weil der Name des in der Verbindungszeichenfolge angegebenen Katalogs (Datenbankname) falsch war.

Rajesh
quelle
1

Ich hatte ein ähnliches Problem mit Ausnahmen aufgrund des Verbindungsstatus. Dann wurde mir klar, dass meine Domain Service Class-Variable (aus Versehen) als statisch markiert war.

Ich vermute, dass nach dem Laden der Dienstbibliothek in den Speicher jeder neue Aufruf denselben statischen Variablenwert (Domänendienstinstanz) verwendet, was zu Konflikten über den Verbindungsstatus führt.

Ich denke auch, dass jeder Client-Aufruf zu einem neuen Thread führte, sodass mehrere Threads, die auf dieselbe Domain-Service-Instanz zugreifen, einem Zugunglück entsprechen.

James Wilkins
quelle
Das hat es auch für mich getan. Wenn Sie es als statisch markieren, verursacht es anscheinend alle möglichen Probleme mit der Instanz, mit der es zu arbeiten versucht.
Michael J. Gray
1

Ich hatte das gleiche Problem, aber was für mich funktionierte, war das Entfernen dieses aus der Verbindungszeichenfolge:

persist security info=True

FV01
quelle
1

Ich hatte einen ähnlichen Fehler mit der inneren Ausnahme wie unten:

Die Operation ist für den Status der Transaktion nicht gültig

Ich könnte es beheben, indem ich die DTC-Sicherheitseinstellungen aktiviere.

Gehen Sie zu Eigenschaften von DTC auf der Registerkarte Sicherheit und überprüfen Sie Folgendes

  • Netzwerk-DTC-Zugriff
  • RemoteClients zulassen
  • Transaction Manager-Kommunikation
  • Eingehend zulassen
  • Ausgehend zulassen
Sparhea
quelle
1

Wenn dieser Fehler in einer ASP.NET-Webanwendung auftritt, überprüfen Sie zusätzlich zu den anderen genannten Punkten Folgendes:

  1. Sicherheitsberechtigungen für Datenbankbenutzer (welche Benutzer Zugriff auf Ihre Datenbank haben).
  2. Überprüfen Sie Ihren Anwendungspool in IIS und stellen Sie sicher, dass er der richtige ist, der Zugriff auf Ihre Datenbank gewährt.
alexk
quelle
1

Ich habe dies durch Zurücksetzen von IIS beseitigt , aber immer noch Integrated Authenticationin der Verbindungszeichenfolge verwendet.

Ravi Thiagarajan
quelle
1

Durch das Definieren einer neuen Windows-Firewall- Regel für SQL Server (und für Port 1433) auf dem Server wird dieser Fehler behoben (wenn Ihr Servername, Benutzeranmeldename oder Kennwort in Ihrer Verbindungszeichenfolge nicht falsch sind ...).

Gökhan Yılmaz
quelle
0

Ein häufiger Fehler, den ich gemacht habe, weil ich die Anwendung von einem PC auf einen anderen verschoben habe und keiner der oben genannten Schritte funktioniert hat, war, dass ich vergessen habe, die Verbindungszeichenfolge sowohl in App.Config als auch in Web.Config zu kopieren!

rikket
quelle
0

Ich hatte ein ähnliches Problem: In meinen Testfallausführungen bekam ich immer diesen Fehler. Ich habe festgestellt, dass mein "Distributed Transaction Service" nicht gestartet wurde (run: services.msc -> starte "Distributed Transaction Service" (am besten so einstellen, dass er automatisch startet)). Nachdem ich das getan hatte, funktionierte es wie ein Zauber ...

iber
quelle
0

Ich habe die Datenbankdateien (.mdf / .ldf) in den Ordner App_Data kopiert, um diese Ausnahme zu beseitigen.

mdc
quelle
0

Ich stand auch vor dem gleichen Problem. Jetzt habe ich es getan, indem ich den Benutzernamen und das Passwort aus der Verbindungszeichenfolge entfernt habe.

user2650536
quelle
0

Für mich war es nur ein einfacher Fehler:

Ich habe Amazon EC2 verwendet und meine elastische IP-Adresse in der Verbindungszeichenfolge verwendet, aber als ich die IP-Adressen geändert habe, habe ich vergessen, meine Verbindungszeichenfolge zu aktualisieren.

Erez Robinson
quelle
0

Ich hatte diesen Fehler plötzlich aus heiterem Himmel auf einer unserer Websites. In meinem Fall stellte sich heraus, dass das Passwort des SQL-Benutzers abgelaufen war! Das Deaktivieren des Kennwortablauffelds in SQL Server Management Studio hat den Trick getan!

Connell
quelle
0

Legen Sie in IIS die App-Pool-Identität als Dienstkonto-Benutzer oder Administratorkonto oder Ant-Konto fest, das die Berechtigung zum Ausführen des Vorgangs in dieser Datenbank hat.

Jaydeep Shil
quelle
0

In meinem Fall hatte ich eine Nichtübereinstimmung zwischen dem Namen der Verbindungszeichenfolge, die ich im Konstruktor des Kontexts registriert habe, und dem Namen in meiner web.config. Einfacher Fehler durch Kopieren und Einfügen: D.

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

dEVmARCO
quelle
0

Ich habe den gleichen Fehler, den ich gefunden habe. Wenn ich meinen connectionString in eine neue Datenquelle ändere, vergesse ich, den Benutzernamen und das Passwort für die neue Datenbank zu ändern

Hamza Yahia
quelle
0

Dieser Fehler ist auch aufgetreten, wenn der Name der SQL Server-Instanz nicht angegeben ist und auf dem SQL-Host mehrere SQL-Instanzen installiert sind. Hier einige Beispiele zur Verdeutlichung:

Die folgende Verbindungszeichenfolge führt zu der Ausnahme "Der zugrunde liegende Anbieter ist beim Öffnen fehlgeschlagen" ohne innere Ausnahme in einer .NET WebForms-App:

 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"

Die folgende Verbindungszeichenfolge wird wie erwartet in einer .net WebForms-App ausgeführt, in der die SQL-Umgebung mehrere Instanzen enthält. Selten weiß ich, aber ich habe ein paar verschiedene SQL-Instanzen auf meiner Entwicklungsbox, um verschiedene Projekte aufzunehmen:

 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
quelle
0

In meinem Fall wurde die Serveradresse vom Serveradministrator geändert, sodass ich die Verbindungszeichenfolge in eine neue Serveradresse ändern musste

Ali Sadri
quelle
0

Ich hatte dieses Problem, weil sich das Anwendungspool-Login, unter dem diese App ausgeführt wurde, geändert hatte.

In IIS:

  • Suchen Sie den Anwendungspool, indem Sie auf Ihre Site klicken und zu Grundeinstellungen wechseln.

  • Gehen Sie zu Anwendungspools.

  • Klicken Sie auf den Anwendungspool Ihrer Site.

  • Klicken Sie auf Erweiterte Einstellungen.

  • Geben Sie unter Identität Konto-Login und Passwort ein.

  • Starten Sie Ihre Site neu und versuchen Sie es erneut.

Live-Liebe
quelle