none
SQL Server にある DB(*.mdf)への接続ができません。 RRS feed

  • 質問

  • お世話になります。

    基本的な知識不足のため、あちこち資料を探して見るのですが、目的に到達しません。
    と言うより根本的な所で何か抜け落ちているのではとも考えています。
    以下、トライした内容に付きまして、不十分な箇所のご指摘、アドバイス等が頂ければと
    思い、投稿させて頂きます。

    C#の【新しいデータソースの追加】で SQL Server にある DB(*.mdf)への接続を試みています。
     ・データ ソース : Microsoft SQL Server データベース ファイル (SqlClient)
     ・データベース ファイル名 : C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\test.mdf
     ・Windows 認証を使用する

    以上の設定で【テスト接続】を行おうとしましたが、次に示すエラーメッセージが表示されます。

    エラーメッセージ :
       SQL Serverへの接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。
       インスタンス名が正しいこと、およびSQL Serverがリモート接続を許可するように構成されていることを確認してください。
       (provider:SQLネットワークインターフェース,error:26-指定されたサーバーまたはインスタンスの位置を特定しているときにエラーが発生しました)

    また、新規DBを作ろうとすると、
      まず、『データベースファイル'C:\・・・・・\test_x.mdf' は存在しません。作成しますか?』と尋ねられるので、
      「はい」と答えると、前項と同じエラーメッセージが表示されます。

    ここに至る前提条件は、次の通りです。
     ・手元のPCに Visual C# 2008 Express Edition、SQL Server 2008 Express Edition がインストールされています。
     ・Management Studio で接続先の【セキュリティー】【ログイン】に Windowsへログオンしたユーザー名があるのを確認しています。
     ・ここで、接続先の【データベース】に DB : test を作り、テーブルに目的のデータをインポートした後、クエリーを使ってその内容がセットされているのも確認しています。

     次に、C# でテストアプリを作成し、そこから【新しいデータソースの追加】を行おうとすると、先に述べたエラーメッセージが表示され、C#のアプリから目的のDBへの接続ができません。

    アプリからDBをアクセスするには【承認】の問題もあるかと思いますが、それ以前の問題としてSQL Serverへの接続【認証】ができない状態です。

    その後、色々と試している途中で SQL サーバーへのログオン認証を確認しようと、Management Studio で接続先の【セキュリティー】【ログイン】にあったアカウント
    (Windows へのアカウントと同じモノで、SQL Server インストールと共に作られていた)を削除してみました。
    しかし、削除した後も、Management Studio にて、先に作ったDBへの接続が可能で、アカウントの効力が及ぶ範囲の認識に大きな間違いを犯しているようにも感じています。

    長くなってしまい、申し訳ありません。
    識者からの ご教授、アドバイスを どうぞ宜しくお願い致します。
    2010年1月8日 3:04

回答

  • > 接続先の【データベース】に DB : test を作り、

    これを行うと、作成された test.mdf は「SQLサーバ上に新しいデータベースを作成し、登録する」という内容になります。
    これに対して、その後に行われている

    > 新しいデータソースの追加

    以下の操作は、「指定したファイルを新しいデータベースとして一時的に登録する」という内容になります。
    しかし、指定されている test.mdf は、最初の操作で test という名前のデータベースとしてSQLサーバ上にすでに登録済みであるため、そのファイルにアクセスすることができません。このため

    サーバーが見つからないかアクセスできません。

    というエラーの「アクセスできません(すでに使用中です)」という結果になっています。

    対応方法としては、

     (A) SQL サーバに接続し test というデータベースを使いたい場合
      (B) SQL サーバを使用して test.mdf というファイルを扱いたい場合

    の2つで異なります。

    (A) の場合、

    Visual Studio からデータソースへ接続する設定を、「ファイル」ではなく「ローカルSQLサーバ」の「testデータベース」にします。この接続方法は、test という名前のデータベースがディスク上でどのように構成されているかに影響されないため、test.mdf が test2.mdf にリネームされても、データベースの登録名が test であれば、常にアクセスできる形態となります。

    (B) の場合、

    Management Studio にて test データベースを選択し、タスクからデタッチを行います。
    これで、誰も test.mdf を使用していない状態になりますので、あらためて「ファイル」として test.mdf を指定したデータソースの接続を作成してみてください。この接続方法は、test.mdf というファイルを SQLServer から扱えるようにするための設定で、ファイル名が変化すると接続できなくなりますがファイルの複製や移動によってデータベースも複製・移動できるということが配布などの簡便さなどの利点になります。

    詳細な違いは、ヘルプファイルや書籍、web 記事などをみて勉強してみてください。
    2010年1月8日 4:03
  • > さらに【新しい接続】ボタンで『接続の追加』が現れ【データソース】の【変更】ボタンを
    > 押すと
    >  Microsoft Accessデータベースファイル
    >  Microsoft SQL Server データベースファイル
    > 
    > 二つの選択肢となります。
    > ここで、『SQL Server』が表示されないと目的が果たせないのでしょうか。

    Visual C# 2008 Express Edition + SQL Server 2008 Express Edition では、少なくともデフ
    ォルトの設定では、データソースの選択肢に「Microsoft SQL Server」はないですね。(設定の変
    更で可能になるかどうかはわかりません。)

    「目的」というのが不明ですが、開発環境で Access と同様に SQL Server DB に接続してデータ
    の抽出や更新をしたいということであれば、「Microsoft SQL Server データベースファイル」が選択
    できれば可能です。そのオプションは、先の述べたユーザーインスタンスを使用するということです
    が。

    「目的」というのが、SQL Server にアタッチされている DB に接続したいということでしたら、ま
    ず「Microsoft SQL Server データベースファイル」でユーザーインスタンスへの接続とデータソー
    スをつくってから、接続文字列を変更するという手段もあります。(もっと簡単で、スマートな方
    法もあるかもしれませんが)

    2010年1月11日 12:44
  • とりあえず、

    1) [ ファイル | 新規作成 | プロジェクト ] から「Windows フォーム アプリケーション」を選択して、新規のアプリケーションを作成

    2) [ プロジェクト | 新しい項目の追加  ] から「サービス ベースのデータベース (データカテゴリ)」を選択して、新規データ接続を作成。データソースの構成ウィザードが表示されるので 完了 を押して空のデータベースを作成する。


    上記の手順で、プロジェクト内に Database1.mdf というファイルが作成され、適切な接続設定がなされた状態になるかと思います。Visual Studio 上から各種デーベースに対する操作をするためには、サーバ エクスプローラが利用できます。ソリューション エクスプローラの上から、Database1.mdf をダブルクリックすると、自動的にサーバ エクスプローラへ Database1.mdf が登録され、接続済になるのではないかと思います。


    とりあえず、ここまで試されてみて、Visual Studio 上からデータベースにアクセスできることが確認できれば、一歩前進できますかね?

    2010年1月12日 9:20
  • > 「SQL Server にアタッチされている DB に接続」と、前項の「SQL Server DB に接続」は
    > 現在の私の知識では同じように思うのですが、両者は異なる意味合いがあるのでしょうか。

    以下の意味で書きました。

    ・SQL Server にアタッチされている DB に接続 = 既定のインスタンスに接続
    ・開発環境で Access と同様に SQL Server DB に接続 = ユーザーインスタンスに接続

    後者は、SqlConnection.Open で自動的に PC にログインしているユーザー専用のインス
    タンスを作り(既定のインスタンスとは別に)、接続文字列で指定した DB を動的にアタッチ
    し、そのユーザーに DB 所有者の特権を与える・・・という感じです。それゆえアタッチとか
    ログインなどの設定をしなくても、Access と同様に SQL Server に接続できるようになりま
    す。

    一方、「既定のインスタンス」は SQL Server が起動された時点から存在するインスタンス
    で、これを利用するには、目的の DB をアタッチし、ログインアカウントを設定し、DB に対す
    るアクセス権の設定などを行う必要があります(事前に、かつ静的に)。

    実際の運用には「既定のインスタンス」を使うようですが、SQL Server 2005/2008 Express
    Edition を利用しての開発環境では「ユーザーインスタンス」を利用するのが便利だと思い
    ます。

    データソースに「Microsoft SQL Server データーベースファイル」を選択し、ウィザードに
    従ってデフォルトで設定を進めていくと「ユーザーインスタンス」を利用する接続になるは
    ずです。.mdf ファイルをデタッチしたとのことですので、それを使って試してみてください。

    K. Takaoka さんが書かれた手順に従って操作しても「ユーザーインスタンス」を利用する
    接続になるはずです。(注:Express Edition では「サーバーエクスプローラ」ではなく
    「データベースエクスプローラ」になります)

    2010年1月12日 13:10
  • 最終的にどうしたいかにもよりけりなのですが、Express 版であることを前提に、データベース ファイルを対象とした接続を維持する前提にすると、

    1) Visual Studio からデータベース ファイルを作成して接続する ( db1.mdf が作成された、とします )

    2) Management Studio からデータベースを作成して、上の db1.mdf をアタッチする

    3) Access からデータをインポート

    4) Management Studio 上で作成したデータベースをデタッチする

    という手順でいけるのではないかと思います。あくまで Management Studio は Access からデータのインポートツールとして利用するだけ、というスタンスです。


    追記

    デタッチすると、データベースは存在しなくなります。(削除されます)
    アタッチするということは、既存のデータファイルを使用してデータベースを新規作成するということです。

    あまりたとえ話を引きずるのは学習上によろしくないのですが、言い方をかえると

    データベースの削除 → 棚と書類ケースを両方捨てる
    デタッチ → 棚だけ捨てる(書類ケースは残る)
    アタッチ → 棚だけ用意する (書類ケースは既にあるものを利用)
    データベースの作成 → 棚と書類ケースを両方用意する

    みたいなかんじですね。
    2010年1月14日 3:41
  • K. Takaoka さんのレスとダブるところがあるかもしれませんが・・・

    > SQL Server 上にDBを作成し、ここに既存の(Access DB)をインポートしました。
    > このDBを覗くアプリを作ってみようと思いました。

    そのあたりの経緯を一番最初に書いておいていただけていたら、もっと解決が早かっ
    たかもしれません。

    > SQL Server 2008 Management Studio Express を持ち出す必要はなく、Visual C#
    > 2008 Express 上で処理可能と言う事ですね。

    Access の .mdb を SQL Server の .mdf に変換するなら Management Studio
    のインポート機能を使わない手はないと思います。

    しかし、Management Studio の出番は、.mdf を作ってデタッチするまでです。そ
    の後は VC# Express から接続設定をすることになります。

    > そうです。 その辺りから、色んな本を読んでも旨く行かなくなってきました。

    「既定のインスタンス」と「ユーザーインスタンス」の違いを理解していただかないと、
    話が通じないと思います。そのあたりは以前のレスに書いたつもりですが、分かり
    にくかったでしょうか? もう一度、よく読んでいただけませんか。

    > やり方としては、次のような方法で宜しいのでしょうか。
    >
    > 1.Windowsアプリ用のプロジェクトを作る
    > 2.【プロジェクト】→【新しい項目の追加】→【サービスベースのデータベース】→【追加】→
    >
    >   【完了】を押して空DBを作成
    > 3.データベース エクスプローラーを使って【新しいテーブルの追加】→テーブルデザイナーで
    >   テーブルを作成

    Access の .mdb ファイルのインポートは済んで、SQL Server の .mdf ファイ
    ルは出来上がっていて、それが一番最初の質問にあった以下のファイルですよ
    ね?

    C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\test.mdf

    で、今はそれがデタッチされている状態と理解していますが、正しいですか?

    その理解が正しければ、すでに必要な .mdf ファイルは存在しているわけです
    ので、上記1~3の操作は不要で、あとは VC# Express を操作して「ユーザ
    ーインスタンス」を利用した接続設定をするだけでよいはずです。

    ウィザードベースで簡単にできるはずです。前のレスでもそうするようお勧めし
    ましたが、試してみましたか?

    2010年1月14日 12:28

すべての返信

  • > 接続先の【データベース】に DB : test を作り、

    これを行うと、作成された test.mdf は「SQLサーバ上に新しいデータベースを作成し、登録する」という内容になります。
    これに対して、その後に行われている

    > 新しいデータソースの追加

    以下の操作は、「指定したファイルを新しいデータベースとして一時的に登録する」という内容になります。
    しかし、指定されている test.mdf は、最初の操作で test という名前のデータベースとしてSQLサーバ上にすでに登録済みであるため、そのファイルにアクセスすることができません。このため

    サーバーが見つからないかアクセスできません。

    というエラーの「アクセスできません(すでに使用中です)」という結果になっています。

    対応方法としては、

     (A) SQL サーバに接続し test というデータベースを使いたい場合
      (B) SQL サーバを使用して test.mdf というファイルを扱いたい場合

    の2つで異なります。

    (A) の場合、

    Visual Studio からデータソースへ接続する設定を、「ファイル」ではなく「ローカルSQLサーバ」の「testデータベース」にします。この接続方法は、test という名前のデータベースがディスク上でどのように構成されているかに影響されないため、test.mdf が test2.mdf にリネームされても、データベースの登録名が test であれば、常にアクセスできる形態となります。

    (B) の場合、

    Management Studio にて test データベースを選択し、タスクからデタッチを行います。
    これで、誰も test.mdf を使用していない状態になりますので、あらためて「ファイル」として test.mdf を指定したデータソースの接続を作成してみてください。この接続方法は、test.mdf というファイルを SQLServer から扱えるようにするための設定で、ファイル名が変化すると接続できなくなりますがファイルの複製や移動によってデータベースも複製・移動できるということが配布などの簡便さなどの利点になります。

    詳細な違いは、ヘルプファイルや書籍、web 記事などをみて勉強してみてください。
    2010年1月8日 4:03
  • K. Takaoka 様、おおつの井上です。

    早速のご回答有り難うございました。

    まず私が行った操作では、このような結果になるのは当然、と言う事のようですね。

    C#上での【新しいデータソースの追加】の意味がSQLサーバ上に新たにDBを登録する
    と言う意味になるのでしょうか。

    類似のケースとして、データソースにAccess データベースファイルを設定した場合、
    データベースファイル名に既存のDBを指定すると、そのDBをC#から扱えるようになり、
    SQLサーバの場合と趣が異なる事に成りますが・・・
    残念ながら、この違いがよく分かりません。

    次に、質問(確認)ですが、ご説明頂いた(A)(B)の違いがハッキリしません。
     (A)SQLサーバに既存のDBに接続し、C#で使用する
     (B)SQLサーバに新たにDBファイルを作ってC#で使用する

    みたいな感じで合ってるのでしょうか。

    この後、(B)の操作を行ってみましたが、デタッチするとManagement Studio にて
    オブジェクトエクスプローラーで該当DBが見えなくなりました。
    しかし、test.mdfファイルそのものは残っているので、データソースの接続・追加を
    行いましたが、先と同様のエラーになりました。

    最後の部分は、先の疑問を解決してからじっくり攻め込む必要有りと思いますので、
    聞き流しておいて下さい。

    まず、入り口の細かな違いをしっかり押さえたいと思いますので、疑問にお答え頂け
    れば幸いです。

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


    2010年1月8日 5:54
  • ユーザーインスタンスを使用する/しないで話が変わってくると思いますが、そのあたりは
    いかがですか?

    管理者以外のユーザーのためのユーザー インスタンス
    http://msdn.microsoft.com/ja-jp/library/ms143684.aspx

    Visual C# 2008 Express Edition の開発環境では、ユーザーインスタンスを使用するよう
    に接続文字列が自動生成されるはずです。

    2010年1月9日 7:32
  • もしかして、接続の追加ウィザードにて、データソースの選択による選択肢も "SQL Server データベース ファイル"  しか選べなかったりするのでしょうか? Professional 以上だと "SQL Server" と "SQL Server データベース ファイル" の2つがあるかと思うのですけど…。

    データソースとして "SQL Server" を選択していると、接続先に「データベース名」と「データベース ファイル」の2つの選択肢が表示され、前者を使うと (A) 後者を使うと (B) となります。これに対して "SQL Server データベース ファイル" の場合、後者のみの機能しかありません。

    -- 以下、雑談

    (A)(B) の違いについては、「データベース」と「データベース ファイル」が異なるものだという認識をもってもらえればわかりやすいかもしれません。test というデータベースに test.mdf という類似した名前のデータファイルを1つだけ設定されていると同じようなものに見えますが、test1 というデータベースに a.mdf と b.mdf と c.mdf の3つデータファイルを割り当てるというようなこともできます。

    データベースファイルをカギ付きの書類ケース、データベースを棚のようなものだと思ってみてください。
    Management Studio で test というデータベースを test.mdf というデータベースファイルを使って作成するということは、データを保存する書類ケースを作成し、それを棚にしまっておいた状態です。

    (A) の場合、書類を利用したいと思った場合には、SQL Server に接続する際に test という棚の名前を伝えて接続します。SQL Server は test という棚に入っている書類ケースが何個あってどんな書類が入っているかにかかわらず、test という棚に入っている書類ケースのカギをあけて利用できる状態にしてくれます。これに対して (B) の場合、棚の手前に散乱している書類ケースを指定して SQL Server にカギをあけて中の書類を使えるようにしてもらうだけ、ということになります。

    最初の私の投稿では、Management Studio の上でデータベースを作成した (A) の状態に対して、 (B) の行為をされようとしているという指摘になります。棚の近辺に書類ケース test.mdf が残っていればよかったのですが、残念ながら test.mdf という書類ケースは既に棚の中に保管されてしまっていたので、SQL Server は書類ケースを勝手に棚から出して使うようなことは許してくれないよ、ということです。(ただし、この指摘が正しかったかどうかは別の話です)

    Management Studio からデタッチするというのは、test という保管棚から書類ケースを取り出して、棚から手元へ書類ケースを移動したということです。逆に、アタッチすることで再び名前のついた棚に保管しなおすこともできます。

    書類ケースを棚にしまっておく利点は色々とあります。たとえば、最初にあったように、1つの棚には複数の書類ケースを入れておくことができます。書類ケースの中には、データとしての書類が保存されていくわけですが、1つの書類ケースにどんどん書類をいれていくと書類ケースはパンパンに膨れ上がっていきます。特定のデータを取り出すということは、書類ケースの中から書類を捜し出すということですので、100枚の書類が1つのケースに入っているよりは、何らかのルールをもって2つのケースに分割して保存していたほうが早くみつかることもあるでしょうし、2つの書類ケースを2人の作業員に同時に探させることだってできます。当然、1つの書類ケースの中に詰め込める書類の量にも限界があるかもしれません。他にも、SQL Server は 2005 以降では Express 版でも別のコンピュータからのアクセスを許可していますが、これもデータベースに限定した…つまり、棚に限定した機能だったりしたと思います。
    逆に、いつでもだれでも持ち出せる書類ケースであれば、簡単に移動したりコピーしたりすることができます。つまり、作成されたアプリケーションとセットにして配ったり、それをすぐに動かしたりすることができるかもしれません。

    2010年1月9日 9:16
  • 皆さん、色々とありがとうございます。

    まず、K. Takaoka 様からのご回答に対して、質問させてください。

    色々と詳しいご説明をくださり、有難うございます。

    この中で仰っているのは、Visual C# の【データ】→【データソースの表示】にある
    【新しいデータソースの追加・・・】から表示される『データソース構成ウイザード』
    と言う認識でよろしいでしょうか?

    ここで、データの取得元に【データベース】を選び【次へ】で『データ接続の選択』が
    表示されます。
    さらに【新しい接続】ボタンで『接続の追加』が現れ【データソース】の【変更】ボタンを
    押すと
     Microsoft Accessデータベースファイル
     Microsoft SQL Server データベースファイル
     
    二つの選択肢となります。
    ここで、『SQL Server』が表示されないと目的が果たせないのでしょうか。

    ちなみに当方の環境は、Visual C#、SQL Server 共に Express Edition ですが、
    そもそも本物を購入しないとダメと言う事なのでしょうか。

    まず、基本的なところから押さえたいと思います。
    お忙しい中、恐縮ですがもう少し、お付き合いをよろしくお願いいたします。

    2010年1月9日 13:11
  • K. Takaoka 様、おおつの井上です。

    -- 以下、雑談 の項、分かり易くご説明くださり、ありがとうございます。
    じっくりと読ませて頂き、SQL Server そのものの概要が見えて参りました。

    >最初の私の投稿では、Management Studio の上でデータベースを作成した (A) の状態に対して、
    >(B) の行為をされようとしているという指摘になります。

    このご指摘は、その通りだと思います。(よく分からないくせに、生意気な言い方で申し訳ありません・・・)

    先に、「もしかして・・・」と書かれているように、

    【データソースの選択による選択肢も "SQL Server データベース ファイル"  しか選べない】状況にあり、
    これが先に進めない原因なのではないでしょうか。

    "SQL Server データベース ファイル"のみで"SQL Server" が見えませんが、何らかの設定が不十分
    と言う事になるのでしょうか。
    チェックする箇所をご教授頂ければ幸いです。

    あと、デタッチ/アタッチの件ですが、先日『デタッチ』を行い、再び『アタッチ』しようとしたら、その棚が何処か
    へ行ってしまったようで、手に負えなくなってしまいました。
    良く理解もしないまま、闇雲に触ってしまったためで、当たり前と言えば当たり前の話ですが・・・
    まぁ、この件は先の問題が解決した後、別途取り組む課題にしたいと思っています。

    まずは、C# から SQL Server のDBへの接続に絞って、挑戦したいと思っています。
    アドバイスの方、どうかよろしくお願いいたします。
    2010年1月9日 15:22
  • > さらに【新しい接続】ボタンで『接続の追加』が現れ【データソース】の【変更】ボタンを
    > 押すと
    >  Microsoft Accessデータベースファイル
    >  Microsoft SQL Server データベースファイル
    > 
    > 二つの選択肢となります。
    > ここで、『SQL Server』が表示されないと目的が果たせないのでしょうか。

    Visual C# 2008 Express Edition + SQL Server 2008 Express Edition では、少なくともデフ
    ォルトの設定では、データソースの選択肢に「Microsoft SQL Server」はないですね。(設定の変
    更で可能になるかどうかはわかりません。)

    「目的」というのが不明ですが、開発環境で Access と同様に SQL Server DB に接続してデータ
    の抽出や更新をしたいということであれば、「Microsoft SQL Server データベースファイル」が選択
    できれば可能です。そのオプションは、先の述べたユーザーインスタンスを使用するということです
    が。

    「目的」というのが、SQL Server にアタッチされている DB に接続したいということでしたら、ま
    ず「Microsoft SQL Server データベースファイル」でユーザーインスタンスへの接続とデータソー
    スをつくってから、接続文字列を変更するという手段もあります。(もっと簡単で、スマートな方
    法もあるかもしれませんが)

    2010年1月11日 12:44
  • 選択肢に "SQL Server" がないのは、Express エディションがそのようになっているだけかな?と思います。
    Express エディションは、入門向けに機能を限定しているところがありますので、おそらくそうしてあるんだと思います。これは、Management Studio を使用してデータベースを意識的に操作する必要を0にして、Visual Studio だけで作業をすべて完結させる狙いもあるかな、と思います。

    とりあえず、プロジェクトの新規作成から手順を書いたほうがいいような気がするんですが、ちょっと手元に Visual Studio のないところからの書き込みなので、とりあえずこれだけ...
    2010年1月11日 13:08
  •  

    SurferOnWww
     さん、おおつの井上です。
    色々と、アドバイス頂き、ありがとうございます。
    Visual C# 2008 Express Edition + SQL Server 2008 Express Edition では、少なくともデフ
    ォルトの設定では、データソースの選択肢に「Microsoft SQL Server」はないですね。(設定の変
    更で可能になるかどうかはわかりません。)
    この件は、K. Takaoka 様もお書きになっていますし、どうもそのようですね。
    会社に上位の Editionがあるようなので、一度そちらで試してみようと思っています。

    少し時間がかかるかも知れませんが、その結果はまたご報告させて頂きます。


    「目的」というのが不明ですが、開発環境で Access と同様に SQL Server DB に接続してデータ
    の抽出や更新をしたいということであれば、「Microsoft SQL Server データベースファイル」が選択
    できれば可能です。そのオプションは、先の述べたユーザーインスタンスを使用するということです
    が。
    SQL Server 上で作成したDBを Access のファイルと同じように扱いたいのです。

    先の投稿で教えて頂いた、
         管理者以外のユーザーのためのユーザー インスタンス
         http://msdn.microsoft.com/ja-jp/library/ms143684.aspx

    を読んでみましたが、悲しいかな当方還暦越えの手習いで、まだ内容を十分理解できていません。
    もう少し、他の資料と突き合わせながら、じっくり挑戦してみたいと思っています。


    「目的」というのが、SQL Server にアタッチされている DB に接続したいということでしたら、ま
    ず「Microsoft SQL Server データベースファイル」でユーザーインスタンスへの接続とデータソー
    スをつくってから、接続文字列を変更するという手段もあります。(もっと簡単で、スマートな方
    法もあるかもしれませんが)
    ここで仰っている「SQL Server にアタッチされている DB に接続」と、前項の「SQL Server DB に接続」は
    現在の私の知識では同じように思うのですが、両者は異なる意味合いがあるのでしょうか。

    攻め所など、アドバイスを頂ければ幸いです。
    どうぞ、よろしくお願いいたします。
    2010年1月11日 23:29
  • K. Takaoka 様、おおつの井上です。

    色々と、ありがとう御座います。

    選択肢に "SQL Server" がない件については、会社に上位の Editionがあるようなので、
    一度そちらで試してみようと思っています。

    また、何かアドバイスがありましたら、どうぞよろしくお願いいたします。
    2010年1月11日 23:37
  • SQL Server を Visual Studio でごりごりするのは DBA 的には非常に違和感があります。
    それはそれとして、
    SQL Server 2008 Management Studio Express もありますよ。
    http://www.microsoft.com/downloads/details.aspx?FamilyID=08e52ac2-1d62-45f6-9a4a-4b76a8564a2b&DisplayLang=ja

    アタッチ/デタッチはかの昔、PASSJ 時代に MS SQL のバイスプレジデントへ河端さんがリクエストして実現してしまった機能なんですよね。。。
    これが元で結構 Visual Developer の方がかなり混乱したことを覚えています。
    SQL Server 2008 Express は動的にアタッチ/デタッチできるのですが、SQL Server 上位のエディションの場合、アタッチはできるけど、動的にデタッチできないことや、SQL Server 2008 Express を使っていると毎回データファイルが上書きされて、困るという問題がいろいろあります。
    ※設定で回避可能ですが。。。

    Visual Studio の上位の場合はできます。
    私は最上位のエディション使っていますので。。。
    ※でも、SQL Server Management Studio で Transact-SQL でごりごり書きますけどね。
    おがわみつぎ@CTC.Supper Engineer/元PASSJ理事/元MVP/隠居の身
    2010年1月12日 0:10
  • とりあえず、

    1) [ ファイル | 新規作成 | プロジェクト ] から「Windows フォーム アプリケーション」を選択して、新規のアプリケーションを作成

    2) [ プロジェクト | 新しい項目の追加  ] から「サービス ベースのデータベース (データカテゴリ)」を選択して、新規データ接続を作成。データソースの構成ウィザードが表示されるので 完了 を押して空のデータベースを作成する。


    上記の手順で、プロジェクト内に Database1.mdf というファイルが作成され、適切な接続設定がなされた状態になるかと思います。Visual Studio 上から各種デーベースに対する操作をするためには、サーバ エクスプローラが利用できます。ソリューション エクスプローラの上から、Database1.mdf をダブルクリックすると、自動的にサーバ エクスプローラへ Database1.mdf が登録され、接続済になるのではないかと思います。


    とりあえず、ここまで試されてみて、Visual Studio 上からデータベースにアクセスできることが確認できれば、一歩前進できますかね?

    2010年1月12日 9:20
  • > SQL Server を Visual Studio でごりごりするのは DBA 的には非常に違和感があります。

    まあ、それはそれじゃないですかね?

    入門的な役割を兼ねた Express エディションとしてどう見せるかですよね。そういう意味では、上位にはきちんと Development Edition や Database Edition もあったりして、Database Edition としては DBA が Visual Studio から SQL Server をごりごりするのを想定して開発されているんじゃないですかね。

    学習方針として、バックグラウンドを隠されて学習するのと、きちんと教えておいてから制限された環境で学習させるのと、どちらが良いとかってのもトレーニング方針のテーマとしてよくあがりますけど、それをこの場で語ってもしかたがないですよね。

    > SQL Server 2008 Management Studio Express もありますよ。

    話の流れから、おそらく Express エディションの無印ではなく、with Tools/Advanced を利用されているのでインストール済みだと思います。それとは逆で、問題になっているのは、Visual Studio 2008 Express のデータ接続が、SQL Server への接続の作成をサポートしていないことであって、Management Studio がそもそもインストールされていなければこんな問題は発生しなかったんだろうと予測します(苦笑)

    そういう意味では、SQL Server 2008 Express に Management Studio が付属していないのは正解ですね^^
    2010年1月12日 9:31
  • > 「SQL Server にアタッチされている DB に接続」と、前項の「SQL Server DB に接続」は
    > 現在の私の知識では同じように思うのですが、両者は異なる意味合いがあるのでしょうか。

    以下の意味で書きました。

    ・SQL Server にアタッチされている DB に接続 = 既定のインスタンスに接続
    ・開発環境で Access と同様に SQL Server DB に接続 = ユーザーインスタンスに接続

    後者は、SqlConnection.Open で自動的に PC にログインしているユーザー専用のインス
    タンスを作り(既定のインスタンスとは別に)、接続文字列で指定した DB を動的にアタッチ
    し、そのユーザーに DB 所有者の特権を与える・・・という感じです。それゆえアタッチとか
    ログインなどの設定をしなくても、Access と同様に SQL Server に接続できるようになりま
    す。

    一方、「既定のインスタンス」は SQL Server が起動された時点から存在するインスタンス
    で、これを利用するには、目的の DB をアタッチし、ログインアカウントを設定し、DB に対す
    るアクセス権の設定などを行う必要があります(事前に、かつ静的に)。

    実際の運用には「既定のインスタンス」を使うようですが、SQL Server 2005/2008 Express
    Edition を利用しての開発環境では「ユーザーインスタンス」を利用するのが便利だと思い
    ます。

    データソースに「Microsoft SQL Server データーベースファイル」を選択し、ウィザードに
    従ってデフォルトで設定を進めていくと「ユーザーインスタンス」を利用する接続になるは
    ずです。.mdf ファイルをデタッチしたとのことですので、それを使って試してみてください。

    K. Takaoka さんが書かれた手順に従って操作しても「ユーザーインスタンス」を利用する
    接続になるはずです。(注:Express Edition では「サーバーエクスプローラ」ではなく
    「データベースエクスプローラ」になります)

    2010年1月12日 13:10
  • おがわみつぎ さん、色々とありがとうございます。

    早速ですが、当方 SQL Server 2008 Management Studio Express をインストールして使ってる積もりなのですが・・・
    アタッチ/デタッチ等の難しい話は、まだまだ十分理解できていませんが・・・

    help のバージョンから 【Microsoft SQL Server Management Studio      10.0.2531.0】 って表示されるので
    大丈夫ですよね。

    T-SQL でとの事ですが、大したことをやろうと思っている訳ではなく DBのレコードをチョット覗いてみる Windows アプリを
    作りたいと思っています。

    また、色々とご教授の程、宜しくお願い致します。
    2010年1月13日 4:26
  • > 当方 SQL Server 2008 Management Studio Express をインストールして使ってる積もりな
    > のですが・・・

    どのように使っているのですか?

    Visual C# 2008 Express Edition + SQL Server 2008 Express Edition を使っての開発環境
    では必要ないはずです。

    SQL Server 2008 Management Studio Express でデータベースを作って、それに Visual C#
    2008 Express Edition から接続しようとするからうまくいかないように見えます。

    Visual C# 2008 Express Edition だけを操作して、SQL Server データーベースを作って「DBの
    レコードをチョット覗いてみる Windows アプリを作りたい」という目的は十分果たせます。

    SQL Server 2008 Management Studio Express の使用はしばらく忘れませんか?

    2010年1月13日 13:18
  • お世話になります。

    > どのように使っているのですか?

    SQL Server 上にDBを作成し、ここに既存の(Access DB)をインポートしました。
    このDBを覗くアプリを作ってみようと思いました。


    > Visual C# 2008 Express Edition + SQL Server 2008 Express Edition を使っての開発環境
    > では必要ないはずです。

    SQL Server 2008 Management Studio Express を持ち出す必要はなく、Visual C# 2008 Express
    上で処理可能と言う事ですね。


    > SQL Server 2008 Management Studio Express でデータベースを作って、それに Visual C#
    > 2008 Express Edition から接続しようとするからうまくいかないように見えます。

    そうです。 その辺りから、色んな本を読んでも旨く行かなくなってきました。


    > Visual C# 2008 Express Edition だけを操作して、SQL Server データーベースを作って「DBの
    > レコードをチョット覗いてみる Windows アプリを作りたい」という目的は十分果たせます。

    やり方としては、次のような方法で宜しいのでしょうか。

    1.Windowsアプリ用のプロジェクトを作る
    2.【プロジェクト】→【新しい項目の追加】→【サービスベースのデータベース】→【追加】→
      【完了】を押して空DBを作成
    3.データベース エクスプローラーを使って【新しいテーブルの追加】→テーブルデザイナーで
      テーブルを作成

    と言う感でしょうか。

    これで【OK】だとすると、
    この後、次のような理由で SQL Server 2008 Management Studio Express に走ってしまいました。

    先にも書きましたが、ここで作ったDBに既存の Access DBをインポートする方法が見つかりません
    でした。
    色々調べるうちに、SQL Server 2008 Management Studio Express を使って DBが作成でき、更に
    ここへ Access DBをインポートできたので、それじゃぁ、SQL Server 上の DBに Visual C#から
    接続しようと考えたわけです。

    全体像が良く分からないまま、どんどん突っ走ったきらいがあり、反省しきりですが・・・


    > SQL Server 2008 Management Studio Express の使用はしばらく忘れませんか?

    はい、既存のDBを旨くインポートできれば、第一段階として一応初期の目的は達成できます。

    このように書きますと、「そもそも Visual C# から Access DBを扱う事できるのに、どうして
    そんな事を考えるのか?」と仰るかも知れませんが、SQL Server の使い方をマスターするための
    第一歩と考えての事です。 それぞれの手法でできる事/できない事を見極めるたいと言う希望も
    持っています。
    先日、K.Takaoka さんが、『--以下、雑談』で書いてくださった、『書類ケース』と『棚』の関係
    についても是非マスターしたいと欲張っています。
    (実践第一であちこち手を付けてしまい、アプローチの方法を間違ったかも・・・)

    色々と皆様からアドバイスを頂けて有り難いです。
    どうぞよろしくお願いします。


    P.S.
    他にも色々とお教え頂いており、ありがとう御座います。
    順番に確かめながら勉強させて頂こうと思っていますので、引き続き関連の投稿にアドバイスを
    頂ければ幸いです。

    2010年1月13日 15:53
  • 最終的にどうしたいかにもよりけりなのですが、Express 版であることを前提に、データベース ファイルを対象とした接続を維持する前提にすると、

    1) Visual Studio からデータベース ファイルを作成して接続する ( db1.mdf が作成された、とします )

    2) Management Studio からデータベースを作成して、上の db1.mdf をアタッチする

    3) Access からデータをインポート

    4) Management Studio 上で作成したデータベースをデタッチする

    という手順でいけるのではないかと思います。あくまで Management Studio は Access からデータのインポートツールとして利用するだけ、というスタンスです。


    追記

    デタッチすると、データベースは存在しなくなります。(削除されます)
    アタッチするということは、既存のデータファイルを使用してデータベースを新規作成するということです。

    あまりたとえ話を引きずるのは学習上によろしくないのですが、言い方をかえると

    データベースの削除 → 棚と書類ケースを両方捨てる
    デタッチ → 棚だけ捨てる(書類ケースは残る)
    アタッチ → 棚だけ用意する (書類ケースは既にあるものを利用)
    データベースの作成 → 棚と書類ケースを両方用意する

    みたいなかんじですね。
    2010年1月14日 3:41
  • K. Takaoka さんのレスとダブるところがあるかもしれませんが・・・

    > SQL Server 上にDBを作成し、ここに既存の(Access DB)をインポートしました。
    > このDBを覗くアプリを作ってみようと思いました。

    そのあたりの経緯を一番最初に書いておいていただけていたら、もっと解決が早かっ
    たかもしれません。

    > SQL Server 2008 Management Studio Express を持ち出す必要はなく、Visual C#
    > 2008 Express 上で処理可能と言う事ですね。

    Access の .mdb を SQL Server の .mdf に変換するなら Management Studio
    のインポート機能を使わない手はないと思います。

    しかし、Management Studio の出番は、.mdf を作ってデタッチするまでです。そ
    の後は VC# Express から接続設定をすることになります。

    > そうです。 その辺りから、色んな本を読んでも旨く行かなくなってきました。

    「既定のインスタンス」と「ユーザーインスタンス」の違いを理解していただかないと、
    話が通じないと思います。そのあたりは以前のレスに書いたつもりですが、分かり
    にくかったでしょうか? もう一度、よく読んでいただけませんか。

    > やり方としては、次のような方法で宜しいのでしょうか。
    >
    > 1.Windowsアプリ用のプロジェクトを作る
    > 2.【プロジェクト】→【新しい項目の追加】→【サービスベースのデータベース】→【追加】→
    >
    >   【完了】を押して空DBを作成
    > 3.データベース エクスプローラーを使って【新しいテーブルの追加】→テーブルデザイナーで
    >   テーブルを作成

    Access の .mdb ファイルのインポートは済んで、SQL Server の .mdf ファイ
    ルは出来上がっていて、それが一番最初の質問にあった以下のファイルですよ
    ね?

    C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\test.mdf

    で、今はそれがデタッチされている状態と理解していますが、正しいですか?

    その理解が正しければ、すでに必要な .mdf ファイルは存在しているわけです
    ので、上記1~3の操作は不要で、あとは VC# Express を操作して「ユーザ
    ーインスタンス」を利用した接続設定をするだけでよいはずです。

    ウィザードベースで簡単にできるはずです。前のレスでもそうするようお勧めし
    ましたが、試してみましたか?

    2010年1月14日 12:28
  • K.Takaoka さん、お世話になっています。
    即答頂いているのに、遅くなってしまい申し訳ありません。

    SurferOnWww さんも書かれているように、先にデタッチしたデータが有るはずなのですが、色々と試しているうちに沢山の
    テストファイルが出来てしまい、各ファイルの状態を正しく把握できなくなってしまっています。

    と言う事で、改めてお教え頂いた手順で、最初からやり直してみました。
    所が、旨く手順通り進まなく疑問が生じていますので、改めて確認させてください。

    > 1) Visual Studio からデータベース ファイルを作成して接続する ( db1.mdf が作成された、とします )

    新しいプロジェクトを作成し、【プロジェクト】→【新しい項目の追加】→【サービスベースのデータベース】→【追加】→【完了】を
    押して空DBを作成しました。


    > 2) Management Studio からデータベースを作成して、上の db1.mdf をアタッチする

    ここで、Management Studio を開いて【データベース】を右クリック【新しいデータベース・・】でDBを作りました。
    システムデータベースと同列に作成されました。(これが、棚に相当すると認識してよろしいね)
    ここへ『先のdb1.mdfをアタッチする』と言う事だと思うんですが、作成したDBを右クリックしても【タスク】→【デタッチ】
    しか見つかりません。
    一つ上位の【データベース】には右クリックで【アタッチ】が有るのですが・・・。

    折角、教えて頂いているのに、どうも私の認識にズレが生じているようです。

    ちなみに、【データベース】には右クリックで【アタッチ】があるので、先にVisual Studio から作成したDBファイルを指定
    してみたら、システムデータベースと同列に指定したファイルのフルパスでデータベースが作成されました。
    しかし、これでは 2)で仰ってる手順にはならず頭を捻っています。

    こんな状態で、まだ Access からデータをインポートするには到達できていません。

    あと、『たとえ話を引きずるのは学習上によろしくない』との事ですが、『たとえ話』はとても概要を掴みやすく、
    大変ありがたく思っています。

    ----------------------------

    SurferOnWww さんにも、お世話になっています。

    全体像を掴めないままの質問・投稿で、質問のポイントを的確にまとめられず、色々とお手数をおかけしています。

    要するに、Management Studioを使って目的のDBを作った後は、即 デタッチしてVC# Express から接続設定を
    行えば『OK』と言う事なのですね。

    先にも書きましたが、色々教えて頂いた事柄を頭に入れて、もう一度最初から試してみたいと思っています。


    > 「既定のインスタンス」と「ユーザーインスタンス」の違いを理解していただかないと、
    > 話が通じないと思います。そのあたりは以前のレスに書いたつもりですが、分かり
    > にくかったでしょうか? もう一度、よく読んでいただけませんか。

    この「既定のインスタンス」と「ユーザーインスタンス」に付いては、まだまだ理解が不十分なため更に勉強を続けます。
    折角、頂いているレスを十分生かし切れず心苦しいのですが、これからもよろしくお願いいたします。

    2010年1月16日 12:41
  • K.Takaoka さん、SurferOnWww さん、色々とありがとうございました。
    その後の、ご報告ができないまま長い時間が過ぎてしまい、申し訳ありませんでした。

    その間、お教え頂いた事柄を何度も読み返しながら、実際の動きを確かめて見ました。
    教えて頂いた当初は、そこに使われている言葉の意味もよく分からない事が有ったのですが、
    色々な方面からご説明くださった事柄の相互関係が次第に見えてきました。

    まだ、完全に理解できている訳では有りませんが、ある程度データベース・ファイルを扱う事が
    可能となり、さらに理解を深めるために色んな事を試してみる事ができるようになりました。

    お教え頂いたた事柄を糧に、もう一歩踏み込んで勉強を続けたいと思っています。
    また、行き詰まった時には皆様のお教えを請うため投稿させて頂く事になるかと思いますが、
    その節には、どうぞ宜しくお願いいたします。

    と言う事で、このスレッドは、一旦クローズさせて頂きます。
    皆様、どうもありがとうございました。
    2010年1月30日 12:21