web-dev-qa-db-ja.com

MSSQLエラー「基になるプロバイダがオープンに失敗しました」

私はdatabaseentityClientへの接続に.mdfを使っていました。 .mdfファイルがなくなるように接続文字列を変更したいと思います。

次のconnectionStringは正しいですか?

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

私はいつもエラーになるから:

基になるプロバイダがOpenに失敗しました

204
senzacionale

私はこのエラーがあり、いくつかの解決策を見つけました:

接続文字列を見ると、それは有効に見えます。私は このブログ記事 を見つけました、ここでの問題は彼らが Integrated Security を使っていたことです。 IISを実行している場合は、IISユーザーがデータベースにアクセスする必要があります。

Entity FrameworkをTransactions と共に使用している場合、Entity Frameworkは各データベース呼び出しとの接続を自動的に開閉します。そのため、トランザクションを使用しているときは、トランザクションを複数の接続に分散させようとしています。これは MSDTC に昇格します。

詳細については、この参照を参照してください。

私のコードを次のように変更して修正しました。

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

context.Connection.Open()は私の問題を解決する手助けをしなかったので、DTCの設定で "Allow Remote Clients"を有効にしてもエラーは発生しませんでした。

Windows 7では、dcomcnfgを実行してDTC設定を開くことができます。コンポーネントサービス - >コンピュータ - >マイコンピュータ - >分散トランザクションコーディネータ - >ローカルDTCへの右クリック - >セキュリティ。

38
kerem

エラーが発生する内部的な原因が何であるかを確認するには、innerExceptionを参照してください。

私の場合、元のエラーは次のとおりです。

物理ファイル "D:\ Projects2\xCU\xCU\App_Data\xCUData_log.ldf"を開けません。オペレーティングシステムエラー5: "5(アクセスが拒否されました)"。ファイルD:\ Projects2\xCU\xCU\App_Data\xCUData.mdfの自動名前付きデータベースを接続しようとして失敗しました。同じ名前のデータベースが存在するか、指定されたファイルを開くことができないか、UNC共有上にあります。

これは、ファイルのプロパティを使用して関連するmdfおよびldfファイルにアクセスするための現在のユーザーに完全な許可を与えることによって解決されました。

26
Majid

私は問題が私がこれらの変種の一つで接続文字列内のサーバパスを持っているということであることがわかりました:

SERVER\SQLEXPRESS
SERVER

本当に必要なとき:

.\SQLEXPRESS

何らかの理由で、SQLのインスタンスを見つけるのが困難なときはいつでもエラーになりました。

23
dooburt

これはよくある問題です。私もこの問題に直面しています。 Windows認証で設定された開発マシンでは、それは完全に機能します。

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

同じ設定でIISにホストされたら、このエラーが発生しました。

基になるプロバイダがOpenに失敗しました

設定ファイルのconnectionStringを変更することで解決しました:

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

他のよくある間違いは次のとおりです。

  1. データベースサービスが停止する可能性があります
  2. Windows認証でローカルデータベースを指し、IISでホストされているデータソース属性
  3. ユーザー名とパスワードが間違っている可能性があります。
15
JaiSankarN

この例外を受け取ったら、必ず詳細を展開して 内部例外 detailsを見てください。 なぜ についての詳細が表示されるためです。/ログインに失敗しました。私の場合、接続文字列に私のデータベースにアクセスできないユーザーが含まれていました。

統合セキュリティ(ログインしているWindowsユーザーのコンテキスト)または個々のSQLアカウントのどちらを使用する場合でも、この問題を防ぐためにアクセスしようとしているデータベースに対して、ユーザーが 'Security'の下で適切なアクセス権を持っていることを確認してください。

10
atconway

Windows Server 2003SQL Server Express Edition でも同様の問題がありました。データベースセキュリティのユーザーとしてネットワークサービスを追加しただけです。

6
Par6

これは、データベースを復元したときに、別のスキーマを持つユーザーが既に存在していて、正しい権限を割り当てられない場合にも発生する可能性があります。

この実行を修正するには

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

SQL Server Expressサービスは自動的に起動するように設定されていません。

1)コントロールパネルに移動します2)管理ツール3)サービス4)SQL Server Expressをクリックして自動的に起動するように設定します5)右クリックしてサービスを開始します

それが役立つことを願っています。

3
user2033790

提供されている接続ストリング内の各エレメント値が正しいことを確認してください。私の場合は、接続文字列で指定されたカタログの名前(データベース名)が正しくないため、同じエラーが発生していました。

2
Rajesh

私はここに同様の問題を投稿し、Amazon RDSでホストされているSQL 2012 dbを使って作業しました。問題は接続文字列にあります - 私はそこに "アプリケーション名" "App"プロパティを持っていました。それらを削除したら、それはうまくいった。

Entity Framework 5およびAmazon RDS - "基になるプロバイダがOpenに失敗しました。"

2
wloescher

私は IIS をリセットすることでこれを取り除きましたが、それでも接続文字列でIntegrated Authenticationを使います。

1

ASP.NET Webアプリケーションでこのエラーが発生した場合は、他にも次の点を確認してください。

  1. データベースユーザーセキュリティ権限(どのユーザーがデータベースへのアクセスを許可されているか)。
  2. IISでアプリケーションプールを確認し、データベースへのアクセスが許可されているのが正しいものであることを確認してください。
1
alexk

SQL Server 用(およびポート1433用)の新しい Windowsファイアウォール ルールの定義サーバマシン上の)はこのエラーを解決します(あなたのサーバ名、ユーザログイン名またはパスワードがあなたの接続文字列で間違っていない場合...)。

1
Gökhan Yılmaz

接続状態による例外についても同様の問題があり、ドメインサービスクラス変数が(誤って)静的としてマークされていることに気付きました。

サービスライブラリがメモリにロードされると、新しい呼び出しはそれぞれ同じ静的変数値(ドメインサービスインスタンス)を使用することになり、接続状態を介して競合が発生します。

また、各クライアント呼び出しによって新しいスレッドが生成されたため、同じドメインサービスインスタンスにアクセスする複数のスレッドが列車の大破に相当するとも考えています。

1
James Wilkins

以下のように、内部の例外で同様のエラーが発生しました。

操作はトランザクションの状態に対して無効です。

DTCのセキュリティ設定を有効にすることで解決できました。

[セキュリティ]タブの下にある[DTCのプロパティ]に移動し、以下を確認します。

  • ネットワークDTCアクセス
  • RemoteClientsを許可する
  • トランザクションマネージャ通信
  • 受信を許可
  • 送信を許可
1
sparhea

私は数日前に "Integrated Security = True;"を使って同じ問題を抱えていました。接続文字列では、 "localsystem"の下でアプリケーションプールIDを実行する必要があります。もちろんこれはお勧めできませんが、テストには役立ちます。

これは、IIS 7のIDを変更する方法です。 http://www.iis.net/learn/manage/configuring-security/application-pool-identities

0
Gabriel

この例外を回避するために、データベースファイル(.mdf/.ldf)をApp_Dataフォルダーにコピーしました。

0
mdc

私はこの問題をウェブ上で探していました。接続文字列の名前が間違っています。web.configで接続文字列を確認してください。私はname="AppTest"を持っていました、しかしそれはname="App"であるべきでした。

私のAppTestContext.csファイルには、次のものがありました。

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

間違った接続文字列:

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

正しい接続文字列:

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

私も同じ問題に直面していました。これで、接続文字列からユーザー名とパスワードを削除してやりました。

0
user2650536

SQL Serverインスタンス名が指定されておらず、SQLホストに複数のSQLインスタンスがインストールされている場合も、このエラーが発生します。これを明確にするためのいくつかの例を示します。

以下の接続文字列は、.NET WebFormsアプリケーションで内部例外を発生させることなく、「基になるプロバイダがOpenに失敗しました」という例外を発生させます。

 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"

次の接続文字列は、SQL環境に複数のインスタンスがある.net WebFormsアプリケーションでは予想どおりに実行されます。私が知っていることは稀ですが、私は自分の開発用ボックスにいくつかの異なるSQLインスタンスを持っていて、異なるプロジェクトに対応できます。

 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

私にとっては、それは単なる過ちでした。

私は Amazon EC2 を使用し、接続文字列にElastic IPアドレスを使用しましたが、IPアドレスを変更したときに接続文字列を更新するのを忘れました。

0
Erez Robinson

IISで、サービスアカウントユーザーとしてApp Pool Identityを設定するか、そのデータベースで操作を実行する権限を持つ管理者アカウントまたはantアカウント。

0
Jaydeep Shil

このアプリを実行していたアプリケーションプールのログインが変更されたため、この問題が発生しました。

IISの場合:

  • サイトをクリックして[基本設定]に移動し、アプリケーションプールを見つけます。

  • アプリケーションプールに移動します。

  • あなたのサイトのアプリケーションプールをクリックしてください。

  • 詳細設定をクリックします。

  • [ID]に、アカウントのログイン名とパスワードを入力します。

  • サイトを再起動してもう一度やり直してください。

0
live-love

私は同様の問題を抱えていました:私のテストケースの実行で、私はいつもこのエラーを受けました。私は、私の "Distributed Transaction Service"が開始されていないことを知りました(services.msc - > start "Distributed Transaction Service"を実行します(自動開始に設定するのが最善です))。私がそれをした後、それは魅力のように働きました...

0
iber

答えはどれも私には役に立ちませんでした

私たちの何人かは愚かなミスを犯していると思います、失敗する100の方法があります...

私の問題は新しいプロジェクトです、私は別のプロジェクトですべての設定をセットアップしました、しかし、呼び出し側は同じ接続をコピーしなければならなかったWeb ApiプロジェクトでしたWeb APIプロジェクトの文字列。

私はdbcontextやWeb APIから何かを新しくしていなかったことを考えるとこれは頭がおかしいと思います。

そうでなければ、クラスライブラリは以下の名前のデータベースを探していました。

TokenApi.Core.CalContext   

私のプロジェクトはTokenApi.Coreという名前で、CalContextは接続文字列の名前とファイル名です。

0
Tom Stickel

私がしたことがよくあった間違いは、以前のPCから別のPCにアプリケーションを移動していて、上記のいずれもうまくいかなかったため、接続文字列をApp.ConfigとWeb.Configの両方にコピーするのを忘れたことです。

0
rikket

私の場合は、コンテキストのコンストラクタに登録していた接続文字列の名前とweb.configの名前の間に不一致がありました。コピー&ペーストによる簡単な間違い:D

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

私は同じ問題を抱えていたが、私のために働いたのは接続文字列からこれを削除することでした:

persist security info=True

0
FV01

私たちのサイトの1つで突然このエラーが突然起きたのです。私の場合は、SQLユーザーのパスワードが期限切れになっていることがわかりました。 SQL Server Management Studio のパスワードの有効期限ボックスのチェックを外すと、うまくいきました。

0
Connell

私は自分のweb.config Connectionstringにパスワードを含めただけでした。

<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

こんにちはあなたがコンテキストクラスを使用している場合は、次のコードを使用することができます:

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

        //SOMETHING TO DO......

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

私の場合、サーバーアドレスはサーバー管理者によって変更されているので、接続文字列を新しいサーバーアドレスに変更する必要がありました。

0
Ali Sadri

私はこのようにして解決しました。

ステップ1:インターネットインフォメーションサービスマネージャを開く

ステップ2:左側のナビゲーションツリーで[アプリケーションプール]をクリックします。

ステップ3:あなたのバージョンプールを選択してください。私の場合は、ASP .Net v4.0を使用しています。このバージョンがない場合は、DefaultAppPoolを選択してください。

ステップ4:ステップ3を右クリックして、詳細設定を選択します。

手順5:プロパティウィンドウで[ID]を選択し、ボタンをクリックして値を変更します。

ステップ6:ビルトインアカウントのコンボボックスでローカルシステムを選択し、OKをクリックします。それでおしまい。今すぐあなたのアプリケーションを実行します。すべてうまくいきます。

コードプロジェクト解決策:基盤となるプロバイダがオープンに失敗しました

0
Abdur Rahim

この統合セキュリティを追加= True。

これでうまくいくはずです。これを設定に追加すると動作します。

0
vijay sahu

私は自分の接続文字列を新しいデータソースに変更するときに私はそれが私が新しいデータベースのユーザー名とパスワードを変更することを忘れて同じエラーを発見しました

0
Hamza Yahia