カテゴリー
Microsoft

【ASP.NET】【MVC5】【失敗】Web サーバをローカル IIS に指定した時のデータベースエラーに対処できなかった。。。

環境

  • Visual Studio 2015 で作成したプロジェクト
  • MVC5 のウェブアプリで
  • プロジェクト名: Sample1
  • データベース: SQL Server 2014 Express LocalDB を使用してマイグレーションで自動生成した。
  • データベース名: Sample1Context-20151016212614
  • データベースファイルパス: App_Data/Sample1Context-20151016212614.mdf

エラー1. データベースに接続できなくなった

エラー再現のために行った変更

  • プロジェクトのプロパティでサーバを [IIS Express] → [ローカルIIS] に変更した。
  • データベースは変更していない。
    • 設定、Web.config の connectionString は変更していない
    • データベースは SQL Server 2014 Express LocalDB のまま。

エラー内容

そうしたら、次のエラーが発生して、データベースアクセスのあるコントローラーのアクションにアクセスしたタイミングでアプリが落ちてしまいました><。

‘/Sample1’ アプリケーションでサーバー エラーが発生しました。

SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。 (provider: SQL Network Interfaces, error: 50 – Local Database Runtime エラーが発生しました。自動インスタンスを作成できません。エラーの詳細については、Windows アプリケーション イベント ログを参照してください。
)

コードなど修正

[デバッグ] > [デバッグ無しで開始] したところ、SQL Server 2014 Express に接続文字列を変更するかを尋ねるウインドウが出ました。

[はい] を選択し、無事にデータベースにつながり、先ほどのエラーが解消されました♪
SQL Server 2014 Express を使用するように接続文字列を変更

<connectionStrings>
  <add name="Sample1Context" connectionString="Data Source=(localdb)\MSSQLLocalDB; Initial Catalog=Sample1Context-20151016212614; Integrated Security=True; MultipleActiveResultSets=True; AttachDbFilename=|DataDirectory|Sample1Context-20151016212614.mdf" providerName="System.Data.SqlClient" />
</connectionStrings>

<connectionStrings>
  <add name="Sample1Context" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|Sample1Context-20151016212614.mdf;Initial Catalog=Sample1Context-20151016212614;Integrated Security=True;MultipleActiveResultSets=True;User Instance=True"
    providerName="System.Data.SqlClient" />
</connectionStrings>

修正のポイント

Web.config の connectionStrings

  • Data Source
    (localdb)\MSSQLLocalDB

    .\SQLEXPRESS
  • User Instance
    無し

    True

その他、データベースそのものに関して

  • SQL Server Management Studio (SSMS) にデータベースが移動するわけではない。
  • SSMS から管理できるようになるわけでもない。
  • データベースのファイルは変更前後で変わらない。
  • SQL Server 2014 Express を経由することで今までと同じデータベースに接続できるようにした、というイメージではないか?

エラー2. データベースにログインできない

再現手順

  1. プロジェクト編集後、デバッグなしで実行 (Ctrl + F5) する。
  2. データベースアクセスのあるコントローラーのアクションにアクセス。

さきほど、エラー1 が解消して、その後コードを編集して実行したところ、再びエラーとなった、という状況です><。

エラー内容

‘/Sample1’ アプリケーションでサーバー エラーが発生しました。

このログインで要求されたデータベース “Sample1Context-20151016212614” を開けません。ログインに失敗しました。
ユーザー ‘IIS APPPOOL\DefaultAppPool’ はログインできませんでした。

対応内容

IIS APPPOOL\DefaultAppPool ユーザーどころか、データベースのユーザーは作成しておりませんので、IIS APPPOOL\DefaultAppPool ユーザーを作成すればよさそうです。

  1. SSMS 起動し、次を指定してログイン
    • サーバーの種類: データベース エンジン
    • サーバー名: (localdb)\MSSQLLocalDB
    • 認証 Windows 認証 ← SQL Server 認証だと失敗した
  2. [オブジェクトエクスプローラー] で、[セキュリティ] > [ログイン] を右クリックして [新しいログイン]
  3. 次を入力
    • [全般] タブ
      SSMS でユーザーを作成。[全般] タブ

      • ログイン名: IIS APPPOOL\DefaultAppPool
      • Windows 認証にチェック ← デフォルトのまま
      • 規定のデータベース: master ← デフォルトのまま
    • [ユーザー マッピング] タブ
      SSMS でデータ作成。[ユーザー マッピング] タブ

      • [このログインにマップされたユーザー] の、Sample1Context-20151016212614 の [マップ] にチェック
      • [Sample1Context-20151016212614のデータベースロールメンバーシップ] の、[db_owner] にチェック。[public] にデフォルトでチェック入っていることを確認
  4. [OK]

上手くいきません><。。。

そもそも、ユーザーを作成してデータベースに権限をひも付けたけれども、プロジェクトの connectionStrings にはユーザー ID とパスワードを指定しないで接続するのが定石のように思えます。

などと思って試行錯誤していましたら、とあるタイミングでエラーが解消され、一方別の問題が発生ました。。。

  • Visual Studio 2015 を終了した状態でウェブアプリを動かしたらエラーとならなかった。
  • この時、SSMS を一旦終了し、また立ち上げて Sample1Context-20151016212614 に接続しようとしたらエラーとなった。このとき、サーバーへの接続に、[Windows 認証] を用いていた。もしやと思って、[SQL Server 認証] で新たに作成した IIS APPPOOL\DefaultAppPool ユーザーを指定してみたが、エラーのままだった。
    データベースにアクセス出来ないエラー発生

    TITLEMicrosoft SQL Server Management Studio

    データベース Sample1Context-20151016212614 にアクセスできません。 (ObjectExplorer)


    ボタン:

    OK

  • Visual Studio 2015 の SQL Server Object Exploer でもテーブル一覧やテーブル定義までは表示されるが、データの表示はエラーとなった。
    Visual Studio 2015 の SQL Server Object Exploer でもデータの表示はできなかった。
  • Visual Studio 2015 の [サーバー エクスプローラー] では、テーブル定義もデータの表示も可能だった。

そもそもこうすれば良さそう

  • ASP.NET MVC5 でローカル IIS を使用するならば、LocalDB を使用しないで SQL Server Express を使用する。

そのために、次の投稿が参考になりますわね。

おわりに

ASP.NET MVC5 プロジェクトでは、IIS Express からローカル IIS へと簡単に切り替えることができました♪

けれども、簡単に SQL Server Express LocalDB から SQL Server Express へと切り替えることはできないようですの><。

なんとか解決できましたけれども、Visual Studio 2015 を終了しなければプロジェクトの動きを確認できませんし、データベースへの接続もなぜだか限られてしまいますし、よいことがありませんでした><。

最初から SQL Server Express を指定してプロジェクトを始めるのが最も簡単そうですわね♪

以上です。

コメントを残す