現在調査中なので、明確ではないのだが、
- Windows 7
- SQL Server 2008 R2 ( Express を含む )
- ASP.NET MVC のログイン
には、落とし穴がある。。。
ASP.NET MVC のサンプルアプリケーションを作ると、自動で「ログイン」の機能が追加される。これは、ログインアカウントを作成する時に、App_data 内にファイル形式のデータベースを作って、ログイン機能を用意してくれる便利な機能なのです(ローカルデータベースに、ユーザー管理を任せてしまうのは、どうか?という話は別として、サンプル/小規模開発ならばこれでOK)。
しかし、これが、Windows 7 + SQL Server 2008 R2 の場合には、以下のようなエラーが出る。
ユーザー インスタンスのプロセスを起動中のエラーにより、SQL Server のユーザー インスタンスを生成できませんでした。接続は閉じられます。
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。SQLExpress データベースの自動作成エラー:
接続文字列は、アプリケーションの App_Data ディレクトリ内にあるデータベースの場所を使用する、ローカルの SQL Server Express インスタンスを指定しています。プロバイダーはデータベースが存在しないと判断したため、アプリケーション サービス データベースを自動的に作成しようとしました。アプリケーション サービス データベースの存在を正しく確認し、このデータベースを自動的に作成するには、次の構成が必要です:
これが何を示すかというと、
- 最初のログインをしたときに、App_Data配下にデータベースのファイルがなかったので、作ろうとしたんだが、作れなくてエラーになった。
ということです。
このあたりの原因としては、
- ASP.NETを起動しているアカウント(デフォルトでは、Network service)が、App_Data へのアクセス権がない。
が考えられるのだが、
アプリケーションが Windows 7 または Windows Server 2008 R2 で実行されている場合、プロバイダー データベースの自動作成を有効にするには、特別な構成手順が必要です。追加情報については、http://go.microsoft.com/fwlink/?LinkId=160102 を参照してください。アプリケーションの App_Data ディレクトリがまだ存在しない場合は、Web サーバー アカウントに、アプリケーション ディレクトリへの読み書きアクセスが与えられていなければなりません。これは、アプリケーションの App_Data ディレクトリが存在しない場合、Web サーバー アカウントがこのディレクトリを自動的に作成するために必要です。
というのが、かなり怪しい…感じでして。どうも、「特別な構成手順」なるものを見る限り、非常に特別らしい(苦笑)。
素直に、ログインのアクセスを、ファイルじゃない通常のデータベース上に作成すればいいのだが、ASP.NET MVC 本の手前、初心者向きにはどうするべきか、と思案中なのです。
しかも、上記の「特別な手順」をやったにも関わらず(多分、何かが抜けているんだろうけど)、それでもエラーがでる orz。
う~む、どうするべきか?
—
追記 2010/07/05
http://www.moonmile.net/blog/archives/984 に顛末を書きました。解決できます。
SQL Server Expressのユーザーインスタンスの起動に失敗しているのではないでしょうか。
・SQL Server 2008 R2のExpressのサービスが起動していること。
・Expressが既定のポートになっているか。
外しているかもしれませんが。
コメントありがとうございます。
App_Data内にローカルファイルのインスタンスを作成できない、という現象です。
どうやら、Visual Studio 2010 を入れた後に、一度 SQL Server 2008 Express をアンインストールした後に、再び SQL Server 2010 R2 をインストールしたのが、問題のようです。
以前、2005 の頃に同じ現象で痛い目にあっていたのですが、つい、うっかりと(泣
Visual Studio 2010 の「修復」では復旧できないので、マメに SQL Server 関連をアンインストール、Visual Studio 2010 関連をアンインストールした後に、再度、Visual Studio 2010 をインストールという手順を、現在試している途中です。
復旧したら、追記します。