none
SQL Server2005に接続できない RRS feed

  • 質問

  • 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 への接続を開け

    ませんでした)

    このような場合は、どのようにすればいいのでしょうか。

    ご教授お願いします。

    2007年5月16日 7:02

回答

  • 諸農です。

     

    >SqlConnection("Server=localhost;database=pubs;user id=sa;password=p@ssw0rd;");

     

    SQL Server 2005 Express Editionが名前付きインスタンスでインストールされていませんか?

     

    もしくはこちらのTips等が参考になるかも。

     

    SQL Server 2005 Tips and Tips

    http://www.microsoft.com/japan/sql/ssj/tips/01.mspx

    2007年5月16日 7:45
  • >> SqlConnection("Server=localhost;database=pubs;user id=sa;password=p@ssw0rd;");

    > SQL Server 2005 Express Editionが名前付きインスタンスでインストールされていませんか?

     

    saが有効になっているかどうかも気になるあたりですね。

    普通にインストールしたら、2005 Express Editionではsaは無効だったかと思います。

     

    2007年5月16日 7:53
  • 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;");

    が、これでも同じエラーが発生します。

     

    今一度、アドバイスをお願いいたします。

     

    2007年5月17日 9:44
  • > VS2005および、SQL Server2005を全て削除した後、VS2005をインストールしました。

    > この時点で、SQL Server2005 Expressが自動的にインストールされているデフォルトのままです。

     

    この状態だとSQL Expressは名前付きインスタンスとしてインストールされてたはず。

    名前は"SQLEXPRESS”だったと思います。

    2007年5月17日 11:00
  • 度々ありがとうございます。

    ご指摘のインスタンス名を下記の通りつけてみました。

            SqlConnection sqlcon = new SqlConnection("Server=localhost\SQLEXPRESS;database=Database;Trusted_Connection=yes;");

     

    インスタンス名の前にあるバックスラッシュは、¥¥として入力しています。

    すると、エラーメッセージが下記のものに変わりました。

     

    このログインで要求されたデータベース "Database" を開けません。ログインに失敗しました。
    ユーザー '○○○\○○○' はログインできませんでした。

     

    実行時、Windowsにログインしているのは、Database.mdfを作成したユーザでログインしています。

     

    このような場合は、どのようにすればよろしいのでしょうか。

    よろしくお願いします。

    2007年5月18日 0:30
  • Webアプリは開発サーバ上で動いてますか?IIS上で動いてますか?

    IIS上で動かしているなら、Webアプリの実行時のユーザはXPの場合そのマシンのASPNETというユーザになります。

    このユーザにデータベースへのログイン権限やテーブルへのアクセス権等を追加する必要があります。

     

    2007年5月18日 7:37
  • 説明不足で申し訳ございません。

    開発サーバ上で動いています。(IISのサービスは停止しています)

    また、パーソナルファイアーウォールは無効にしています。

     

    2007年5月18日 7:54
  • 諸農です。

     

    .NET 2.0 SDKをインストールしているのであれば(VS2005をインストールすれば入っていると思いますが)、スタートメニューにある.NET v2.0 SDKにある「クイックスタートチュートリアル」を開いて、その中にある「構成の詳細」リンクをクリックして開かれたページの「4.ASP.NET ユーザー アカウントのデータベースへのアクセスを許可します。」が参考になると思います。

     

    2007年5月18日 10:31
  • ご説明ありがとうございます。

    今回の私の場合は、次の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ユーザを追加しなければいけないのでしょうか。

    よろしくお願いします。

    2007年5月19日 11:49
  • ASP.NETユーザを追加しようと思い次のコマンドを入力したのですが、

    メッセージ 102、レベル 15、状態 1、サーバー TEST01\SQLEXPRESS、行 1
    '<' 付近に不適切な構文があります。

    というエラーが出てしまいます。

    sqlcmd -E -S (local)\SQLExpress -Q "sp_grantlogin <TEST01\ASPNET>"

    (TEST01は、マシン名です。)

    これは、何がおかしいのでしょうか。

    アドバイスをお願いします。

    2007年5月21日 7:39
  • < や > は入力する必要がありません。
    これはドキュメント上で「適切な内容に書き換えてください」という意味のしるしだったと思います。

     

    ただ、開発サーバで動かしているんだったらこんな設定必要ないはずなんですけどね。
    2007年5月21日 8:25
  • 何度もありがとうございます。

    サーバーエクスプローラからデータベースに接続して、GridViewへの表示は問題なくできるのに、

    PGから、接続して読み込むということは、開発サーバではもしかして、できないのでしょうか?

    それとも、何か単純なミスでもしているのでしょうか。

    ちょっと自己嫌悪におちいっています。

     

    2007年5月22日 6:58
  • データベースを作成した手順と現在の接続文字列を正確に記述してもらっていいですか?

    どこか設定がずれてるんだと思うのですが、今提示されている情報だけだとどこがおかしいかわかりません。

    2007年5月22日 8:37
  • たびたび申し訳ございません。

    もう一度、最初から次の手順にて、やってみましたが同じ現象です。

     

    ・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" を開けません。ログインに失敗しました。
    ユーザー 'コンピュータ名\ユーザ名' はログインできませんでした。

     

    以上の手順にて、作業を進めていきました。

    よろしくお願いいたします。

    2007年5月23日 13:18
  • ああ、やっぱりそうか。。。

     

    > ・ソリュウションエクスプローラー内のApp_Dataを右クリックし、SQLデータベースを追加(ファイル名:MyDB.mdf)

     

    この方法で追加したデータベースはSQLサーバ上に直接MyDBという名前で追加されているわけではありません。

    したがって、今ためされているような接続文字列では接続できないのが当然となります。

     

    "server=localhost\SQLEXPRESS;AttachDBFilename=|DataDirectory|MyDB.mdf;Trusted_Connection=yes;"

     

    これでいけるかなぁ?

     

    もっと手軽なのは、作成したテーブルをaspxファイル上にドラッグ アンド ドロップするとGridViewを自動的に作ろうとするんですが、そのときに接続文字列もWeb.configの中に書き出してくれます。

    このWeb.config内の接続文字列を利用するようにしておくと、あとで接続文字列を書き換える必要がでたときに一か所だけ直せばよい、ということになります。

     

    2007年5月23日 15:37
  • 本当にありがとうございました。

    ご指摘の通りでした。

    ただ、ご指摘の接続文字列では、不正な文字があるとエラーが出たため、

    web.configに自動的に作られた接続文字列をコピーすると、動いてくれました。

    ちなみに、自動的に作成された文字列は下記の通りです。

    "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True;"

     

    あと、一つ教えていただきたいのですが、

    >>Web.config内の接続文字列を利用するようにしておくと、あとで接続文字列を書き換える必要がでたときに一か所だけ直せばよい、

    という所なのですが、web.config内に作成された文字列をどのように、プログラム内で指定すればよろしいのでしょうか。

    質問ばかりでもうしわけないのですが、宜しくお願いします。

    2007年5月24日 6:00
  • Web.config内の接続文字列は

    WebConfigurationManager.ConnectionStrings["接続名"].ConnectionString

    で取得できると思います。

     

    詳細は下記MSDNライブラリの関連ページをご参照ください。

     

    WebConfigurationManager クラス

    http://msdn2.microsoft.com/ja-jp/library/system.web.configuration.webconfigurationmanager(VS.80).aspx

     

    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

    2007年5月24日 15:44
  • みなさん、ご丁寧にアドバイスを頂きありがとうございました。

    これからも、頑張って勉学に頑張りたいと思います。

     

    2007年5月25日 0:13

すべての返信

  • 諸農です。

     

    >SqlConnection("Server=localhost;database=pubs;user id=sa;password=p@ssw0rd;");

     

    SQL Server 2005 Express Editionが名前付きインスタンスでインストールされていませんか?

     

    もしくはこちらのTips等が参考になるかも。

     

    SQL Server 2005 Tips and Tips

    http://www.microsoft.com/japan/sql/ssj/tips/01.mspx

    2007年5月16日 7:45
  • >> SqlConnection("Server=localhost;database=pubs;user id=sa;password=p@ssw0rd;");

    > SQL Server 2005 Express Editionが名前付きインスタンスでインストールされていませんか?

     

    saが有効になっているかどうかも気になるあたりですね。

    普通にインストールしたら、2005 Express Editionではsaは無効だったかと思います。

     

    2007年5月16日 7:53
  • 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;");

    が、これでも同じエラーが発生します。

     

    今一度、アドバイスをお願いいたします。

     

    2007年5月17日 9:44
  • > VS2005および、SQL Server2005を全て削除した後、VS2005をインストールしました。

    > この時点で、SQL Server2005 Expressが自動的にインストールされているデフォルトのままです。

     

    この状態だとSQL Expressは名前付きインスタンスとしてインストールされてたはず。

    名前は"SQLEXPRESS”だったと思います。

    2007年5月17日 11:00
  • 度々ありがとうございます。

    ご指摘のインスタンス名を下記の通りつけてみました。

            SqlConnection sqlcon = new SqlConnection("Server=localhost\SQLEXPRESS;database=Database;Trusted_Connection=yes;");

     

    インスタンス名の前にあるバックスラッシュは、¥¥として入力しています。

    すると、エラーメッセージが下記のものに変わりました。

     

    このログインで要求されたデータベース "Database" を開けません。ログインに失敗しました。
    ユーザー '○○○\○○○' はログインできませんでした。

     

    実行時、Windowsにログインしているのは、Database.mdfを作成したユーザでログインしています。

     

    このような場合は、どのようにすればよろしいのでしょうか。

    よろしくお願いします。

    2007年5月18日 0:30
  • Webアプリは開発サーバ上で動いてますか?IIS上で動いてますか?

    IIS上で動かしているなら、Webアプリの実行時のユーザはXPの場合そのマシンのASPNETというユーザになります。

    このユーザにデータベースへのログイン権限やテーブルへのアクセス権等を追加する必要があります。

     

    2007年5月18日 7:37
  • 説明不足で申し訳ございません。

    開発サーバ上で動いています。(IISのサービスは停止しています)

    また、パーソナルファイアーウォールは無効にしています。

     

    2007年5月18日 7:54
  • 諸農です。

     

    .NET 2.0 SDKをインストールしているのであれば(VS2005をインストールすれば入っていると思いますが)、スタートメニューにある.NET v2.0 SDKにある「クイックスタートチュートリアル」を開いて、その中にある「構成の詳細」リンクをクリックして開かれたページの「4.ASP.NET ユーザー アカウントのデータベースへのアクセスを許可します。」が参考になると思います。

     

    2007年5月18日 10:31
  • ご説明ありがとうございます。

    今回の私の場合は、次の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ユーザを追加しなければいけないのでしょうか。

    よろしくお願いします。

    2007年5月19日 11:49
  • ASP.NETユーザを追加しようと思い次のコマンドを入力したのですが、

    メッセージ 102、レベル 15、状態 1、サーバー TEST01\SQLEXPRESS、行 1
    '<' 付近に不適切な構文があります。

    というエラーが出てしまいます。

    sqlcmd -E -S (local)\SQLExpress -Q "sp_grantlogin <TEST01\ASPNET>"

    (TEST01は、マシン名です。)

    これは、何がおかしいのでしょうか。

    アドバイスをお願いします。

    2007年5月21日 7:39
  • < や > は入力する必要がありません。
    これはドキュメント上で「適切な内容に書き換えてください」という意味のしるしだったと思います。

     

    ただ、開発サーバで動かしているんだったらこんな設定必要ないはずなんですけどね。
    2007年5月21日 8:25
  • 何度もありがとうございます。

    サーバーエクスプローラからデータベースに接続して、GridViewへの表示は問題なくできるのに、

    PGから、接続して読み込むということは、開発サーバではもしかして、できないのでしょうか?

    それとも、何か単純なミスでもしているのでしょうか。

    ちょっと自己嫌悪におちいっています。

     

    2007年5月22日 6:58
  • データベースを作成した手順と現在の接続文字列を正確に記述してもらっていいですか?

    どこか設定がずれてるんだと思うのですが、今提示されている情報だけだとどこがおかしいかわかりません。

    2007年5月22日 8:37
  • たびたび申し訳ございません。

    もう一度、最初から次の手順にて、やってみましたが同じ現象です。

     

    ・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" を開けません。ログインに失敗しました。
    ユーザー 'コンピュータ名\ユーザ名' はログインできませんでした。

     

    以上の手順にて、作業を進めていきました。

    よろしくお願いいたします。

    2007年5月23日 13:18
  • ああ、やっぱりそうか。。。

     

    > ・ソリュウションエクスプローラー内のApp_Dataを右クリックし、SQLデータベースを追加(ファイル名:MyDB.mdf)

     

    この方法で追加したデータベースはSQLサーバ上に直接MyDBという名前で追加されているわけではありません。

    したがって、今ためされているような接続文字列では接続できないのが当然となります。

     

    "server=localhost\SQLEXPRESS;AttachDBFilename=|DataDirectory|MyDB.mdf;Trusted_Connection=yes;"

     

    これでいけるかなぁ?

     

    もっと手軽なのは、作成したテーブルをaspxファイル上にドラッグ アンド ドロップするとGridViewを自動的に作ろうとするんですが、そのときに接続文字列もWeb.configの中に書き出してくれます。

    このWeb.config内の接続文字列を利用するようにしておくと、あとで接続文字列を書き換える必要がでたときに一か所だけ直せばよい、ということになります。

     

    2007年5月23日 15:37
  • 本当にありがとうございました。

    ご指摘の通りでした。

    ただ、ご指摘の接続文字列では、不正な文字があるとエラーが出たため、

    web.configに自動的に作られた接続文字列をコピーすると、動いてくれました。

    ちなみに、自動的に作成された文字列は下記の通りです。

    "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True;"

     

    あと、一つ教えていただきたいのですが、

    >>Web.config内の接続文字列を利用するようにしておくと、あとで接続文字列を書き換える必要がでたときに一か所だけ直せばよい、

    という所なのですが、web.config内に作成された文字列をどのように、プログラム内で指定すればよろしいのでしょうか。

    質問ばかりでもうしわけないのですが、宜しくお願いします。

    2007年5月24日 6:00
  • Web.config内の接続文字列は

    WebConfigurationManager.ConnectionStrings["接続名"].ConnectionString

    で取得できると思います。

     

    詳細は下記MSDNライブラリの関連ページをご参照ください。

     

    WebConfigurationManager クラス

    http://msdn2.microsoft.com/ja-jp/library/system.web.configuration.webconfigurationmanager(VS.80).aspx

     

    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

    2007年5月24日 15:44
  • みなさん、ご丁寧にアドバイスを頂きありがとうございました。

    これからも、頑張って勉学に頑張りたいと思います。

     

    2007年5月25日 0:13