• 締切済み

[ADO.NET]接続間の検索について

ADO.NETについて教えて欲しいことがあります。 1つのシステムで、1つのメインのデータベースへ接続するとき、 ADO.NETを使用して接続しています。 これに、サブのシステムで使用している別な接続(ADO.NET)がある、 という場合においてお話します。 メインのデータベース検索において、サブのシステムで使用している テーブルのデータに基づいてJoin(結合)した結果を得たいのですが、 これは可能なのでしょうか? いろいろ接続間の検索について調べていたのですが、これといった情報が無く 途方に暮れていました。 最悪はアプリケーションで、と思いますが、 汎用性を考えるとアプリケーションでの実現は限界がある、 と思いました。 何か、よい方法などございましたら、ご教授お願いします。

みんなの回答

回答No.4

お世話になります。 > どうすれば設定できるのか、なんですが、Primaryキーの話は > 見つかるんですけど、インデックスについての情報がなかなか見つかりません(>_<)。 DataTable メンバを見たのですが、 http://msdn2.microsoft.com/ja-jp/library/system.data.datatable_members.aspx Constraints や PrimaryKey のインターフェースは ありますが、インデックスについては無さそうですね。 全件を DataSet に読み込むのではなく、 ある程度対象を絞ってから DataSet に読み込む方法 がパフォーマンス面での心配が軽減されるかもしれません。

SUPER-NEO
質問者

お礼

アドバイスありがとうございます。 やはりDataSetを、メモリ上の一時データベースとして扱うのは 限界があるようですね。 何故、DataSetに読み込んで使うかと言えば、 WebService経由でデータベース検索を行なうために、 通信回数を限りなく1回に近づけるためなのでした。

回答No.3

お世話になります。 王道だと DataSet で、DataRelation を使って DataSet 内の DataTable 同士の関連をつくってやる 方法になると思われます。 あんまりオススメはしませんが、 Oracle と MySQL のテーブルを ODBC を介してどっちも Access のリンクテーブルとして扱ってしまい、 .NET 側からはその Access しかみないようにする、 という少々乱暴な手段もあるにはあります。

参考URL:
http://msdn2.microsoft.com/ja-jp/library/system.data.datarelation.aspx
SUPER-NEO
質問者

お礼

アドバイスありがとうございます。 やはりアプリケーションでの制御、ということになりそうですね。 クライアントにDB接続のドライバは入れないようにしてます。 ですから、ODBCで云々、というのは今回は意に沿わない、 ということになってしまいます。でも、そういうテクニックがあるんだ、 ということで、アイデアとして受け止めておきます。 DataRelationの方法は、別な質問で教わり技術は理解したんですが、 データ量が多い場合に、どこまでパフォーマンスが出るのか、 というのが今、一番悩んでいるポイントでした。 検索キーになりそうな項目に、インデックスを設定したいのですが、 どうすれば設定できるのか、なんですが、Primaryキーの話は 見つかるんですけど、インデックスについての情報がなかなか見つかりません(>_<)。

回答No.2

Oracleは、使ったことが無いので分かりませんが、 リンクって出来ませんか。 SQLServerで、他のサーバーのリンク SELECT * FROM [他のサーバー名].データベース名.dbo.テーブル名 tbl で、他のサーバーのテーブルのビューを作成 そして、メインのサーバーと結合して結果を得る。 もし、リンク先がTEXTファイルの時(c:\A.txt) SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', 'Data Source="C:\";User Id=Admin;Password=;Extended properties=Text' )... [ a#txt ] テキストファイルでもリンクできますので多分 Oracleでも出来るのでは、

SUPER-NEO
質問者

お礼

回答ありがとうございます。 なるほど、そういうテクニックがあるんですね。 でも、OracleはOracleクライアントがインストールされていないと SQLを発行できません。今、作っているアプリは、IIS経由で実行し、 サーバーにOracleクライアントを置いているんです。 そのサーバーが複数台(大規模ですよね^^;)あるので、 サーバーとサーバーの関係はアプリケーションしか判断できないんです。 そうしたとき、個々に接続することになりますから、 コネクション間でJOINできないものか、と思っていたのでした。 貴重な意見、ありがとうございました。

  • ape5
  • ベストアンサー率57% (85/148)
回答No.1

もしかしたら、ご希望に沿わないかもしれませんが、メインシステムのほうで検索するときに、あらかじめ規則によって命名されたビューを作って、そのビューとサブシステムの方でJoinしてみてはどうでしょうか? メインの方はビューを作って、その結果で選択結果を得るということになります。

SUPER-NEO
質問者

お礼

回答ありがとうございます。 メインシステムとサブシステムとで、DBが異なる場合なんですが、 ビューを作ることはできませんよね? 2種類のADO.NETのオブジェクト(例えばOracleとMySQL)があり、 例えば、MySQLのほうにユーザー情報があって、 Oracleのほうに部署マスタなどの情報がある場合で、 ユーザー情報を画面に出すときなど、マスタの情報を得たいとき なんですが、MySQLのほうのデータにSelect文を発行しますが、 マスタを取得するには、OracleのほうにもSelect文を発行しなければ いけません。ADO.NETの接続間でJoinができ、クエリーを事実上1回で 行なえればいいのですが、そんなことが可能なのか!? と半信半疑で情報を求めていました。

関連するQ&A

  • データーベースの結合について

    はじめまして。 先日異動で新しい職場につき、マイクロソフトアクセスを使用し始めたド初心者です。 早速ですが教えてください。 使用しているアクセスは2000です。 http://okweb.jp/kotaeru.php3?q=246849 ↑にて参考にさせていただきましたが、 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id のようにテーブルを4つ結合したいのです。 現在、2つのテーブルを結合することはできましたが、 3つ以上のテーブルの結合ができずに困っています。 上記のようにやってみると 「構文エラー:演算子がありません」と表示されます。 .ASPという拡張子のものですがそれがいけないのでしょうか? (正式には SQL = "SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id" と、1行で書かないと認識しません SQL = "SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id" とするとエラーになります。 ) 以前、勤めていた方の仕事を引き継いだのですが聞ける人もいないので途方にくれています。 質問自体がおかしいかもしれませんがどうぞ初心者にも理解できる回答をよろしくお願いします。

  • 接続型と非接続型ではどちらが良いか

    お世話になります。 社内で使うシステムを開発しています。 最近、やっと開発ツールをVB6からVB2005へ移行しました。 そこで質問ですが、データベースへの接続で、「接続型」と「非接続型」ではどちらが処理がスムーズなのでしょうか。 環境はクライアントがXP、サーバーはWindows2003Server、データベースはSqlServer2000。 各営業所間はVPNで結ばれています。クライアントの数は30位です。 今まで開発して使用しているシステムはVB6で作られたものなので、システムの起動と同時にデータベースに接続し、終了時に切断する「接続型」です。 せっかくADO.NETに移行するのだから、「非接続型」にしようかと思いますが、WEBを使用するわけでもないので、処理が早い方を使おうと思います。 よろしくお願いいたします。

  • 複数のデータベースを検索したい

    困っている内容ですが、 別々のサーバに構築されたAとBというデータベースがあります。 そのAとBにADOによる接続を行いますが、 AとBのテーブルを結合して情報を取得したいと考えています。 SQL文で言うと、 顧客情報はデータベースAに 顧客詳細はデータベースBに存在するテーブルであり 会員IDはそれぞれのテーブルにある SELECT * FROM 顧客詳細 INNER JOIN 顧客情報 ON 顧客情報.会員ID = 顧客詳細.会員ID のようなことがしたいのです。 テーブルを読み込む場合 '' ADO接続オブジェクト Dim adoCon As ADODB.Connection '' 新しいADOレコードセットオブジェクトを作成する Set rs = New ADODB.Recordset '' 読み取り専用でテーブルを開く rs.Open SQL, adoCon, adOpenForwardOnly, adLockReadOnly と書いていまして、adoConの部分が1つのADO接続オブジェクトしか設定できません。 どうにかして2つのデータベースをまたがって 結合できないものでしょうか? 環境は Win2000 + VB6 + SQLSERVER2000 です。 DB初心者なので、説明がうまくいかないと思いますが、 もしおわかりの方がいましたらよろしくお願いします。

  • MySQLで複数データベースの検索/ソートについて

    お世話になっております。 PHP4.4.1+MySQL4.1.15を使用しております。 複数のデータベースに含まれる複数のテーブルをひとつの大きなテーブルとして検索/ソートする方法はありませんでしょうか? 結合ではなく、全レコードを全て単体として検索/ソートをかけたいのです。 それぞれのデータベースに含まれるテーブルに、共通の項目があり、その共通の項目順にソートしたり、絞込をかけたりしたいのですが、調べてみても、どうしても結合(JOIN)に行き着いてしまいます。 JOINによる結合だと、共通の項目以外のレコードが表示されないので、これでは意味をなしません。 ご教授の程、お願い致します。

    • ベストアンサー
    • MySQL
  • EXCELにADOで接続した際のSQLでエラーが出てしまいます(>o<)

    ExcelのワークシートをDBテーブルとして利用しています。 VBAで、ADOを使用してExcelに接続し、SQLでデータを操作したいのですが、3つのテーブルを結合した検索SQLで、 「クエリ式 XXXX の 構文エラー : 演算子がありません。」 というエラーが出てしまいます。 XXXXには、SQL文のJOINしている部分が表示されます。 3つのテーブルのうち、2つのテーブルの結合までは、エラーはなく、結果を取得できます。 テーブルの結合の数やそれ以外に、何か制限があるのでしょうか? ご存知の方がいましたら、ご回答、よろしくお願いします。m(_ _)m

  • ADO.NET 接続型とは?

    接続型と非接続型の違いがいまいちわかりません。 データ → 新しいデータソースの追加で データベースを関連付けることを接続型と言うのでしょうか? でもこれだと、コードを書いてないからADO.NETを使ってないから、接続型も非接続型のどちらでもないですか?

  • COBOL 2002 でデータベースの接続

    COBOL 2002 for .netを使っています。 COBOLが初心者で、データベースへの接続方法がわかりません。 データベースはSQLServer2000です。 ミドルウエアはODBCでもADO.NETでもかまいません。 まずは、CONNECT文をどのようにして書くのか というところから教えていただけませんでしょうか。

  • テーブル結合について

    SQL Serverで、メイン、サブ1、サブ2、サブ3、サブ4というテーブルがあり、以下のSQLを実行すると、メインにあるすべてのデータ(10列)が抽出されます。 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id しかし、上記のSQL文に追加して、 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id INNER JOIN サブ4 ON メイン.name4=サブ4.id とすると、メイン内の10列のうち、2列しか抽出されません。 サブ4を結合しても、一つ目のSQL文と同じ結果を抽出したかったのですが、どこがおかしいのでしょうか? SQL文がまずいのか、サブ4のテーブル内容のせいなのか、SQL Serverの設定がおかしいのか、さっぱり見当がつきません。 足りない情報がありましたら補足いたしますので、どうぞよろしくお願いします。

  • ADO接続の共有

    ACCESS2007をフロントにしてDBをSQL-Server2005Expressにして開発を 行おうとしています。 できる限りネットワークの負荷を減らそうと、ADO接続/ADOレコードセットと フォーム連結で開発したいのですが、ネットで検索するとADO接続を各画面で 行わなければならないような記述しか見あたりません。  ・検索キーワード:ADO 接続 共有 できれば、ADO接続はプログラム起動時1回で、DBデータを表示する 画面等を開く場合は、起動時に取得した接続を使い回したいのですが、 当該方法が記載されたいるようなURL等をご教示願えないでしょうか?  ・他mdbのテーブルをリンクテーブルとして使用したいため、   AccessProject(.adp)の使用は断念しました。 上記よろしくお願いします。

  • データベース接続について

    いま、C#を勉強しているものです。 とりあえずデータベースに接続するアプリを作りたいのですがよく分かりません。 ADO.NETに対する勉強不足なのですが・・・。 例えば、Accessのテーブル内容をFormのリストボックスに表示するような サンプルを頂けないでしょうか? 宜しくお願い致します。