トップ回答者
SQL Server2005に接続できない

質問
-
VS2005を利用して、Webアプリケーションの勉強をしているのですが、SQL Serverへの
接続が上手くいかずに困っています。
現状は、
OS:Windows XP sp2
環境:VS2005 (C#)
SQL Server 2005 Express Edition
SQL Server Management Studio
サンプルデータベース(pubs)
がインストールされている状態です。
SQL Server Management Studioからでは、データベースに接続できるのですが、
VS2005にて、
SqlConnection sqlcon = new SqlConnection("Server=localhost;database=pubs;user id=sa;password=p@ssw0rd;");
SqlCommand sqlcmd = new SqlCommand("SELECT * FROM authors", sqlcon);
sqlcon.Open();
SqlDataReader sqldr = sqlcmd.ExecuteReader();
while (sqldr.Read())
{
Console.WriteLine((string)sqldr["au_id"]);
}
sqldr.Close();
sqlcon.Close();を実行すると以下のエラーメッセージが表示されます。
サーバーへの接続を確立しているときにエラーが発生しました。SQL Server 2005 に
接続しているときときにこのエラーが発生した場合は、SQL Server の既定の設定が
リモート接続を許可しないようになっていることがエラーの原因である可能性がありま
す。 (provider: 名前付きパイプ プロバイダ, error: 40 - SQL Server への接続を開け
ませんでした)
このような場合は、どのようにすればいいのでしょうか。
ご教授お願いします。
回答
-
諸農です。
>SqlConnection("Server=localhost;database=pubs;user id=sa;password=p@ssw0rd;");
SQL Server 2005 Express Editionが名前付きインスタンスでインストールされていませんか?
もしくはこちらのTips等が参考になるかも。
SQL Server 2005 Tips and Tips
-
Kazutaka Moronoさま、どっとねっとふぁんさまご丁寧にありがとうございます。
Kazutaka Moronoさまの言われたSQL Server 2005 Express Editionを名前付きインスタスで
インストールしたかどうか、覚えていなかったのでVS2005および、SQL Server2005を全て削除した後、
VS2005をインストールしました。この時点で、SQL Server2005 Expressが自動的にインストールされている
デフォルトのままです。
そこで、VS2005のサーバーエキスプローラのデータ接続を利用して、データベース名をDatabase、テーブル名をTblchekと
して、作成しました。データー等も入力しました。
また、どっとねっとふぁんさまの言われたsaの有効ですが、これはしていなかったので、Windows認証にしました。
次のように接続文字列を変更しました。
SqlConnection sqlcon = new SqlConnection("server=localhost;database=Database;Trusted_Connection=yes;");
が、これでも同じエラーが発生します。
今一度、アドバイスをお願いいたします。
-
度々ありがとうございます。
ご指摘のインスタンス名を下記の通りつけてみました。
SqlConnection sqlcon = new SqlConnection("Server=localhost\SQLEXPRESS;database=Database;Trusted_Connection=yes;");
インスタンス名の前にあるバックスラッシュは、¥¥として入力しています。
すると、エラーメッセージが下記のものに変わりました。
このログインで要求されたデータベース "Database" を開けません。ログインに失敗しました。
ユーザー '○○○\○○○' はログインできませんでした。実行時、Windowsにログインしているのは、Database.mdfを作成したユーザでログインしています。
このような場合は、どのようにすればよろしいのでしょうか。
よろしくお願いします。
-
諸農です。
.NET 2.0 SDKをインストールしているのであれば(VS2005をインストールすれば入っていると思いますが)、スタートメニューにある.NET v2.0 SDKにある「クイックスタートチュートリアル」を開いて、その中にある「構成の詳細」リンクをクリックして開かれたページの「4.ASP.NET ユーザー アカウントのデータベースへのアクセスを許可します。」が参考になると思います。
-
ご説明ありがとうございます。
今回の私の場合は、次の3行をSDKコマンドプロンプトに入力すればよろしいのでしょうか。
カレントプロンプトは、C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0>
の状態にて、
sqlcmd -E -S (local)\SQLExpress -Q "sp_grantlogin <ASP.NET User Account>"
sqlcmd -E -S (local)\SQLExpress -d Database -Q "sp_grantdbaccess <ASP.NET User Account>"
sqlcmd -E -S (local)\SQLExpress -d Database "sp_addrolemember 'db_owner', <ASP.NET User Account>"
ちなみに、開発用サーバで実行している場合でも、ASPNETユーザを追加しなければいけないのでしょうか。
よろしくお願いします。
-
たびたび申し訳ございません。
もう一度、最初から次の手順にて、やってみましたが同じ現象です。
・ASP.NET Webサイトを作成
・ソリュウションエクスプローラー内のApp_Dataを右クリックし、SQLデータベースを追加(ファイル名:MyDB.mdf)
・サーバーエクスプローラ内に作成された、MyDB.mdfを展開後、テーブルを右クリックにて、新しいテーブルの追加(テーブル名:TblTest)
・次のフィールドを追加
id varchar(5)
name varchar(30)
tel varchar(15)
・テーブルデータの表示にて、次のデータを追加
a0001 test1 123-456
a0002 test2 456-789
a0003 test3 789-123
・Default.aspxのデザイン画面にて、Buttonの追加
・Default.aspx.csに、using System.Data.SqlClientを入力
・Buttonのクリックイベントにて、次のソースを入力SqlConnection sqlcon = new SqlConnection("server=localhost\SQLEXPRESS;database=MyDB;Trusted_Connection=yes;");
SqlCommand sqlcmd = new SqlCommand("SELECT * FROM TblTest", sqlcon);
sqlcon.Open();
SqlDataReader sqldr = sqlcmd.ExecuteReader();
while (sqldr.Read())
{
Console.WriteLine((string)sqldr["id"]);
}
sqldr.Close();
sqlcon.Close();
・デバックなしで開始にて実行
・次のエラーが表示
このログインで要求されたデータベース "MyDB" を開けません。ログインに失敗しました。
ユーザー 'コンピュータ名\ユーザ名' はログインできませんでした。以上の手順にて、作業を進めていきました。
よろしくお願いいたします。
-
ああ、やっぱりそうか。。。
> ・ソリュウションエクスプローラー内のApp_Dataを右クリックし、SQLデータベースを追加(ファイル名:MyDB.mdf)
この方法で追加したデータベースはSQLサーバ上に直接MyDBという名前で追加されているわけではありません。
したがって、今ためされているような接続文字列では接続できないのが当然となります。
"server=localhost\SQLEXPRESS;AttachDBFilename=|DataDirectory|MyDB.mdf;Trusted_Connection=yes;"
これでいけるかなぁ?
もっと手軽なのは、作成したテーブルをaspxファイル上にドラッグ アンド ドロップするとGridViewを自動的に作ろうとするんですが、そのときに接続文字列もWeb.configの中に書き出してくれます。
このWeb.config内の接続文字列を利用するようにしておくと、あとで接続文字列を書き換える必要がでたときに一か所だけ直せばよい、ということになります。
-
本当にありがとうございました。
ご指摘の通りでした。
ただ、ご指摘の接続文字列では、不正な文字があるとエラーが出たため、
web.configに自動的に作られた接続文字列をコピーすると、動いてくれました。
ちなみに、自動的に作成された文字列は下記の通りです。
"Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True;"
あと、一つ教えていただきたいのですが、
>>Web.config内の接続文字列を利用するようにしておくと、あとで接続文字列を書き換える必要がでたときに一か所だけ直せばよい、
という所なのですが、web.config内に作成された文字列をどのように、プログラム内で指定すればよろしいのでしょうか。
質問ばかりでもうしわけないのですが、宜しくお願いします。
-
Web.config内の接続文字列は
WebConfigurationManager.ConnectionStrings["接続名"].ConnectionString
で取得できると思います。
詳細は下記MSDNライブラリの関連ページをご参照ください。
WebConfigurationManager クラス
connectionStrings 要素 (ASP.NET 設定スキーマ)
http://msdn2.microsoft.com/ja-jp/library/bf7sd233(VS.80).aspx
方法 : Web.config ファイルから接続文字列を読み取る
http://msdn2.microsoft.com/ja-jp/library/ms178411(vs.80).aspx
すべての返信
-
諸農です。
>SqlConnection("Server=localhost;database=pubs;user id=sa;password=p@ssw0rd;");
SQL Server 2005 Express Editionが名前付きインスタンスでインストールされていませんか?
もしくはこちらのTips等が参考になるかも。
SQL Server 2005 Tips and Tips
-
Kazutaka Moronoさま、どっとねっとふぁんさまご丁寧にありがとうございます。
Kazutaka Moronoさまの言われたSQL Server 2005 Express Editionを名前付きインスタスで
インストールしたかどうか、覚えていなかったのでVS2005および、SQL Server2005を全て削除した後、
VS2005をインストールしました。この時点で、SQL Server2005 Expressが自動的にインストールされている
デフォルトのままです。
そこで、VS2005のサーバーエキスプローラのデータ接続を利用して、データベース名をDatabase、テーブル名をTblchekと
して、作成しました。データー等も入力しました。
また、どっとねっとふぁんさまの言われたsaの有効ですが、これはしていなかったので、Windows認証にしました。
次のように接続文字列を変更しました。
SqlConnection sqlcon = new SqlConnection("server=localhost;database=Database;Trusted_Connection=yes;");
が、これでも同じエラーが発生します。
今一度、アドバイスをお願いいたします。
-
度々ありがとうございます。
ご指摘のインスタンス名を下記の通りつけてみました。
SqlConnection sqlcon = new SqlConnection("Server=localhost\SQLEXPRESS;database=Database;Trusted_Connection=yes;");
インスタンス名の前にあるバックスラッシュは、¥¥として入力しています。
すると、エラーメッセージが下記のものに変わりました。
このログインで要求されたデータベース "Database" を開けません。ログインに失敗しました。
ユーザー '○○○\○○○' はログインできませんでした。実行時、Windowsにログインしているのは、Database.mdfを作成したユーザでログインしています。
このような場合は、どのようにすればよろしいのでしょうか。
よろしくお願いします。
-
諸農です。
.NET 2.0 SDKをインストールしているのであれば(VS2005をインストールすれば入っていると思いますが)、スタートメニューにある.NET v2.0 SDKにある「クイックスタートチュートリアル」を開いて、その中にある「構成の詳細」リンクをクリックして開かれたページの「4.ASP.NET ユーザー アカウントのデータベースへのアクセスを許可します。」が参考になると思います。
-
ご説明ありがとうございます。
今回の私の場合は、次の3行をSDKコマンドプロンプトに入力すればよろしいのでしょうか。
カレントプロンプトは、C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0>
の状態にて、
sqlcmd -E -S (local)\SQLExpress -Q "sp_grantlogin <ASP.NET User Account>"
sqlcmd -E -S (local)\SQLExpress -d Database -Q "sp_grantdbaccess <ASP.NET User Account>"
sqlcmd -E -S (local)\SQLExpress -d Database "sp_addrolemember 'db_owner', <ASP.NET User Account>"
ちなみに、開発用サーバで実行している場合でも、ASPNETユーザを追加しなければいけないのでしょうか。
よろしくお願いします。
-
たびたび申し訳ございません。
もう一度、最初から次の手順にて、やってみましたが同じ現象です。
・ASP.NET Webサイトを作成
・ソリュウションエクスプローラー内のApp_Dataを右クリックし、SQLデータベースを追加(ファイル名:MyDB.mdf)
・サーバーエクスプローラ内に作成された、MyDB.mdfを展開後、テーブルを右クリックにて、新しいテーブルの追加(テーブル名:TblTest)
・次のフィールドを追加
id varchar(5)
name varchar(30)
tel varchar(15)
・テーブルデータの表示にて、次のデータを追加
a0001 test1 123-456
a0002 test2 456-789
a0003 test3 789-123
・Default.aspxのデザイン画面にて、Buttonの追加
・Default.aspx.csに、using System.Data.SqlClientを入力
・Buttonのクリックイベントにて、次のソースを入力SqlConnection sqlcon = new SqlConnection("server=localhost\SQLEXPRESS;database=MyDB;Trusted_Connection=yes;");
SqlCommand sqlcmd = new SqlCommand("SELECT * FROM TblTest", sqlcon);
sqlcon.Open();
SqlDataReader sqldr = sqlcmd.ExecuteReader();
while (sqldr.Read())
{
Console.WriteLine((string)sqldr["id"]);
}
sqldr.Close();
sqlcon.Close();
・デバックなしで開始にて実行
・次のエラーが表示
このログインで要求されたデータベース "MyDB" を開けません。ログインに失敗しました。
ユーザー 'コンピュータ名\ユーザ名' はログインできませんでした。以上の手順にて、作業を進めていきました。
よろしくお願いいたします。
-
ああ、やっぱりそうか。。。
> ・ソリュウションエクスプローラー内のApp_Dataを右クリックし、SQLデータベースを追加(ファイル名:MyDB.mdf)
この方法で追加したデータベースはSQLサーバ上に直接MyDBという名前で追加されているわけではありません。
したがって、今ためされているような接続文字列では接続できないのが当然となります。
"server=localhost\SQLEXPRESS;AttachDBFilename=|DataDirectory|MyDB.mdf;Trusted_Connection=yes;"
これでいけるかなぁ?
もっと手軽なのは、作成したテーブルをaspxファイル上にドラッグ アンド ドロップするとGridViewを自動的に作ろうとするんですが、そのときに接続文字列もWeb.configの中に書き出してくれます。
このWeb.config内の接続文字列を利用するようにしておくと、あとで接続文字列を書き換える必要がでたときに一か所だけ直せばよい、ということになります。
-
本当にありがとうございました。
ご指摘の通りでした。
ただ、ご指摘の接続文字列では、不正な文字があるとエラーが出たため、
web.configに自動的に作られた接続文字列をコピーすると、動いてくれました。
ちなみに、自動的に作成された文字列は下記の通りです。
"Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True;"
あと、一つ教えていただきたいのですが、
>>Web.config内の接続文字列を利用するようにしておくと、あとで接続文字列を書き換える必要がでたときに一か所だけ直せばよい、
という所なのですが、web.config内に作成された文字列をどのように、プログラム内で指定すればよろしいのでしょうか。
質問ばかりでもうしわけないのですが、宜しくお願いします。
-
Web.config内の接続文字列は
WebConfigurationManager.ConnectionStrings["接続名"].ConnectionString
で取得できると思います。
詳細は下記MSDNライブラリの関連ページをご参照ください。
WebConfigurationManager クラス
connectionStrings 要素 (ASP.NET 設定スキーマ)
http://msdn2.microsoft.com/ja-jp/library/bf7sd233(VS.80).aspx
方法 : Web.config ファイルから接続文字列を読み取る
http://msdn2.microsoft.com/ja-jp/library/ms178411(vs.80).aspx