私はdatabase
とentityClient
への接続に.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="Data Source=.\SQL2008;AttachDbFilename=|DataDirectory|\NData.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True"" 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="Data Source=.\SQL2008;Initial Catalog=NData;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
私はいつもエラーになるから:
基になるプロバイダがOpenに失敗しました
私はこのエラーがあり、いくつかの解決策を見つけました:
接続文字列を見ると、それは有効に見えます。私は このブログ記事 を見つけました、ここでの問題は彼らが Integrated Security を使っていたことです。 IISを実行している場合は、IISユーザーがデータベースにアクセスする必要があります。
Entity FrameworkをTransactions と共に使用している場合、Entity Frameworkは各データベース呼び出しとの接続を自動的に開閉します。そのため、トランザクションを使用しているときは、トランザクションを複数の接続に分散させようとしています。これは MSDTC に昇格します。
私のコードを次のように変更して修正しました。
using (DatabaseEntities context = new DatabaseEntities())
{
context.Connection.Open();
// the rest
}
context.Connection.Open()
は私の問題を解決する手助けをしなかったので、DTCの設定で "Allow Remote Clients"を有効にしてもエラーは発生しませんでした。
Windows 7では、dcomcnfgを実行してDTC設定を開くことができます。コンポーネントサービス - >コンピュータ - >マイコンピュータ - >分散トランザクションコーディネータ - >ローカルDTCへの右クリック - >セキュリティ。
エラーが発生する内部的な原因が何であるかを確認するには、innerExceptionを参照してください。
私の場合、元のエラーは次のとおりです。
物理ファイル "D:\ Projects2\xCU\xCU\App_Data\xCUData_log.ldf"を開けません。オペレーティングシステムエラー5: "5(アクセスが拒否されました)"。ファイルD:\ Projects2\xCU\xCU\App_Data\xCUData.mdfの自動名前付きデータベースを接続しようとして失敗しました。同じ名前のデータベースが存在するか、指定されたファイルを開くことができないか、UNC共有上にあります。
これは、ファイルのプロパティを使用して関連するmdf
およびldf
ファイルにアクセスするための現在のユーザーに完全な許可を与えることによって解決されました。
私は問題が私がこれらの変種の一つで接続文字列内のサーバパスを持っているということであることがわかりました:
SERVER\SQLEXPRESS
SERVER
本当に必要なとき:
.\SQLEXPRESS
何らかの理由で、SQLのインスタンスを見つけるのが困難なときはいつでもエラーになりました。
これはよくある問題です。私もこの問題に直面しています。 Windows認証で設定された開発マシンでは、それは完全に機能します。
<add name="ShoppingCartAdminEntities" connectionString="metadata=res://*/ShoppingCartAPIModel.csdl|res://*/ShoppingCartAPIModel.ssdl|res://*/ShoppingCartAPIModel.msl;provider=System.Data.SqlClient;provider connection string="data source=.\SQlExpress;initial catalog=ShoppingCartAdmin;Integrated Security=True;multipleactiveresultsets=True;application name=EntityFramework"" 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="data source=MACHINE_Name\SQlExpress;initial catalog=ShoppingCartAdmin;persist security info=True;user id=sa;password=notmyrealpassword;multipleactiveresultsets=True;application name=EntityFramework"" providerName="System.Data.EntityClient" />
他のよくある間違いは次のとおりです。
この例外を受け取ったら、必ず詳細を展開して 内部例外 detailsを見てください。 なぜ についての詳細が表示されるためです。/ログインに失敗しました。私の場合、接続文字列に私のデータベースにアクセスできないユーザーが含まれていました。
統合セキュリティ(ログインしているWindowsユーザーのコンテキスト)または個々のSQLアカウントのどちらを使用する場合でも、この問題を防ぐためにアクセスしようとしているデータベースに対して、ユーザーが 'Security'の下で適切なアクセス権を持っていることを確認してください。
Windows Server 2003 の SQL Server Express Edition でも同様の問題がありました。データベースセキュリティのユーザーとしてネットワークサービスを追加しただけです。
これは、データベースを復元したときに、別のスキーマを持つユーザーが既に存在していて、正しい権限を割り当てられない場合にも発生する可能性があります。
この実行を修正するには
USE your_database
EXEC sp_change_users_login 'Auto_Fix', 'user', NULL, 'cf'
GO
EXEC sp_change_users_login 'update_one', 'user', 'user'
GO
SQL Server Expressサービスは自動的に起動するように設定されていません。
1)コントロールパネルに移動します2)管理ツール3)サービス4)SQL Server Expressをクリックして自動的に起動するように設定します5)右クリックしてサービスを開始します
それが役立つことを願っています。
提供されている接続ストリング内の各エレメント値が正しいことを確認してください。私の場合は、接続文字列で指定されたカタログの名前(データベース名)が正しくないため、同じエラーが発生していました。
私はここに同様の問題を投稿し、Amazon RDSでホストされているSQL 2012 dbを使って作業しました。問題は接続文字列にあります - 私はそこに "アプリケーション名"と "App"プロパティを持っていました。それらを削除したら、それはうまくいった。
私は IIS をリセットすることでこれを取り除きましたが、それでも接続文字列でIntegrated Authentication
を使います。
ASP.NET Webアプリケーションでこのエラーが発生した場合は、他にも次の点を確認してください。
SQL Server 用(およびポート1433用)の新しい Windowsファイアウォール ルールの定義サーバマシン上の)はこのエラーを解決します(あなたのサーバ名、ユーザログイン名またはパスワードがあなたの接続文字列で間違っていない場合...)。
接続状態による例外についても同様の問題があり、ドメインサービスクラス変数が(誤って)静的としてマークされていることに気付きました。
サービスライブラリがメモリにロードされると、新しい呼び出しはそれぞれ同じ静的変数値(ドメインサービスインスタンス)を使用することになり、接続状態を介して競合が発生します。
また、各クライアント呼び出しによって新しいスレッドが生成されたため、同じドメインサービスインスタンスにアクセスする複数のスレッドが列車の大破に相当するとも考えています。
以下のように、内部の例外で同様のエラーが発生しました。
操作はトランザクションの状態に対して無効です。
DTCのセキュリティ設定を有効にすることで解決できました。
[セキュリティ]タブの下にある[DTCのプロパティ]に移動し、以下を確認します。
私は数日前に "Integrated Security = True;"を使って同じ問題を抱えていました。接続文字列では、 "localsystem"の下でアプリケーションプールIDを実行する必要があります。もちろんこれはお勧めできませんが、テストには役立ちます。
これは、IIS 7のIDを変更する方法です。 http://www.iis.net/learn/manage/configuring-security/application-pool-identities
この例外を回避するために、データベースファイル(.mdf/.ldf)をApp_Dataフォルダーにコピーしました。
私はこの問題をウェブ上で探していました。接続文字列の名前が間違っています。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" />
私も同じ問題に直面していました。これで、接続文字列からユーザー名とパスワードを削除してやりました。
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="Data Source=localhost;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True"" 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="Data Source=localhost\SQLSERVER2014;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient"
私にとっては、それは単なる過ちでした。
私は Amazon EC2 を使用し、接続文字列にElastic IPアドレスを使用しましたが、IPアドレスを変更したときに接続文字列を更新するのを忘れました。
IISで、サービスアカウントユーザーとしてApp Pool Identityを設定するか、そのデータベースで操作を実行する権限を持つ管理者アカウントまたはantアカウント。
このアプリを実行していたアプリケーションプールのログインが変更されたため、この問題が発生しました。
IISの場合:
サイトをクリックして[基本設定]に移動し、アプリケーションプールを見つけます。
アプリケーションプールに移動します。
あなたのサイトのアプリケーションプールをクリックしてください。
詳細設定をクリックします。
[ID]に、アカウントのログイン名とパスワードを入力します。
サイトを再起動してもう一度やり直してください。
私は同様の問題を抱えていました:私のテストケースの実行で、私はいつもこのエラーを受けました。私は、私の "Distributed Transaction Service"が開始されていないことを知りました(services.msc - > start "Distributed Transaction Service"を実行します(自動開始に設定するのが最善です))。私がそれをした後、それは魅力のように働きました...
答えはどれも私には役に立ちませんでした
私たちの何人かは愚かなミスを犯していると思います、失敗する100の方法があります...
私の問題は新しいプロジェクトです、私は別のプロジェクトですべての設定をセットアップしました、しかし、呼び出し側は同じ接続をコピーしなければならなかったWeb ApiプロジェクトでしたWeb APIプロジェクトの文字列。
私はdbcontextやWeb APIから何かを新しくしていなかったことを考えるとこれは頭がおかしいと思います。
そうでなければ、クラスライブラリは以下の名前のデータベースを探していました。
TokenApi.Core.CalContext
私のプロジェクトはTokenApi.Core
という名前で、CalContext
は接続文字列の名前とファイル名です。
私がしたことがよくあった間違いは、以前のPCから別のPCにアプリケーションを移動していて、上記のいずれもうまくいかなかったため、接続文字列をApp.ConfigとWeb.Configの両方にコピーするのを忘れたことです。
私の場合は、コンテキストのコンストラクタに登録していた接続文字列の名前とweb.configの名前の間に不一致がありました。コピー&ペーストによる簡単な間違い:D
public DataContext()
: base(nameOrConnectionString: "ConnStringName")
{
Database.SetInitializer<DataContext>(null);
}
私は同じ問題を抱えていたが、私のために働いたのは接続文字列からこれを削除することでした:
persist security info=True
私たちのサイトの1つで突然このエラーが突然起きたのです。私の場合は、SQLユーザーのパスワードが期限切れになっていることがわかりました。 SQL Server Management Studio のパスワードの有効期限ボックスのチェックを外すと、うまくいきました。
私は自分の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="data source=KEDAR-PC;initial catalog=Test2016;user id=sa;password=mypc123;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
こんにちはあなたがコンテキストクラスを使用している場合は、次のコードを使用することができます:
using (ClassContext context = new ClassContext()){
((IObjectContextAdapter)context).ObjectContext.Connection.Open();
//SOMETHING TO DO......
((IObjectContextAdapter)context).ObjectContext.Connection.Close();
}
私の場合、サーバーアドレスはサーバー管理者によって変更されているので、接続文字列を新しいサーバーアドレスに変更する必要がありました。
私はこのようにして解決しました。
ステップ1:インターネットインフォメーションサービスマネージャを開く
ステップ2:左側のナビゲーションツリーで[アプリケーションプール]をクリックします。
ステップ3:あなたのバージョンプールを選択してください。私の場合は、ASP .Net v4.0を使用しています。このバージョンがない場合は、DefaultAppPoolを選択してください。
ステップ4:ステップ3を右クリックして、詳細設定を選択します。
手順5:プロパティウィンドウで[ID]を選択し、ボタンをクリックして値を変更します。
ステップ6:ビルトインアカウントのコンボボックスでローカルシステムを選択し、OKをクリックします。それでおしまい。今すぐあなたのアプリケーションを実行します。すべてうまくいきます。
この統合セキュリティを追加= True。
これでうまくいくはずです。これを設定に追加すると動作します。
私は自分の接続文字列を新しいデータソースに変更するときに私はそれが私が新しいデータベースのユーザー名とパスワードを変更することを忘れて同じエラーを発見しました