データベースプロバイダの非依存性
Microsoftは、プロバイダパターンを利用してさまざまなバックエンドエンジン間を切り替える機能をテーブルアダプタロジックに追加していません。プロバイダパターンは、抽象ファクトリパターンを中心とする組み合わせであり、アプリケーションを再コンパイルせずにバックエンドを切り替える機能を効率的に実現します。このパターンは、DotNetNuke、ASP.NET、およびその他のいくつかのMicrosoftテクノロジで使用できますが、生成されたテーブルアダプタには対応していません。しかし私は、データベースに依存しないアプリケーションを開発するという目的を達成するために、これを実現するストラテジを追求し続けてきました。
まず最初は、接続文字列を別のソースに変更して、データセットの再生成を試みました。データセットジェネレータは古いADO接続型を使おうとするので、これはうまくいきませんでした。しかし、別のデータベースへの接続を作成し、データセットジェネレータの内部で、各テーブルがポイントする接続を変更すれば、テーブルを再生成できます。
引き続きNorthwindsの例を使って説明を続けます。このサンプルデータベースは、MS Access、FoxPro、およびSQL Serverで提供されています。この手順を紹介するために、本稿のサンプルアプリケーションを、AccessデータベースとSQL Serverデータベースで動作するように変換します。最初からSQL Server接続にOLEDBプロバイダを使用していれば、それほど複雑な話ではないのですが、このデモンストレーションでは、Accessデータベースに対してはOLEDBプロバイダを使用し、SQL Serverに対しては引き続きSQLClientプロバイダを使用します。
本稿のサンプルアプリケーションは、現在、SQL Server接続で動作するように構成されています。これをAccess接続に変更する前に、元の状態を簡単に復元できるように、現在の構成を保存しておきましょう。データセットを開き、デザイナコードファイルを開きます(データセットの下のサブファイルを表示するには、ソリューションエクスプローラの上部にある[Show All Files]をオンにする必要がある場合があります)。デザイナファイルには、Partial Public Class OrdersDataSetおよびNamespace OrdersDataSetTableAdaptersという2つの主要なセクションがあります。クラスを修飾する属性が数行にわたって指定されていますが、余白内のマイナス記号をクリックしてセクションを折りたたむと、2つのセクションが表示されます。

テーブルアダプタのセクションを強調表示して[Ctrl]+[C]キーを押すと、セクション全体がコピーされます。プロジェクト内に新しいClassモジュールを作成し、「OrdersDataSetTableAdapters.SQL」という名前を指定し、コピーしたコードを貼り付けます。もちろん、重複するためこのままではエラーになりますが、末尾に「.SQL」を付けて名前空間を変更すれば、問題なくコンパイルできます。
次に、データセットデザイナのOrdersデータセットに戻り、「Orders」テーブルを右クリックし、[Configure...]を選択します。ウィザードの3ページ目が表示されますが、[Previous]ボタンを2回クリックして、接続を定義する先頭ページに戻ります。Accessデータベースの接続を選択するか、[New Connection]ボタンをクリックして新しい接続を作成します。ここで追加する接続は、プロジェクト設定と「App.Config」ファイルに記録されます。
接続文字列を変更したら、操作を続けて、構成ウィザードを終了します。テーブルアダプタがAccessデータベースをポイントするように変更されます。
データセット内のテーブルごとにこの手順を続けると、アプリケーションが、SQL ServerデータベースではなくAccessデータベースを使用するように変換されます。アプリケーションを実行すると、Accessデータが表示されます。疑うなら、情報の一部を変更して、AccessテーブルとSQL Serverテーブルのどこが変更されたかを確認してみてください。
次に、デザイナファイルからテーブルアダプタのセクションを取得し、「OrderDataSetTableAdapters.Jet」という名前の新たなClassモジュールを作成し、コードを貼り付けます。今回は、末尾に「.Jet」を付けて名前空間を変更します。
Developersパーシャルクラスファイルの先頭にあるImports文の名前空間の拡張子を変更するだけで、AccessとSQL Serverを相互に切り替えることができます。「.Jet」を追加すると、テーブルアダプタが、Accessとの接続用のコードをポイントします。
Imports ta = NorthwindDataSetTableAdapters.Jet Partial Public Class NorthwindDataSet Private taOrders As New ta.OrdersTableAdapter Private taOrderDetail As New ta.Order_DetailsTableAdapter ...
これは、正しい方向に向けた大きな一歩ではありますが、拡張子の変更後にプロジェクトをビルドしなければならないため、最終的なソリューションではありません。本当のプロバイダパターンならば、「App.Config」ファイル内のパラメータを変えるだけで変更が可能であり、再コンパイルの必要はありません。私は引き続きこの問題に取り組み、今後の記事の中でソリューションを紹介したいと考えています。よいアイディアがあれば、ぜひお知らせください。
まとめ
Visual Studio 2005では、データアプリケーションの開発が驚くほど容易になりました。最終的には実際のリリースバージョンを使っていますが、ここでの開発はすべて、ベータ版で行われています。特筆すべき変更の1つは、デザイナコード内の各クラスに追加された新しい属性です。テーブルアダプタの処理に関する問題の1つとして、これらがどの基本クラスからも継承されず、インターフェイスも実装しないため、オブジェクト指向の手法を適用しにくいことが挙げられます。属性が導入されたことで、CodeDomとリフレクションを使って、操作に必要なリンクが提供されるはずです。何が起きているかについては、今後の記事で明らかにしていきます。

