none
複数のデータベースを連携させる場合について RRS feed

  • 質問

  • おはようございます。

    VB2005Express+SQLServerExpressを使用しています。

    現在、一つ質問中なのですが、どうしても質問したいことがありますのでお願いします。

    例えば、人事情報と顧客情報などは管理の性質から異なるので、DB自体を分けたほうが良いように思います。

    しかし、上記の例の場合、顧客の担当者というときに人事情報の職員名や経歴などを参照できると便利な場合が
    あると思います。

    現在、TableAdapterの使用をいろいろと試している最中なのですが、TableAdapterを使用する場合、
    接続先を一つしか選択できないので、1つのDBからしかデータを取得することができません。

    しかし、表示する際などの問題で2つのDBのデータを結合した結果を取得したい場合などは何か対処法が
    あるのでしょうか。

    ヘルプなどを呼んでいるのですが、なかなかそれらしいものにたどり着くことができないので、質問をさせて
    頂きました。

    そもそも、今回のように考えること事態が間違っているのでしょうか。

    どうか、アドバイスお願いします。

     

    2010年5月7日 21:44

回答

  • 適切な権限があれば、他のデータベースのテーブルの値を読むことは可能です。ただし、更新はできません。
    (例)
    select J.ID, K.NAME from 人事情報 as J
                             left outer join hogedb.dbo.顧客情報 as K on J.ID = K.ID


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク 山本春海 2010年5月13日 8:27
    2010年5月7日 23:50
    モデレータ
  • 現状、DataSetを分ければ、一つのアプリケーションで別々のデータベースからデータを取得することが
    可能だったので、別々のDataSetで取得したデータを組み合わせてやろうかなと考えていたところなのですが、
    このようなやり方は通常やらないものなのでしょうか。

    SQLの方で処理できるのであれば、SQLで処理してしまうのが開発工数が少なくなるでしょうし、プログラムによるバグも防ぐことができますから、個人的にはまずSQLで処理することを考えます。SQLは必ずしも一文で行なう必要はなく、複雑な処理の場合にはストアドプロシージャ内で組み立て、必要なデータを得られうようにします。
    もっと言えば、単純なselect文も含め、全てストアドプロシージャ化しても良いと思います。このようにしておけば、もし将来的にWPF、Silverlightなどに移行する際も、そのストアドプロシージャを使うことができます。また、プログラムの中でテーブルのフィールドを直接書くというのは、データベースのテーブルがオブジェクトだと考えれば、テーブルのフィールドをパブリック変数のように直接参照しているというようにも考えられます。
    いずれにしても業務系アプリケーションを開発するプログラマーにとって、SQLを書く技術を高めることは必要なことだと考えています。

    また、適切な権限というのはデータベースに対してログインできるととか、該当するテーブルにアクセスできると
    言う解釈でよろしいでしょうか。

    その通りです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク 山本春海 2010年5月13日 8:27
    2010年5月9日 2:47
    モデレータ

すべての返信

  • 適切な権限があれば、他のデータベースのテーブルの値を読むことは可能です。ただし、更新はできません。
    (例)
    select J.ID, K.NAME from 人事情報 as J
                             left outer join hogedb.dbo.顧客情報 as K on J.ID = K.ID


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク 山本春海 2010年5月13日 8:27
    2010年5月7日 23:50
    モデレータ
  • ご回答ありがとうございます。

    データベース名から指定することで実現が可能なのですね。
    今、テストができる環境が手元にないので、後日テストしてみたいと思います。

    現状、DataSetを分ければ、一つのアプリケーションで別々のデータベースからデータを取得することが
    可能だったので、別々のDataSetで取得したデータを組み合わせてやろうかなと考えていたところなのですが、
    このようなやり方は通常やらないものなのでしょうか。

    また、適切な権限というのはデータベースに対してログインできるととか、該当するテーブルにアクセスできると
    言う解釈でよろしいでしょうか。

    2010年5月8日 18:29
  • 現状、DataSetを分ければ、一つのアプリケーションで別々のデータベースからデータを取得することが
    可能だったので、別々のDataSetで取得したデータを組み合わせてやろうかなと考えていたところなのですが、
    このようなやり方は通常やらないものなのでしょうか。

    SQLの方で処理できるのであれば、SQLで処理してしまうのが開発工数が少なくなるでしょうし、プログラムによるバグも防ぐことができますから、個人的にはまずSQLで処理することを考えます。SQLは必ずしも一文で行なう必要はなく、複雑な処理の場合にはストアドプロシージャ内で組み立て、必要なデータを得られうようにします。
    もっと言えば、単純なselect文も含め、全てストアドプロシージャ化しても良いと思います。このようにしておけば、もし将来的にWPF、Silverlightなどに移行する際も、そのストアドプロシージャを使うことができます。また、プログラムの中でテーブルのフィールドを直接書くというのは、データベースのテーブルがオブジェクトだと考えれば、テーブルのフィールドをパブリック変数のように直接参照しているというようにも考えられます。
    いずれにしても業務系アプリケーションを開発するプログラマーにとって、SQLを書く技術を高めることは必要なことだと考えています。

    また、適切な権限というのはデータベースに対してログインできるととか、該当するテーブルにアクセスできると
    言う解釈でよろしいでしょうか。

    その通りです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク 山本春海 2010年5月13日 8:27
    2010年5月9日 2:47
    モデレータ