none
OracleDataAdapterでDataTableに検索結果を入れる方法はADO.NET?ODP.NET? RRS feed

  • 質問

  • この度はお世話になります。
    この度、Oracleを使用してのシステム開発を行う事になりました。
    ユーザから「ODP.NETを使用して開発して下さい」との指示を受け、
    以下のサイトを読んでいる所なのですが、

    http://otndnld.oracle.co.jp/beginner/odpnet/2_1/index.html

    2段目辺りにある関連イメージ図が気になります。
    (「次に示すのは各クラスの関連イメージ図です。」で始まる文章の直後の図です)

    この図を見ていると、ODP.NET=接続型クラスという事で、
    DataSetに結果を格納して処理する方法はADO.NETだよ。。。という風に
    私には受け取れるのですが、どうなのでしょうか?

    その図の少し後に「非接続型」のサンプルとして、
    =====================================================
    void ReadDataSet()
        {
            string strSQL = "select ename,empno from emp";
            OracleCommand myCmd = new OracleCommand(strSQL, con);
            OracleDataAdapter   myDa   = new OracleDataAdapter(myCmd);
            Console.WriteLine("Read from DataSet:");
            DataSet myDs = new DataSet();
            myDa.Fill(myDs, "emp");
            foreach(DataRow dr in myDs.Tables[0].Rows)
            {
                Console.WriteLine(dr[0]);
         }
    ======================================================
    がありますが、これは「OracleDataAdapter」を使っているので
    「ODP.NETのサンプル」と思って良いですか?

    おそらく上記のような非接続型もODP.NETだと思って良いとは思うのですが、
    どうもイメージ図の記述が気になってしまい、少し不安なのですが・・・。

    皆様の見解を聞かせて頂けると幸いです。
    何卒よろしくお願い致します。

    2013年2月18日 6:12

回答

  • 以下、ご参考までに連携します。

     

    yurubonさんの質問の趣旨を誤って理解してしまっているかもですが、

    ADO.NETであることが、ODP.NETではないという理解なのでしょうか?

     

    以下、ざっとまとめさせていただきます。

    不備不足もあるかと思いますので、改めて調査する際の参考程度にご利用いただければ幸いです。

     

    ODP.NETはADO.NETのインターフェースをベースにしています。

    ODP.NET(データプロバイダ機能)を介して、DBから値を持ってきたデータを、DataSetなど(非接続型クラス)を利用して、DB依存を排除した操作が可能になるというのが、ADO.NETの特徴です。

    (DataSetには、Oracleの他にもSQLServerやExcelのデータとかを格納できます。そして、それぞれ接続する用のデータプロバイダ機能は別に用意されています)

     

    上記のサンプルコードに記載されているのをざっと説明すると以下のようになります。

    void ReadDataSet() {

    string strSQL = "select ename,empno from emp";

    // ODP.NET(データプロバイダ機能)を利用してDB接続を行おうとしている部分。 OracleCommand myCmd = new OracleCommand(strSQL, con); OracleDataAdapter myDa = new OracleDataAdapter(myCmd); Console.WriteLine("Read from DataSet:"); // DBから取得したデータを、仮想DB(DataSet:非接続クラス)に格納して、操作を行っている部分。 DataSet myDs = new DataSet(); myDa.Fill(myDs, "emp"); foreach(DataRow dr in myDs.Tables[0].Rows) { Console.WriteLine(dr[0]); }

    このコードの処理はすべて、ADO.NETのインターフェースで動いています。

    リンク先のサイトで、ADO.NETが分けて書いてあったのは、データプロバイダ部分(ODP.NET)は、Oracleが提供しているものを利用し、それ以外のADO.NET機能(非接続機能)は.Net Frameworkが提供しているADO.NET機能をそのまま利用していますよ、な意味ではないでしょうか?

     

    ODP.NETを利用するように、というお達しと関係あるかどうかは不明ですが、Oracleのデータにアクセスする機能は、Microsoftの提供しているライブラリでも存在しています。(System.Data.OracleClient)

    ただ、Microsoftのポリシーとして、こちらの機能は「車輪の再開発」に当たるため、ODP.NETの利用を推奨しています。

    ※ System.Data.OracleClientはサポート対象外になる予定です。 → Oracle および ADO.NET

     

    (!) 注意するところ

    もし、質問者さんが、ODP.NET(V.10.xx)を利用していて、型付DataSetを利用される場合は、型付DataSetの内部では、System.Data.OracleClientがDB接続機能として利用されているため注意が必要です。

    ODP.NET(V.11.xx)を利用すれば、その問題も解決できます。

    手前味噌で恐縮ですが、私が昔MSDNフォーラムに計上したスレッドのリンクを追記します。

    VisualStudio2010でOracleを利用して型付DataSetクラスを作成した場合の「System.Data.OracleClient.XXXX」は旧形式(古い形式)です警告に関して。

     

    長くなってしまい、恐縮です。

    何かしらの調査のヒントになりますようでしたら、幸いです。

    • 編集済み kyk_nk 2013年2月18日 7:28 修正
    • 回答としてマーク yurubon 2013年2月18日 9:11
    2013年2月18日 7:16

すべての返信

  • 以下、ご参考までに連携します。

     

    yurubonさんの質問の趣旨を誤って理解してしまっているかもですが、

    ADO.NETであることが、ODP.NETではないという理解なのでしょうか?

     

    以下、ざっとまとめさせていただきます。

    不備不足もあるかと思いますので、改めて調査する際の参考程度にご利用いただければ幸いです。

     

    ODP.NETはADO.NETのインターフェースをベースにしています。

    ODP.NET(データプロバイダ機能)を介して、DBから値を持ってきたデータを、DataSetなど(非接続型クラス)を利用して、DB依存を排除した操作が可能になるというのが、ADO.NETの特徴です。

    (DataSetには、Oracleの他にもSQLServerやExcelのデータとかを格納できます。そして、それぞれ接続する用のデータプロバイダ機能は別に用意されています)

     

    上記のサンプルコードに記載されているのをざっと説明すると以下のようになります。

    void ReadDataSet() {

    string strSQL = "select ename,empno from emp";

    // ODP.NET(データプロバイダ機能)を利用してDB接続を行おうとしている部分。 OracleCommand myCmd = new OracleCommand(strSQL, con); OracleDataAdapter myDa = new OracleDataAdapter(myCmd); Console.WriteLine("Read from DataSet:"); // DBから取得したデータを、仮想DB(DataSet:非接続クラス)に格納して、操作を行っている部分。 DataSet myDs = new DataSet(); myDa.Fill(myDs, "emp"); foreach(DataRow dr in myDs.Tables[0].Rows) { Console.WriteLine(dr[0]); }

    このコードの処理はすべて、ADO.NETのインターフェースで動いています。

    リンク先のサイトで、ADO.NETが分けて書いてあったのは、データプロバイダ部分(ODP.NET)は、Oracleが提供しているものを利用し、それ以外のADO.NET機能(非接続機能)は.Net Frameworkが提供しているADO.NET機能をそのまま利用していますよ、な意味ではないでしょうか?

     

    ODP.NETを利用するように、というお達しと関係あるかどうかは不明ですが、Oracleのデータにアクセスする機能は、Microsoftの提供しているライブラリでも存在しています。(System.Data.OracleClient)

    ただ、Microsoftのポリシーとして、こちらの機能は「車輪の再開発」に当たるため、ODP.NETの利用を推奨しています。

    ※ System.Data.OracleClientはサポート対象外になる予定です。 → Oracle および ADO.NET

     

    (!) 注意するところ

    もし、質問者さんが、ODP.NET(V.10.xx)を利用していて、型付DataSetを利用される場合は、型付DataSetの内部では、System.Data.OracleClientがDB接続機能として利用されているため注意が必要です。

    ODP.NET(V.11.xx)を利用すれば、その問題も解決できます。

    手前味噌で恐縮ですが、私が昔MSDNフォーラムに計上したスレッドのリンクを追記します。

    VisualStudio2010でOracleを利用して型付DataSetクラスを作成した場合の「System.Data.OracleClient.XXXX」は旧形式(古い形式)です警告に関して。

     

    長くなってしまい、恐縮です。

    何かしらの調査のヒントになりますようでしたら、幸いです。

    • 編集済み kyk_nk 2013年2月18日 7:28 修正
    • 回答としてマーク yurubon 2013年2月18日 9:11
    2013年2月18日 7:16
  • kyk_nk様

    詳細なご解説、本当に有難うございます。
    ODP.NETはADO.NETのインターフェースをベースにしているという事はわかったのですが、

    例の図のタイトル部(?)に
    「非接続型クラス ADO.NET」「接続型クラス ODP.NET」と書かれていたので
    ODP.NET=接続型でしか使えないって意味にも受け取れるような気がして
    少し不安になってしまって・・・。そうではないとわかり、安心しました。

    ODP.NETのバージョンの確認方法は分からないのですが
    Oracle Database 11g Release 1だと
    「ODP.NET(V.11.xx)」にあたると思って大丈夫でしょうか。

    おそらく型付DataSetも利用する事になると思うので
    とても参考になりました。有難うございました。

    2013年2月18日 9:11
  • yurubonさん

    迅速なご確認、ありがとうございました。

    はい、Oracle Database 11g を利用しているのでしたら、大丈夫です。

    実際ODP.NETで型付DataSetを作成する際の手順は、(再度になってしまいますが、上記のスレッドでも記載した)私が昔MSDNで質問したスレッドのChukiさんの返信などをご参考にしてください。

    ※ その時の私にとって、とてもわかりやすく、ためになる返信でした。

    以上、補足させていただきました。

    • 編集済み kyk_nk 2013年2月19日 1:28 修正
    2013年2月18日 13:09
  • 返信おそくなってしまい申し訳ありません。

    補足説明有難うございました。

    ご紹介いただいたサイトを参考に作業させて頂きます。

    2013年2月20日 8:55