MSSQLエラー '基になるプロバイダーが開くときに失敗しました'


220

私が使っていた.mdfに接続するためdatabaseentityClient。次に、接続文字列を変更して、.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に失敗しました


2
IISで実行しようとすると、同じ問題が発生します。VS Serverで実行してもエラーは発生しません。
Zote、

11
私は同じ問題を抱えておりIntegrated Security、接続文字列から削除し、ユーザーを作成し、それらにsysadmin権限があることを確認して、そのユーザーを接続文字列に追加しました。
fulvio

DBはどこにありますか。IISでホストされているアプリケーション上にある場合は、DBをApp_Dataフォルダーに配置し、Entityframeworkモデルによって生成された接続文字列を編集してそこで探します。stackoverflow.com/questions/9809442/...
otzapエラン

私はこの問題を抱えていましたが、接続文字列にパスワードを挿入することで解決しました。
satyrFrost 2012

IISで実行しているときに、統合セキュリティを削除するだけでうまく
Jon

回答:


215

このエラーが発生し、いくつかの解決策が見つかりました:

接続文字列を見ると、有効に見えます。私はこのブログ投稿を見つけました。ここでの問題は、彼らが統合セキュリティを使用していたことです。IISで実行している場合、IISユーザーはデータベースにアクセスする必要があります。

あなたが使用している場合、Entity Frameworkのを 取引して、Entity Frameworkのは自動的に開き、各データベースコールとの接続を閉じます。したがって、トランザクションを使用する場合、トランザクションを複数の接続に分散させようとしています。これはMSDTCに昇格します。

詳細については、このリファレンスを参照してください。

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

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

7
Linqを使用して(EF4を使用して)テーブルにアクセスする場合、これはどのように行われますか?
Brett Rigby、2010

2
@ブレット・リグビー:stackoverflow.com/questions/794707/…は、Linq / EFでこれを行う方法をカバーしています。
スコットスタッフォード

63
EF / DBContextを使用している場合、正しい呼び出しはcontext.Database.Connection.Open();です。
live-love

2
私が最初に見つけたとき、コードをざっと読むのではなく、あなたの投稿を読みたいと思います。私の問題(この回答で指摘したとおり)は、CRM 2011プラグインコンテキストのAppPoolユーザーが、設定したデータベースへの書き込みアクセス権を持っていないことでした。ユーザーをSQLに追加したとき、プラグインは魅力のように機能しました。
Mike_Matthews_II 2013年

2
私が作成しているコンテキストにちなんで名付けられた私の設定に接続文字列がありませんでした.......それも確認してください。
Bill Blankenship 2013

38

context.Connection.Open() 私の問題の解決に役立たなかったので、DTC構成で「リモートクライアントを許可する」を有効にしてみましたが、エラーは発生しませんでした。

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


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

7
実際には、ローカルDTCへの右クリック->プロパティ->セキュリティ
Otto Abnormalverbraucher 2017年

27

あなたは、表示されるはずのInnerExceptionは、エラーの投げの内側の原因が何であるかを見るために。

私の場合、元のエラーは:

物理ファイル「D:\ Projects2 \ xCU \ xCU \ App_Data \ xCUData_log.ldf」を開くことができません。オペレーティングシステムエラー5: "5(Access is denied。)"。ファイルD:\ Projects2 \ xCU \ xCU \ App_Data \ xCUData.mdfの自動命名データベースのアタッチに失敗しました。同じ名前のデータベースが存在するか、指定されたファイルを開くことができないか、UNC共有にあります。

これは、現在のユーザーに、ファイルのプロパティを使用して関連ファイルmdfldfファイルにアクセスするための完全な権限を与えることで解決しました。


24

問題は、次のいずれかのバリアントの接続文字列内にサーバーパスがあったことです。

SERVER\SQLEXPRESS
SERVER

本当に私が持っているべき時:

.\SQLEXPRESS

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


6
これは、SQL Serverの接続方法として有効にされている名前付きパイプがないためと考えられます。
ポール

1
@Paul、ありがとう。SQLの新規インストールであるため、名前付きパイプを無効にしてロールアウトした可能性があります。ヘッドアップをありがとう。+1
dooburt

1
このおかげで、名前付きパイプが無効になっているため、この問題が発生しました。
Patrick Allwood 2014

15

これは一般的な問題のみです。私もこの問題に直面しています。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. ユーザー名とパスワードが間違っている可能性があります。

私にとっての問題は、EFデータモデルを作成したときに、VSのデータ接続からのログインデータを使用する接続文字列を作成したことです。接続文字列にユーザーまたはパスワードが含まれていなかったため、このデプロイメントの問題を修正するために削除Integrated Security=Trueして置き換えてuser id=sa;password=notmyrealpasswordください。
LostNomad311

10

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

統合セキュリティ(ログインしているWindowsユーザーのコンテキスト)を使用するか、個別のSQLアカウントを使用するかに関係なく、この問題を防ぐために、アクセスしようとしているデータベースの[セキュリティ]に適切なアクセス権があることを確認してください。


元の投稿と同じ問題があり、ホスト名を確認し、内部例外で正しいユーザー名を使用していることを確認しました。SSMSユーザーセキュリティは適切に見えます。SQLServerアカウントは適切に設定されており、データベースへのパブリックアクセス権を持っています。しかし、ログインに失敗しました。
ハンマー付きコード

inner exception状態は何が問題ですか?それが本当の根本的な問題を理解するために必要な隠された追加の詳細を提供するという私の答えでした。inner exceptionあなたは正しいログオンを持っていることを確認していないだろう-それは例外ではない明確です。
atconway 2014

Login failed for user 'user'.
ハンマー付きコード、2014

またNT AUTHORITY\NETWORK SERVICE、SQL Serverのユーザーリストに追加してみました。私はまだ同じ拒否されたログイン失敗を得ました。
ハンマー付きコード、2014

解決した。に変更data sourceする必要がありましたhostname\SQLEXPRESS。私がしようとしたhostname.\SQLEXPRESS以前に。その後、統合セキュリティに接続できました。不思議なことに、これはdooburtの答えの逆です。不思議なことに、SQL Serverのユーザー名はVisual Studioから接続できませんでした。
ハンマー付きコード、2014


4

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

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

お役に立てば幸いです。


3

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

この実行を修正するには:

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

絶対にこれが問題でした。バックアップから復元しました。テイク表情分析の詳細については。
nesimtunc 2013


2

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


1

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

私の推測では、サービスライブラリがメモリに読み込まれると、新しい呼び出しごとに同じ静的変数値(ドメインサービスインスタンス)が使用され、接続状態を介して競合が発生します。

また、各クライアント呼び出しの結果、新しいスレッドが生成されたため、複数のスレッドが同じドメインサービスインスタンスにアクセスすると、列車の事故に相当したと思います。


これも私のためにやったことです。静的とマークすると、処理しようとしているインスタンスにさまざまな問題が発生するだけです。
Michael

1

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

persist security info=True


1

次のような内部例外を除いて、同様のエラーが発生しました。

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

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

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

  • ネットワークDTCアクセス
  • RemoteClientsを許可する
  • トランザクションマネージャ通信
  • インバウンドを許可
  • アウトバウンドを許可

1

ASP.NET Webアプリケーションでこのエラーが発生した場合は、言及されている他の事項に加えて、以下を確認してください。

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



0

あるPCから別のPCにアプリケーションを移動していて、上記のいずれも機能しなかったために私が犯した一般的な間違いは、接続文字列をApp.ConfigとWeb.Configの両方にコピーするのを忘れたことです!


0

私は同様の問題を抱えていました:テストケースの実行では常にこのエラーが発生しました。「分散トランザクションサービス」が開始されていないことがわかりました(実行:services.msc->「分散トランザクションサービス」を開始します(自動で開始するように設定するのが最適です))。私がそれをした後、それは魅力のように働きました...


0

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


0

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


0

私にとってはそれは単純な間違いでした:

私はAmazon EC2を使用し、接続文字列でエラスティックIPアドレスを使用しましたが、IPアドレスを変更すると、接続文字列を更新するのを忘れました。


0

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



0

IIS設定アプリケーションプールID、そのデータベース上で操作を実行する権限を持っているとして、サービスアカウントのユーザーまたは管理者アカウントやアリのアカウントを。


0

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

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


0

同じエラーが発生しましたが、connectionStringを新しいデータソースに変更すると、新しいデータベースのユーザー名とパスワードを変更するのを忘れます


0

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

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


0

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

IISの場合:

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

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

  • サイトのアプリケーションプールをクリックします。

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

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

  • サイトを再起動して、もう一度お試しください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.