none
ADODB.Connectionはインターフェイス? RRS feed

  • 質問

  • お世話になっております。
    C#で特定のDBに接続するクラスを作ろうとADODB.Connection(以下ADO.Conn)を継承しようとしましたが、Visual StudioのインテリセンスではADO.Connはインターフェイスと表示され、また各メンバの実装をしなくてはなりません。
    しかしADO.Connはhttp://msdn.microsoft.com/ja-jp/library/cc364251.aspx でオブジェクトとして説明があるように
    var dbCon = new ADODB.Connection();
    のようにオブジェクトととしてインスタンスを生成してdbCon.Open()やdbCon.Closeなどの各メンバを使用できます。
    なぜADO.Connはインターフェイスとして扱われつつ、オブジェクトとして利用することができるのでしょうか?(Excel.Applicationなども同様です)

    2012年9月21日 2:22

回答

すべての返信

  • ADO(ADO.netではない)は.NETが登場する以前から使われているCOMコンポーネントです。
    .NET Frameworkで提供されているadodbはこのCOMコンポーネントに対するラッパーですので実体は持っていません。

    >> なぜADO.Connはインターフェイスとして扱われつつ、オブジェクトとして利用することができるのでしょうか?(Excel.Applicationなども同様です)

    これらのアセンブリはプライマリ相互運用アセンブリ(PIA:Primary Interop Assembly)という仕組みで提供されているからです。
    PIAについては下記リンクを参照して下さい(私も詳しい仕組みまでは理解していないもので・・・)。
    http://msdn.microsoft.com/ja-jp/library/aa302338.aspx


    • 編集済み みっと 2012年9月21日 2:46
    2012年9月21日 2:45
  • 直接的には、ComImport属性およびCoClass属性がついているinterfaceについて、コンパイラが特別扱いしてnewを受け入れています。

    // 言語仕様に含まれていたかどうかは記憶にありませんが。

    あと、本来の目的(「特定のDBに接続するクラスを作ろう」)は、継承で実現するものではないでしょうね。


    • 編集済み Hongliang 2012年9月21日 3:35
    2012年9月21日 3:33
  • ずいぶん古い記事になりますが、

    http://msdn.microsoft.com/ja-jp/library/aa288434(v=vs.71).aspx

    のあたりの、

    http://msdn.microsoft.com/ja-jp/library/aa288455(v=vs.71).aspx

    ぐらいが参考になるのではないでしょうか。Hongliang さんが既に書かれていますが、インターフェースに COM のコクラスを関連付けることで、new 構文で COM オブジェクトを生成できる仕組みが提供されています。

    元の投稿に書かれている ADODB Connection オブジェクトの説明は、COM コンポーネントのリファレンスであって、.NET のクラスライブラリのリファレンスではありません。

    • 回答としてマーク gaudi08 2012年9月23日 12:53
    2012年9月21日 12:46
  • みっと様、Hongliang様、K.Takaoka様
    ご返信ありがとうございました。
    「インターフェースに COM のコクラスを関連付けることで、new 構文で COM オブジェクトを生成できる仕組みが提供されている」というご説明を額面通り受け取りましたが、正直まだ良くわかっておりません。教えていただいたリファレンスを元に徐々に理解していきたいと思います。

    追記
    ちなみに当初ADO.Connを継承したサブクラスを作りたいというのは回避してADO.Conのフィールドと特定のデータベースに接続するための接続文字列の定数を持つSomeDBというクラスをつくり、SomeDB.Open(), SomeDB.Close()などのメソッドでそのDBへの接続、切断をすることにしました。当初考えていたクラスと殆ど変わらないのですが、Connectionオブジェクトを扱うときにSomeDB.Connectionのようにオブジェクトにフィールドを団子のようにくっつけて扱うのがちょっとやだなとおもってたのとインターフェイスとCOMの関係について疑問に思ったので質問させていただきました。ありがとうございます。


    • 編集済み gaudi08 2012年9月23日 12:51
    2012年9月23日 12:48