- 締切済み
[ADO.NET]接続間の検索について
ADO.NETについて教えて欲しいことがあります。 1つのシステムで、1つのメインのデータベースへ接続するとき、 ADO.NETを使用して接続しています。 これに、サブのシステムで使用している別な接続(ADO.NET)がある、 という場合においてお話します。 メインのデータベース検索において、サブのシステムで使用している テーブルのデータに基づいてJoin(結合)した結果を得たいのですが、 これは可能なのでしょうか? いろいろ接続間の検索について調べていたのですが、これといった情報が無く 途方に暮れていました。 最悪はアプリケーションで、と思いますが、 汎用性を考えるとアプリケーションでの実現は限界がある、 と思いました。 何か、よい方法などございましたら、ご教授お願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- naganaga_001
- ベストアンサー率71% (172/242)
お世話になります。 > どうすれば設定できるのか、なんですが、Primaryキーの話は > 見つかるんですけど、インデックスについての情報がなかなか見つかりません(>_<)。 DataTable メンバを見たのですが、 http://msdn2.microsoft.com/ja-jp/library/system.data.datatable_members.aspx Constraints や PrimaryKey のインターフェースは ありますが、インデックスについては無さそうですね。 全件を DataSet に読み込むのではなく、 ある程度対象を絞ってから DataSet に読み込む方法 がパフォーマンス面での心配が軽減されるかもしれません。
- naganaga_001
- ベストアンサー率71% (172/242)
お世話になります。 王道だと DataSet で、DataRelation を使って DataSet 内の DataTable 同士の関連をつくってやる 方法になると思われます。 あんまりオススメはしませんが、 Oracle と MySQL のテーブルを ODBC を介してどっちも Access のリンクテーブルとして扱ってしまい、 .NET 側からはその Access しかみないようにする、 という少々乱暴な手段もあるにはあります。
お礼
アドバイスありがとうございます。 やはりアプリケーションでの制御、ということになりそうですね。 クライアントにDB接続のドライバは入れないようにしてます。 ですから、ODBCで云々、というのは今回は意に沿わない、 ということになってしまいます。でも、そういうテクニックがあるんだ、 ということで、アイデアとして受け止めておきます。 DataRelationの方法は、別な質問で教わり技術は理解したんですが、 データ量が多い場合に、どこまでパフォーマンスが出るのか、 というのが今、一番悩んでいるポイントでした。 検索キーになりそうな項目に、インデックスを設定したいのですが、 どうすれば設定できるのか、なんですが、Primaryキーの話は 見つかるんですけど、インデックスについての情報がなかなか見つかりません(>_<)。
- chibita_papa
- ベストアンサー率60% (127/209)
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でも出来るのでは、
お礼
回答ありがとうございます。 なるほど、そういうテクニックがあるんですね。 でも、OracleはOracleクライアントがインストールされていないと SQLを発行できません。今、作っているアプリは、IIS経由で実行し、 サーバーにOracleクライアントを置いているんです。 そのサーバーが複数台(大規模ですよね^^;)あるので、 サーバーとサーバーの関係はアプリケーションしか判断できないんです。 そうしたとき、個々に接続することになりますから、 コネクション間でJOINできないものか、と思っていたのでした。 貴重な意見、ありがとうございました。
- ape5
- ベストアンサー率57% (85/148)
もしかしたら、ご希望に沿わないかもしれませんが、メインシステムのほうで検索するときに、あらかじめ規則によって命名されたビューを作って、そのビューとサブシステムの方でJoinしてみてはどうでしょうか? メインの方はビューを作って、その結果で選択結果を得るということになります。
お礼
回答ありがとうございます。 メインシステムとサブシステムとで、DBが異なる場合なんですが、 ビューを作ることはできませんよね? 2種類のADO.NETのオブジェクト(例えばOracleとMySQL)があり、 例えば、MySQLのほうにユーザー情報があって、 Oracleのほうに部署マスタなどの情報がある場合で、 ユーザー情報を画面に出すときなど、マスタの情報を得たいとき なんですが、MySQLのほうのデータにSelect文を発行しますが、 マスタを取得するには、OracleのほうにもSelect文を発行しなければ いけません。ADO.NETの接続間でJoinができ、クエリーを事実上1回で 行なえればいいのですが、そんなことが可能なのか!? と半信半疑で情報を求めていました。
お礼
アドバイスありがとうございます。 やはりDataSetを、メモリ上の一時データベースとして扱うのは 限界があるようですね。 何故、DataSetに読み込んで使うかと言えば、 WebService経由でデータベース検索を行なうために、 通信回数を限りなく1回に近づけるためなのでした。