web-dev-qa-db-fra.com

Erreur MSSQL 'Le fournisseur sous-jacent a échoué à l'ouverture'

J'utilisais un .mdf pour me connecter à un database et entityClient. Maintenant, je veux changer la chaîne de connexion pour qu'il n'y ait pas de fichier .mdf.

Est-ce que connectionString est correct?

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

Parce que je reçois toujours l'erreur:

Le fournisseur sous-jacent a échoué à l'ouverture

206
senzacionale

J'ai eu cette erreur et trouvé quelques solutions:

En regardant votre chaîne de connexion, cela semble valide. J'ai trouvé cet article de blog , le problème ici est qu'ils utilisaient sécurité intégrée . Si vous utilisez IIS, votre utilisateur IIS a besoin d'accéder à la base de données.

Si vous utilisez Entity Frameworkavec des transactions , Entity Framework ouvre et ferme automatiquement une connexion avec chaque appel de base de données. Ainsi, lorsque vous utilisez des transactions, vous essayez de répartir une transaction sur plusieurs connexions. Cela élève à MSDTC .

( Voir cette référence pour plus d'informations. )

Changer mon code à celui-ci l'a corrigé:

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

context.Connection.Open() n'a pas aidé à résoudre mon problème, alors j'ai essayé d'activer "Autoriser les clients distants" dans la configuration DTC, plus d'erreur.

Dans Windows 7, vous pouvez ouvrir la configuration DTC en exécutant dcomcnfg, Services de composants -> Ordinateurs -> Poste de travail -> Coordinateur de transactions distribuées -> Cliquez avec le bouton droit de la souris sur DTC local -> Sécurité.

38
kerem

Vous devriez voir innerException pour voir quelle est la cause intérieure du rejet d'une erreur.

Dans mon cas, l'erreur initiale était:

Impossible d'ouvrir le fichier physique "D:\Projects2\xCU\xCU\App_Data\xCUData_log.ldf". Erreur de système d'exploitation 5: "5 (Accès refusé.)". Une tentative de liaison d'une base de données nommée automatiquement pour le fichier D:\Projects2\xCU\xCU\App_Data\xCUData.mdf a échoué. Une base de données portant le même nom existe, ou le fichier spécifié ne peut pas être ouvert ou se trouve sur le partage UNC.

ce qui a été résolu en donnant à l'utilisateur actuel la permission complète d'accéder aux fichiers mdf et ldf associés à l'aide des propriétés de fichiers.

26
Majid

J'ai trouvé que le problème était que le chemin du serveur était inclus dans l'une des variantes de la chaîne de connexion:

SERVER\SQLEXPRESS
SERVER

Quand aurais-je vraiment dû:

.\SQLEXPRESS

Pour une raison quelconque, j'ai eu l'erreur chaque fois qu'il a eu des difficultés à localiser l'instance de SQL.

24
dooburt

Ceci est un problème commun uniquement. Même j'ai fait face à ce problème. Sur la machine de développement, configurée avec l'authentification Windows, cela fonctionne parfaitement:

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

Une fois hébergé dans IIS avec la même configuration, j'ai eu cette erreur:

Le fournisseur sous-jacent a échoué à l'ouverture

Cela a été résolu en changeant connectionString dans le fichier de configuration:

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

Les autres erreurs courantes pourraient être:

  1. Service de base de données pourrait être arrêté
  2. Attributs de source de données pointant vers une base de données locale avec authentification Windows et hébergés dans IIS
  3. Le nom d'utilisateur et le mot de passe peuvent être erronés.
15
JaiSankarN

Lorsque vous recevez cette exception, veillez à développer les détails et à consulter les détails exception interne, car ils fourniront des détails sur pourquoi, la connexion a échoué. Dans mon cas, la chaîne de connexion contenait un utilisateur qui n'avait pas accès à ma base de données.

Que vous utilisiez la sécurité intégrée (le contexte de l'utilisateur Windows enregistré) ou un compte SQL individuel, assurez-vous que l'utilisateur dispose d'un accès approprié sous "Sécurité" pour la base de données à laquelle vous essayez d'accéder afin d'éviter ce problème.

10
atconway

J'ai eu un problème similaire avec le SQL Server Express Edition sur Windows Server 20 . J'ai simplement ajouté le service réseau en tant qu'utilisateur de la sécurité de la base de données.

6
Par6

Les services SQL Server Express n'étaient pas définis pour démarrer automatiquement.

1) Accédez au panneau de configuration 2) Outils d'administration 3) Service 4) Configurez SQL Server Express pour qu'il démarre automatiquement en cliquant dessus 5) Cliquez avec le bouton droit de la souris et démarrez le service

J'espère que cela aidera.

4
user2033790

Cela peut également se produire si vous restaurez une base de données et que l'utilisateur existe déjà avec un schéma différent, ce qui vous empêche d'attribuer les autorisations appropriées.

Pour corriger cette course:

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

Assurez-vous que chaque valeur d'élément dans la chaîne de connexion fournie est correcte. Dans mon cas, je recevais la même erreur parce que le nom du catalogue (nom de la base de données) spécifié dans la chaîne de connexion était incorrect.

2
Rajesh

J'ai posté un problème similaire ici, avec une base de données SQL 2012 hébergée sur Amazon RDS. Le problème était dans la chaîne de connexion - j'avais "Nom de l'application" et "App" propriétés dedans là. Une fois que j'ai enlevé ceux-ci, cela a fonctionné.

Entity Framework 5 et Amazon RDS - "Le fournisseur sous-jacent a échoué à Open."

2
wloescher

Je me suis débarrassé de cela en réinitialisant IIS , mais en utilisant toujours Integrated Authentication dans la chaîne de connexion.

1
Ravi Thiagarajan

Si vous obtenez cette erreur sur une application Web ASP.NET, en plus des autres choses mentionnées, vérifiez les points suivants:

  1. Autorisations de sécurité des utilisateurs de bases de données (quels utilisateurs sont autorisés à accéder à votre base de données.
  2. Vérifiez votre pool d'applications dans IIS et assurez-vous que c'est bien celui qui est autorisé à accéder à votre base de données.
1
alexk

La définition d'une nouvelle règle Pare-feu Windows pour SQL Server (et pour le port 1433) sur le serveur résout cette erreur (si votre nom de serveur, nom d'utilisateur ou mot de passe n'est pas incorrect votre chaîne de connexion ...).

1
Gökhan Yılmaz

J'ai eu un problème similaire avec des exceptions en raison de l'état de la connexion, puis j'ai réalisé que ma variable de classe de service de domaine était marquée comme statique (par erreur).

À mon avis, une fois que la bibliothèque de services est chargée en mémoire, chaque nouvel appel utilise la même valeur de variable statique (instance de service de domaine), ce qui entraîne des conflits via l'état de la connexion.

Je pense également que chaque appel du client a généré un nouveau thread. Par conséquent, plusieurs threads accédant à la même instance de service de domaine sont assimilés à une épave de train.

1
James Wilkins

J'ai eu une erreur similaire avec l'exception interne ci-dessous:

l'opération n'est pas valide pour l'état de la transaction

Je pourrais le résoudre en activant les paramètres de sécurité DTC.

Accédez à Propriétés de DTC, sous l'onglet Sécurité, cochez la case ci-dessous.

  • Accès réseau DTC
  • Autoriser les clients distants
  • Communication du gestionnaire de transactions
  • Autoriser entrant
  • Autoriser sortants
1
sparhea

J'ai eu le même problème il y a quelques jours, en utilisant "Integrated Security = True;" dans la chaîne de connexion, vous devez exécuter l'identité du pool d'applications sous "localsystem". Bien sûr, cela n'est pas recommandé, mais pour le tester, le travail est exécuté.

Voici comment changer l'identité dans IIS 7: http://www.iis.net/learn/manage/configuring-security/application-pool-identities

0
Gabriel

J'ai copié les fichiers de base de données (.mdf/.ldf) dans le dossier App_Data pour supprimer cette exception.

0
mdc

Je cherchais partout sur le Web ce problème. Je me suis trompé de nom dans la chaîne de connexion. Veuillez vérifier votre chaîne de connexion dans web.config. J'avais name="AppTest" mais cela aurait dû être name="App".

Dans mon fichier AppTestContext.cs, j'avais:

public AppTestContext() : this("App") { }

Mauvaise chaîne de connexion:

<add connectionString="Data Source=127.0.0.1;Initial Catalog=AppTest;Integrated Security=SSPI;MultipleActiveResultSets=True" name="AppTest" providerName="System.Data.SqlClient" />

Chaîne de connexion droite:

<add connectionString="Data Source=127.0.0.1;Initial Catalog=AppTest;Integrated Security=SSPI;MultipleActiveResultSets=True" name="App" providerName="System.Data.SqlClient" />
0
m4rt1n

Je faisais également face au même problème. Maintenant, je l'ai fait en supprimant le nom d'utilisateur et le mot de passe de la chaîne de connexion.

0
user2650536

Cette erreur s'est également produite si le nom de l'instance SQL Server n'est pas spécifié et que l'hôte SQL dispose de plusieurs instances SQL. Voici quelques exemples pour clarifier:

La chaîne de connexion ci-dessous entraîne l'exception "Le fournisseur sous-jacent a échoué lors de l'ouverture" sans exception interne dans une application .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 chaîne de connexion suivante s'exécute comme prévu dans une application .net WebForms où l'environnement SQL comporte plusieurs instances. Rare, je le sais, mais j'ai plusieurs instances SQL différentes sur ma boîte de développement pour accueillir différents projets:

 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
Sam Ellis

Pour moi, c'était une simple erreur:

J'ai utilisé Amazon EC2 et j'ai utilisé mon adresse IP élastique dans la chaîne de connexion, mais lorsque j'ai changé d'adresse IP, j'ai oublié de mettre à jour ma chaîne de connexion.

0
Erez Robinson

Dans IIS, définissez le Identité du pool d'applications en tant qu'utilisateur de compte de service ou compte d'administrateur ou compte ant qui est autorisé à effectuer l'opération sur cette base de données.

0
Jaydeep Shil

J'ai eu ce problème parce que la connexion au pool d'applications sous laquelle cette application était en cours avait changé.

Dans IIS:

  • Trouvez le pool d'applications en cliquant sur votre site et en allant dans les paramètres de base.

  • Accédez aux pools d'applications.

  • Cliquez sur le pool d'applications de votre site.

  • Cliquez sur Paramètres avancés.

  • Dans Identité, entrez le nom d'utilisateur et le mot de passe du compte.

  • Redémarrez votre site et réessayez.

0
live-love

J'ai eu un problème similaire: lors de mes exécutions de cas de test, j'ai toujours eu cette erreur. J'ai découvert que mon "service de transaction distribuée" n'avait pas été démarré (exécutez: services.msc -> démarrer le "service de transaction distribuée" (il est préférable de le configurer pour qu'il démarre automatiquement)). Après ça, ça a marché comme un charme ...

0
iber

AUCUNE des réponses n'a fonctionné pour moi

Je pense que certains d'entre nous font tous des bêtises, il y a 100 façons d'échouer ...

Mon problème était nouveau projet, j'ai configuré toute la configuration dans un autre projet, mais l'appelant était un projet Web Api dans lequel je devais copier la même chaîne de connexion dans le projet Web api.

Je pense que c'est fou étant donné que je ne découvrais même pas dbcontext ou quoi que ce soit de l'API Web.

Sinon, la bibliothèque de classe essayait de rechercher une base de données nommée

TokenApi.Core.CalContext   

dont mon projet s'appelle TokenApi.Core et le CalContext est le nom de la chaîne de connexion et le nom du fichier

0
Tom Stickel

Une erreur courante que j'ai commise parce que je déplaçais une application d'un ordinateur à un autre et que rien de ce qui précède ne fonctionnait était que j'avais oublié de copier la chaîne de connexion à la fois dans App.Config et Web.Config!

0
rikket

Dans mon cas, il y avait une différence entre le nom de la chaîne de connexion que j'étais en train d'enregistrer dans le constructeur du contexte et le nom dans mon web.config. Erreur simple causée par copier/coller: D

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

J'ai eu le même problème, mais ce qui a fonctionné pour moi a été de le supprimer de la chaîne de connexion:

persist security info=True

0
FV01

J'ai eu cette erreur se produire soudainement sur un de nos sites. Dans mon cas, il s'est avéré que le mot de passe de l'utilisateur SQL avait expiré! Décocher la case d'expiration du mot de passe dans SQL Server Management Studio a fait le tour!

0
Connell

J'ai seulement inclus le mot de passe dans ma chaîne de connexion web.config, cela a fonctionné pour moi.

<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" />
0
Kedar Nayak

Bonjour, si vous utilisez la classe de contexte, vous pouvez utiliser le code suivant:

 using (ClassContext context = new ClassContext()){
       ((IObjectContextAdapter)context).ObjectContext.Connection.Open();

        //SOMETHING TO DO......

       ((IObjectContextAdapter)context).ObjectContext.Connection.Close(); 
 }
0
Abel Valdez

dans mon cas, l'adresse du serveur a été changée par l'administrateur du serveur, donc j'ai dû changer la chaîne de connexion en nouvelle adresse du serveur

0
Ali Sadri

J'ai résolu de cette façon.

Étape 1: Ouvrez Internet Information Service Manager

Étape 2: Cliquez sur Pools d'applications dans l'arborescence de navigation de gauche.

Étape 3: Sélectionnez votre pool de versions. Dans mon cas, j'utilise ASP .Net v4.0. Si vous n'avez pas cette version, sélectionnez DefaultAppPool.

Étape 4: Faites un clic droit sur l’étape 3 et sélectionnez les paramètres avancés.

Étape 5: Sélectionnez Identité dans la fenêtre de propriétés et cliquez sur le bouton pour modifier la valeur.

Étape 6: Sélectionnez Système local dans la liste déroulante Comptes intégrés et cliquez sur OK. C'est ça. Maintenant, lancez votre application. Tout fonctionne bien.

Solution Codeproject: le-sous-sous-fournisseur-en-échec lors de l'ouverture

0
Abdur Rahim

Ajouter cette sécurité intégrée = True;

et ça devrait marcher .. J'ajoute ça à ma config et ça commence à marcher.

0
vijay sahu

j'ai la même erreur que j'ai trouvée c'est quand je change ma chaîne de connexion à la nouvelle source de données i oublier de changer le nom d'utilisateur et mot de passe pour la nouvelle base de données

0
Hamza Yahia