System.Dataの階層化

初めて.NETのデータベース関連のクラスを見たときから、System.Data以下の作りに疑問を感じていました。例えば、OleDbConnectionはOLE DB用の接続クラスですが、

  • System.Object
    • System.MarshalByRefObject
      • System.ComponentModel.Component
        • System.Data.OleDb.OleDbConnection

このように、親クラスはComponentです。しかし、データベース関連はこの他にもSqlClientやらOracleClient、Odbcなどあり、これらは皆ほとんど同じメソッドを持っています。何故共通クラスがいないのが不思議で仕方がありません。インタフェースがあるので、ちょっとハズした記述でした。(特定のデータベースに依存し易い設計なので嫌だと言いたかったんですが、この書き方じゃ駄目だ。(^^;) まぁ、MSも色々考えてのことなんだろーなぁ、と色々理由を考えて無理矢理納得していたのですが、.NET2.0ではあっちゃり共通クラスが用意されました。(^^;

  • System.Object
    • System.MarshalByRefObject
      • System.ComponentModel.Component
        • System.Data.Common.DbConnection
          • System.Data.ProviderBase.DbConnectionBase
            • System.Data.OleDb.OleDbConnection

うーん、基本的には良くなったんだけど、リファクタリングが追加されてクラスの差し替えがやりやすくなったのに何故このタイミングで?.NET1.1の時にやってよ〜(^^;

まぁ、データベース毎にSQLの関数やらエラーコードやらが違うので、簡単には差し替えが出来ないのですけどね。ウチのアプリも昔はOracleとInformixの両方で動くようにANSI準拠なSQLだけでやってましたが、今じゃInformixのことなんか何も考えてません。(^^;