ASP.NET MVC の プロバイダー データベースの自動作成の落とし穴
http://www.moonmile.net/blog/archives/980
の顛末について、書いておきます。
現象としては、
- Visual Studio 2010 で作った、ASP.NET MVC のプロジェクトで、ログインしようとするエラーが発生する。
です。
エラーメッセージは、
ユーザー インスタンスのプロセスを起動中のエラーにより、SQL Server のユーザー インスタンスを生成できませんでした。接続は閉じられます。
ですね。
環境は、
- Windows 7 Ultimate
- Visual Studio 2010 Professional
- SQL Server 2008 R2 Express Edition
ですが、バージョンはあまり関係ありません。「SQL Server 2008 Express Edition」のところしか関係ありません。
ちなみに、上記の環境で ASP.NET MVC アプリを作成して、ログインをすると「ログイン」できます。なので、普通にやっている分には問題ありません。
■現象
問題は、次の手順をやってしまったときです。
- Visual Studio 2010 をインストールする。
- SQL Server 2008 Express Edition が同時にインストールされる。
- SQL Server 2008 R2 を入れようとして、一旦、SQL Server 2008 Express Edition をアンインストールする。
- SQL Server 2008 R2 Express Edition をインストールする。
のように、SQL Server の Express Edition を「アンインストール」→「再びインストール」したときに発生します。
このログインできない現象は、ASP.NET MVC に限りません。
- ASP.NET のログインコントロールを使った場合
- ローカルデータベースファイルを ADO.NET でオープンしようとした場合
- サーバーエクスプローラーで、ローカルデータベースファイルを追加しようとした場合
でも発生します。
■対処
先に対処方法を書いておきます。
Windows Vista/7 の場合は
C:\Users\ユーザ名\AppData\Local\Microsoft\Microsoft SQL Server Data\SQLEXPRESS\ のフォルダを「削除」して下さい。
Windows XP の場合は、Documents and Settings の中です。
ここの中にある各ファイルが邪魔をしています。
■原因
主原因は、SQLEXPRESS\ の中にある、master.mdf などのシステムファイルが、インストール前後で不整合を起こしているためです。このため、ASP.NET のログインコントロールからアクセスしようとしたときに、前後の不整合のために、「インスタンスが生成できません」というエラーになります。
これが発生してしまうのは、SQL Server 2008 Express Edition(2005も同様)をアンインストールしたときに、該当するユーザー領域のデータ(SQLEXPRESS\配下のファイル等)を削除しないためです。
ユーザー領域なので、おそらく、別ユーザーでログインしたときはつながる、という見かけ上、不思議な現象になります。
■情報源
Google で「Microsoft SQL Server Data SQLEXPRESS AppData」で検索すると、いくつかの質問がヒットします。
App_Dataフォルダにデータベースを作成できません
http://social.msdn.microsoft.com/Forums/ja-JP/vwdexpressja/thread/13919e51-b9f9-4ab4-8ef7-92dce872851b
公式なところでは、
SQL Server Express ユーザー インスタンスへの接続 (ADO.NET)
http://msdn.microsoft.com/ja-jp/library/ms254504.aspx
管理者以外のユーザーのためのユーザー インスタンス
http://msdn.microsoft.com/ja-jp/library/ms143684.aspx
を読むと、上記のフォルダ「C:\Users\ユーザ名\AppData\Local\Microsoft\Microsoft SQL Server Data\SQLEXPRESS\」が関係していることが分かります。