SQL Server の既定の設定がリモート接続を許可しないようになっていることがエラーの原因である可能性があります

                                                                                                  • -

サーバーへの接続を確立しているときにエラーが発生しました。SQL Server 2005 に接続しているときときにこのエラーが発生した場合は、SQL Server の既定の設定がリモート接続を許可しないようになっていることがエラーの原因である可能性があります。 (provider: 名前付きパイプ プロバイダ, error: 40 - SQL Server への接続を開けませんでした)
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.Data.SqlClient.SqlException: サーバーへの接続を確立しているときにエラーが発生しました。SQL Server 2005 に接続しているときときにこのエラーが発生した場合は、SQL Server の既定の設定がリモート接続を許可しないようになっていることがエラーの原因である可能性があります。 (provider: 名前付きパイプ プロバイダ, error: 40 - SQL Server への接続を開けませんでした)

                                                                                                  • -

最初:2008年6月8日 11:29
最後:2008年6月10日 0:28

このエラーに一番苦しめられた。TCP/IPならまだしも名前付きパイプでなんて…しかも、最終的に解決した理由が分らない。


Index
・デフォルトではネットワーク接続が無効!
・ネットワーク接続を有効化するには?
・使用するポートは TCP 1433
Windows XP SP2 の場合
・ホスト名解決も必要
・名前付きインスタンスは動的ポートと UDP 1434 も例外へ追加
http://blogs.sqlpassj.org/matu_tak/archive/2006/03/22/16481.aspx


リモート接続が許可されるように SQL Server 2005 を構成する方法
http://support.microsoft.com/kb/914277#
SQL Server 2005 Express または SQL Server 2005 Developer Edition でリモート接続を有効にする」は実行した。
Windows ファイアウォールSQL Server 2005 に対する例外を作成する」と「Windows ファイアウォールSQL Server Browser サービスに対する例外を作成する」は、ノートパソコンのNorton Internet Securityファイアウォール:プログラム制御で、C:\Program Files\Microsoft SQL Server\90\Shared\sqlbrowser.exeを許可した。C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exeは既に設定されていた。


SQL Server 2005 Tips and Tips
第 1 回 ネットワーク接続を有効化しよう
http://www.microsoft.com/japan/sql/ssj/tips/01.mspx


SQL Server Browser サービスを開始および停止する方法
http://msdn.microsoft.com/ja-jp/library/ms189093.aspx
SQL Server Configuration Managerでサービスを開始した。これは盲点なので、要注意。
「ホスト名解決も必要」というので、C:\Windows\System32\drivers\etc\lmhostsファイルを編集するかと考えたが、ノートパソコンにはLANケーブルと無線LANの2つのIPアドレスがあるので思案していたが結局不実行。


特定の TCP ポートで受信待ちするようにサーバーを構成する方法
http://msdn.microsoft.com/ja-jp/library/ms177440.aspx
名前付きパイプのエラーなので、これは行っていない。
SQL Server Configuration Managerで、共有メモリプロトコルを無効にし、名前付きパイプの順番を1に、TCP/IPの順番を2にした。




何度も見直して間違いないハズなのに、/localhost/ishop/Default.aspxのエラーが解消されない (ノ_-;)




ある瞬間まで「プログラムは間違いない」と考えていた。でも、SQL Server Management Studio ExpressではWindows認証でちゃんと利用できていることから「SQLServer側の設定は間違いない」と結論した。すると、コーディングに何かがあると仮定できる。
そうなると比較するには、別のソースコードが必要になる。そこで後述するsample.aspxを作成した。
sample.aspxを作ってみると、Web.configに
uid=xxxxxxxx;pwd=xxxxxxxx;User ID=xxxxxxxx;Password=xxxxxxxx;Trusted_Connection=no;
と記述していたが、
User ID=xxxxxxxx;Password=xxxxxxxx;Trusted_Connection=yes;
ですむことが判明した。




で。



/localhost/ishop/sample.aspxがうまく表示された途端、/localhost/ishop/Default.aspxでエラーが出なくなった!?




なぜ??( ̄へ ̄|||)




最終的には

<add name="WebShopConnectionString" connectionString="server=pcname\SQLEXPRESS;User id=username;Password=loginpassword;Trusted_Connection=true;database=iShop;" providerName="System.Data.SqlClient"/>

でうまくいっている。




sample.aspxの内容

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>

<html>
<head runat="server">
  <script runat="server">

    static DataSet MakeDataSet() {

      string sqlStr = "SELECT CompanyID,Title,Description,Displayorder FROM CompanyInfo";

      string connStr = "Server=pcname\\SQLEXPRESS;User ID=username;Password=loginpassword;"
                     + "Trusted_Connection=yes;"
                     + "database=iShop";

      SqlDataAdapter da = new SqlDataAdapter(sqlStr, connStr);

      DataSet ds = new DataSet();
      da.Fill(ds);

      return ds;
    }

    void Page_Load(object s, EventArgs e) {
      DataGrid1.DataSource = MakeDataSet();
      DataGrid1.DataBind();
    }

  </script>
</head>

<body>
★
  <form runat="server">
    <asp:DataGrid id="DataGrid1" runat="server"
        EnableViewState="false"
        HeaderStyle-BackColor="#aaaadd" />
  </form>
★
</body>
</html>

出展:ADO.NET基礎講座 初めての.NETデータベース・プログラミング 第4回 データセットを使ったデータベース・アクセス
http://www.atmarkit.co.jp/fdotnet/basics/adonet04/adonet04_03.html

補足:出典より一部変更してある(実はそのままではエラーになったし)。変更後を掲載保存しておくのは、別の機会の接続確認のサンプルコードに利用するつもりなのである。