none
Visual Studioでサーバーのデータベース(SQL Server)に接続できない RRS feed

  • 質問

  • いつもお世話になっております。

    サーバーとなっていて、SQL Server 2012 Express のインストールされたWindows7に、同じくSQL Server 2012 Express のインストールされたVistaで接続を試みています。
    VistaのMicrosoft SQL Server Manegement Studioでは、Windows7のデータベースにアタッチすることができて、Windows7のデータの変更も直ちに反映されます。
    しかし、Visual Studio 2010(C#)でConnection Stringの接続文字列を設定してもデータの接続ができません。

    このWindows7のPrimary Data FileもLog Fileも同様にEveryoneのフルコントロールに設定しています。
    Vistaでは、Microsoft SQL Server Manegement Studioで、SQL Server認証でアタッチできています。

    接続文字列は、
    サーバーとしているWindows7では、
    Windows認証として、
    (1):
    "Data Source=" + SERVER-PC + ";Database=" + theData + ";Integrated Security=true;";
    SQL Server認証として、
    (2):
    "Persist Security Info=False;Integrated Security=true;Initial Catalog=TheData;User ID=sa;Password=password;Server=" + theData + ";";
    で接続できていますが、
    Vistaでは、(2)の文字列では接続できません。

    接続できないのは何故なのでしょう?

    解決策を与えて頂きたいのです。どうぞ、よろしくお願い致します。

    2012年10月14日 9:37

回答

  • すでに他の方から回答されていますが、追加情報をレスし
    ておきます。

    > これは既定のインスタンスへの接続の文字列なのでしょ
    > うか、それとも名前付きインスタンスへの接続のものな
    > のでしょうか?

    SQLEXPRESS は SQL Server Express 版の名前つきインスタ
    ンスのデフォルト名です。

    名前付きインスタンスの使用
    http://msdn.microsoft.com/ja-jp/library/ms165614%28v=sql.90%29.aspx

    SQL Server 2012 Express をインストールする際、デフォ
    ルトでは名前付きインスタンスとなり、インスタンス名が
    SQLEXPRESS となるはずです。

    SQL Server 2012 Express のインストール
    http://awoni.net/fc/2012-express/

    主な違いは TCP/IP での接続の際にポートが静的になるか
    動的になるかです。

    SQL Server 2008 Express にリモート接続
    http://awoni.net/fc/remote/

    上のページに、"リモート接続の場合、Windows 7/Vista では、
    Windows 認証を利用することはできません。" とありますが、
    Active Directory ドメイン環境でドメインアカウントを使用
    すれば Windows 認証は使用できます。

    ワークグループ環境でも、terapemiya さんが紹介された Web
    の記事の設定をすれば Windows 認証が使えるかもしれません
    (未検証ですが)。

    • 回答としてマーク Seven Faces 2013年4月22日 18:21
    2012年10月24日 12:28

すべての返信

  • 文章が冗長で何を尋ねているのかよくわからないのですが、前半と後半は別の質問ですか?

    VistaのMicrosoft SQL Server Manegement Studioでは、Windows7のデータベースにアタッチすることができて、Windows7のデータの変更も直ちに反映されます。
    しかし、Visual Studio 2010(C#)でConnection Stringの接続文字列を設定してもデータの接続ができません。

    「アタッチ」とはSQL Serverがデータベースファイルを読み込むことであり、この場合はクライアントがSQL Serverへ「接続」する意図でしょうから言葉が誤っています。
    接続できないのなら、ConnectionStringsプロパティの値を出力してみて、それを一字一句確かめるべきです。きっとどこかが異なるからこそ接続できないのでしょう。

    (2):
    "Persist Security Info=False;Integrated Security=true;Initial Catalog=TheData;User ID=sa;Password=password;Server=" + theData + ";";
    で接続できていますが、
    Vistaでは、(2)の文字列では接続できません。

    接続できないのは何故なのでしょう?

    Server = theData になっていて、Windows7へ接続しようとしていません。

    また、エラーメッセージを確認すべきです。上記が原因ならエラーメッセージに「Windows7に接続できません」にはならないはずであり、接続先が誤っていることがすぐにわかるはずです。


    • 編集済み 佐祐理 2012年10月14日 9:52 誤字訂正
    2012年10月14日 9:51
  • ご返信ありがとうございます。

    ご指摘通り、
    (1)"Persist Security Info=False;Integrated Security=true;Initial Catalog=TheData;User ID=sa;Password=password;Server=" + theData + ";";
    は、記述間違いで、
    エラーメッセージは、
    SQL Serverへの接続を確立しているときに ... インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認して下さい。 error:25

    一方、接続を試みた接続文字列は、
    (2)"Persist Security Info=False;Integrated Security=true;Initial Catalog=" + theData + ";User ID=sa;Password=password;Server=SERVER-PC\\SQLEXPRESS;";
    でした。

    ところが、これも接続できません。
    エラーメッセージは、
    ユーザー SERVER-PC\Guest はログインできませんでした。
    とのことです。ただちに、Primary Data FileとLog FileのGuestのフルコントロールを設定しました。

    また、ご返信内容のうち、自分の理解できていないことがあります。
    ConnectionStringsプロパティの値を出力する方法が分かりません。
    どうしたらよいのでしょうか?

    どうぞ、よろしくお願い致します。

    2012年10月14日 11:12
  • Guestアカウントで接続しようとして失敗しているように思います。以下を参考にして、「ローカルアカウントの共有とセキュリティモデル」を設定してみて下さい。

    SQLServerに接続できない
    http://social.msdn.microsoft.com/Forums/ja-JP/vbexpressja/thread/24d0e213-9b16-45a1-95c4-7800cf88741a/

    SQLServer接続時に、「’ユーザー'サーバー名\Guest'はログインできませんでした」 とエラーになる。
    http://soracomputer.seesaa.net/article/116453871.html


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年10月15日 0:21
    モデレータ
  • Integrated Security = true という設定の意味は理解されてます?

    あおい情報システム株式会社 小野修司(どっとねっとふぁん)

    2012年10月15日 1:19
  • ご指導ありがとうございます。

    ただ、私のPCがWindows7とVistaのためか、

    SQLServer接続時に、「’ユーザー'サーバー名\Guest'はログインできませんでした」 とエラーになる。
    のなかの、

    対策:サーバーのローカルセキュリティポリシーを変更する。
    「コントロールパネル」→「パフォーマンスとメンテナンス」→「管理ツール」→「ローカルセキュリティポリシー」
    「ローカルセキュリティ設定」画面で、「ローカルポリシー」→「セキュリティオプション」で
    「ネットワーク アクセス:ローカルアカウントの共有とセキュリティモデル」の項目をダブルクリックします。

    が見当たりません。

    「管理ツール」はiSCSI イニシエーターや、Windows メモリ診断などがありますが、「ローカルセキュリティポリシー」がないようです。

    私の操作方法が間違っているのでしょうか?

    2012年10月20日 4:07
  • > Visual Studio 2010(C#)でConnection Stringの接続文字列を設定しても
    > データの接続ができません。

    Vista にインストールしてある Visual Studio は Express 版ですか? それで、
    そこから Windows 7 にインストールしてある SQL Server の既定のインスタ
    ンスに接続しようとしているのですか?

    Express 版の Visual Studio は SQL Server の既定のインスタンスには接続
    できないはずです。

    Visual Studio が Express 版ではないとすると、接続文字列の間違いが怪し
    そうです。小野さんのレスを読んでますか? レスをもらって無反応ではダ
    メですよ。

    2012年10月20日 9:10
  • > Express 版の Visual Studio は SQL Server の既定のインスタンスには接続できないはずです。

    Visual Studioの機能で、各種ウィザードでつなぐとか、DBに接続して定義をみる/変更する、とかはできませんが、作成したアプリケーションからつないでデバッグ実行する、というレベルであれば接続文字列が正しく書けていれば可能です。
    まぁ、それ以前の問題で、接続文字列の個々の意味がわかっておらず、記述に間違いがあることが判断できない状態だと思います。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)

    2012年10月22日 7:08
  • Vistaも、Windows 7もインストールされたVisual Studio 2010のバージョンはProfessionalです。
    どこかで、SQL Server Expressは、既定のインスタンスに接続できないという記事を見た覚えがあります。
    このため、Windows 7 にインストールしてある SQL Server の名前付きインスタンスに接続しようとしています。

    また、Integrated Security = trueの意味については、
    Integrated Security=Trueは、接続にWindows認証を使うことを示すということまでやっとわかりました。
    ということは、SQL Serverインスタンスに接続しようとしているのに、Windows認証を使う指示をしてしまっているという間違いを犯しているのかもしれませんね。

    小野さんのご指摘がこうしたことを意味していると思っておりませんで、どう答えたらよいのか分からなかったので、返信ができませんでした。申し訳なく思っております。
    ただ、まだ試行錯誤中で、返信をすることすらできない状態です。
    2012年10月22日 14:15
  • ご返信ありがとうございます。

    接続文字列の個々の意味がわかっておらず、記述に間違いがあることが判断できない状態
    と、その通りなのです。
    Visual Studioの機能で、各種ウィザードでつなぐとか、DBに接続して定義をみる/変更する、とかはできませんが、作成したアプリケーションからつないでデバッグ実行する、というレベルであれば接続文字列が正しく書けていれば可能です。
    とのことですが、そのレベルに到達するまでしばらく時間がかかりそうです。
    ただ、そんなことができるとは、興味深く感じております。

    接続文字列を解読して間違い探しをしてみたいと思いますが、まだ理解する努力が出来ていないうちに軽いご返信は失礼かと感じておりました。勉強する予定とのレベルでの返信で申し訳ありません(今後ともよろしくお願いいたします)。

    手掛かりを与えていただきましたので、しばらく勉強のうえでもう一度返信させていただきたいと思います。

    2012年10月22日 14:27
  • Integrated Security=Trueは、接続にWindows認証を使うことを示すということまでやっとわかりました。
    ということは、SQL Serverインスタンスに接続しようとしているのに、Windows認証を使う指示をしてしまっているという間違いを犯しているのかもしれませんね。

    SQL Serverには既定のインスタンスと名前付きインスタンスの2通りがあります。また、認証にはWindows認証とSQL Server認証の2通りがあります。結果的に4通りの組み合わせがあることになります。
    SQL Server 2012 Expressは既定でsqlexpressという名前を持った名前付きインスタンスとしてインストールされます。これに接続する方法として、Windows認証とSQL Server認証の2通りがあります。推薦されているのはWindows認証です。

    ところで確認ですが、Windows Vistaから、Windows 7にインストールされているSQL Server 2012 Expressに接続されようとしているのでしょうか? また、以下のように書かれていますが、

    >「管理ツール」はiSCSI イニシエーターや、Windows メモリ診断などがありますが、「ローカルセキュリティポリシー」がないようです。

    お使いのWindows 7はHome Editionでしょうか? であれば、以下のようにレジストリで確認するしかないようです。

    質問
    http://answers.microsoft.com/ja-jp/windows/forum/windows_7-security/windows7-home/0bedc1ea-87d1-4a72-8f35-921a0e2cbb18

    おそらく以下のような状態ではないかと想像します。

    ワークグループ環境にあるSQL SERVER 2005 EXPRESSで
     WINDOWS認証を使ってネットワーク接続する際の注意点
     http://maplesmangrove.at.webry.info/201006/article_4.html

    であれば、リモートからの接続をGuestにマッピングさせないようにするか、SQL ServerのユーザーにGuestを追加するしかないように思います。ただ、どちらもセキュリティ面に不安が残ります・・・


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年10月23日 3:20
    モデレータ
  • いろいろ問題がありそうですが、まずは接続文字列を正し
    い形にするのが先だと思います。

    > SQL Serverインスタンスに接続しようとしているのに、
    > Windows認証を使う指示をしてしまっているという間違い
    > を犯しているのかもしれませんね。

    そのあたり何か考え違いをしていませんか? Windows 認
    証でも、もちろん既定のインスタンスに接続できます。

    #まさか、ユーザーインスタンスではないですよね?

    アップされていた接続文字列に Windows 認証と SQL Server
    認証の両方が指定されていることがおかしいのです。

    まずは、Windows 認証 or SQL Server 認証のどちらを使
    うのかをはっきりさせて、それに応じて正しい接続文字列
    を設定してください。

    どちらの認証方式を使うかによって、以下の例(あくまで
    例です)のように接続文字列が違ってきます。

    Windows 認証
    ------------
    Data Source=<サーバー名>\SQLEXPRESS;
    Initial Catalog=<データベース名>;
    Integrated Security=True

    SQL Server 認証
    ---------------
    Data Source=<サーバー名>\SQLEXPRESS;
    User ID=<ユーザーID>;
    Password=<パスワード>;
    Initial Catalog=<データベース名>

    Visual Studio のサーバーエクスプローラを開いてデータ
    接続のノードを右クリックし、「接続の追加」メニューか
    ら SQL Server への接続に成功すれば、自動的に接続文字
    列が生成されると思いますが、試してみましたか?

    Visual Studio の接続
    http://surferonwww.info/BlogEngine/post/2010/09/15/Connecting-Visual-Studio-to-SQL-Server.aspx


    なお、接続文字列の指定の詳細については以下のページが
    参考になると思います。

    SqlConnection.ConnectionString プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlconnection.connectionstring%28v=vs.90%29.aspx


    • 編集済み SurferOnWww 2012年10月23日 11:58 #部分追記
    2012年10月23日 11:53
  • 理解できずにいるままでの返信ではと、とても引けてしまうのですがあえて質問させて下さい。

    Windows 認証
    ------------
    Data Source=<サーバー名>\SQLEXPRESS;
    Initial Catalog=<データベース名>;
    Integrated Security=True

    SQL Server 認証
    ---------------
    Data Source=<サーバー名>\SQLEXPRESS;
    User ID=<ユーザーID>;
    Password=<パスワード>;
    Initial Catalog=<データベース名>

    とのことですが、これは既定のインスタンスへの接続の文字列なのでしょうか、それとも名前付きインスタンスへの接続のものなのでしょうか?

    この辺りの理解ができておりませんので、能力のない混沌とした状態のままなのです。

    すみません。

    2012年10月23日 15:11
  • おっしゃる通り、サーバーとしようとしているWindows 7のバージョンはHome Editionです。

    ちょっと難しそうですが、いまチャレンジさせていただきます。また、勉強が進んだのちに引き続き返信させていただきたいと思っております。

    2012年10月23日 16:30
  • 理解できずにいるままでの返信ではと、とても引けてしまうのですがあえて質問させて下さい。

    Windows 認証
    ------------
    Data Source=<サーバー名>\SQLEXPRESS;
    Initial Catalog=<データベース名>;
    Integrated Security=True

    SQL Server 認証
    ---------------
    Data Source=<サーバー名>\SQLEXPRESS;
    User ID=<ユーザーID>;
    Password=<パスワード>;
    Initial Catalog=<データベース名>

    とのことですが、これは既定のインスタンスへの接続の文字列なのでしょうか、それとも名前付きインスタンスへの接続のものなのでしょうか?

    この辺りの理解ができておりませんので、能力のない混沌とした状態のままなのです。

    すみません。

    Data Source=<サーバー名>\SQLEXPRESS; というのが、SQLExpressという名前のインスタンス(SQL Serverの、、、実体?)があることを前提に、そのインスタンスに接続してね、という指定になります。
    Express以外のSQL Serverの場合、デフォルトでインストールすると、既定のインスタンスというのが作成され、そこには「Data Source=<サーバー名>」という感じで接続できます。

    SQL Expressはデフォルトのインストール時にSQLEXPRESSというインスタンスを作成します。

    また、インストール時にインスタンスを指定して(名前をつけて)インストールすることも可能です。

    このあたりの一連の話はSQL Serverの管理について学習してください。
    なんにしてもそのあたりの知識がないことが問題になっていると思います。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)

    2012年10月24日 1:36
  • とのことですが、これは既定のインスタンスへの接続の文字列なのでしょうか、それとも名前付きインスタンスへの接続のものなのでしょうか?

    SQL Serverには必ずインスタンス名が存在します。これにより、インスタンス名で識別することにより、1台のコンピューターで複数のSQL  Serverを動作させることができます。
    既定のインスタンスというのは「MSSQLSERVER」という名前になります。製品版のSQL Server、つまりExpress版でないSQL Serverは、デフォルトで「既定のインスタンス」としてインストールされます。これに対してExpress版は、デフォルトでSQLEXPRESSというインスタンス名でインストールされます。既定のインスタンス以外を名前付きインスタンスと呼びます。
    既定のインスタンスはインスタンス名を省略して接続しますので、
    Data Source=<サーバー名>
    となります。
    これに対して、名前付きインスタンスは、インスタンス名を指定して接続します。
    Data Source=<サーバー名>\SQLEXPRESS;

    既定のインスタンスは、接続時にインスタンス名を省略できる、特殊な名前付きインスタンスというふうに考えても良いでしょう。(実際には接続時に動的ポートになるかどうかという違いなどもあります)


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/




    2012年10月24日 2:13
    モデレータ
  • すでに他の方から回答されていますが、追加情報をレスし
    ておきます。

    > これは既定のインスタンスへの接続の文字列なのでしょ
    > うか、それとも名前付きインスタンスへの接続のものな
    > のでしょうか?

    SQLEXPRESS は SQL Server Express 版の名前つきインスタ
    ンスのデフォルト名です。

    名前付きインスタンスの使用
    http://msdn.microsoft.com/ja-jp/library/ms165614%28v=sql.90%29.aspx

    SQL Server 2012 Express をインストールする際、デフォ
    ルトでは名前付きインスタンスとなり、インスタンス名が
    SQLEXPRESS となるはずです。

    SQL Server 2012 Express のインストール
    http://awoni.net/fc/2012-express/

    主な違いは TCP/IP での接続の際にポートが静的になるか
    動的になるかです。

    SQL Server 2008 Express にリモート接続
    http://awoni.net/fc/remote/

    上のページに、"リモート接続の場合、Windows 7/Vista では、
    Windows 認証を利用することはできません。" とありますが、
    Active Directory ドメイン環境でドメインアカウントを使用
    すれば Windows 認証は使用できます。

    ワークグループ環境でも、terapemiya さんが紹介された Web
    の記事の設定をすれば Windows 認証が使えるかもしれません
    (未検証ですが)。

    • 回答としてマーク Seven Faces 2013年4月22日 18:21
    2012年10月24日 12:28
  • 返信があまりにも遅くなり、申し訳ありませんでした。
    やっと接続にたどりつくことが出来ました。
    接続できなかった原因は、Windowsに関しての知識が少なすぎていたことでした。
    接続文字列の間違いもあり、プリンターの共有も出来ない状態で操作しようとしていたことなどが絡んでしまい、長いこと原因を特定することが出来ずにいました。
    Windowsの設定を正しくして、やっと接続することが出来ました。
    皆様のご助言をやっと確かめることが出来て、うれしく思っています。
    ありがとうございました。

    なお、接続文字列は、

    "Persist Security Info=False;User ID=" + loginName + ";Password=" + loginPass + ";Initial Catalog=" + databaseName + ";Server=" + serverName + ";";

    で可能になりました。

    2012年12月24日 5:22