特集

Visual Basic 2005へ移行する理由(後編)

VB6開発者が待ち望んだVB2005の便利機能

om (takanao)(Microsoft MVP Oct 2005 - Oct 2006 Visual C#)
2006/01/31
Page1 Page2

 前編では主にVisual Basic 2005(以下VB2005)の統合開発環境の新機能について、中編では言語仕様やクラス・ライブラリの新機能などについて紹介した。本特集最後の今回は、新しくなったADO.NETのデータ・アクセス機能や強化されたデプロイメント機能、VB6開発者にとっては最も気になる移行ウィザードの進化などについてまとめる。

 本稿では、章の見出しの末尾に以下のようなマークを付けてVB6からの変化の具合を示している。

    ……VB6開発者が移行しやすくなっている部分
    ……相変わらずVB6から移行しにくいと思われる部分
    ……どちらともいえない部分

 それでは次章から、VB2005が提供するADO.NETのデータ・アクセス機能がどのように進化したのかを解説していこう。なお本稿では先日MSDN会員向けに公開されたVisual Studio 2005 Professional Edition日本語版 RTMのVB2005を使用している。

4. 新しくなったADO.NETのデータ・アクセス機能

 従来のVB6では、データベースへのアクセスの手法がさまざま用意されていた。例えば、Accessで作成したMDBファイル(Jetデータベース)へアクセスするためのDAO(Data Access Objects)、ODBCを経由してデータベースにアクセスするRDO(Remote Data Objects)、OLE DB(=データベース用のプログラミング・インターフェイス)を経由してデータベースにアクセスするADO(ActiveX Data Objects)などだ。これらのデータ・アクセス手法はCOM(Component Object Model)と呼ばれるマイクロソフトが定義した規約にのっとったコンポーネント形式によって提供されていた。

 これに対し現在の.NET Frameworkでは、ADO.NETという進化したデータ・アクセス手法が提供されている。ADO.NETでは、これまでのデータ・アクセス手法の欠点(例えば「非接続型」のデータベース・アクセスができないなど)を補った新しい機能が提供されている(詳しくは「ADO.NET基礎講座」を参照してほしい)。従って.NETで新しいソフトウェアを作成するときには新しいADO.NETを使うべきである。

■4.1 ADO/RDOの継続使用

 もちろん.NET Frameworkから従来のCOMを呼び出して従来のデータ・アクセス手法を活用することも可能だ(この機能はVB2005以前のVisual Studio .NET 2002/2003(以降、VS.NET)からすでに提供されていた)。.NETからCOMを利用することで、従来のデータ・アクセスに関する知識を生かしたり、古いプログラムと新しいプログラムのデータ・アクセスにおける互換性を維持したりすることができるだろう。

 ただしそこには落とし穴も存在する。というのも、.NETではRCW(Runtime Callable Wrapper:ランタイム呼び出し可能ラッパー)を経由してCOMが呼び出されるため、そのオーバーヘッドが発生してしまい、データ・アクセスの実行パフォーマンスが低下してしまう可能性があるのである。それでも従来のCOMベースのデータ・アクセス技術を使い続けたい場合は、相互運用機能アセンブリ(Interop Assembly)と呼ばれるアセンブリを作成して、それに含まれるメタデータから生成されたRCWを経由ですることで呼び出せる。その作業は、VB2005でも、VB6でデータ・アクセスを使用するのと同じくらい簡単だ。

 ここでVB2005で相互運用機能アセンブリを作成する手順を紹介しておこう。まず、メニューバーの[プロジェクト]−[参照の追加]をクリックする。これにより、次のような[参照の追加]ダイアログが表示されるので、[COM]タブに切り替える。COMコンポーネントが一覧表示されるので、ADOやRDOを選択して[OK]ボタンをクリックすれば完了だ。

[参照の追加]ダイアログ
[COM]タブで追加したいコンポーネントを選択して、[OK]ボタンをクリックする。なお「Microsoft ActiveX Data Objects x.x Library」と記述されているのがADOのコンポーネントである。x.x(2.0〜2.8)の部分はバージョンである。基本的には最新の2.8を利用するとよい。

 これだけの手順でVisual Studio 2005のIDEは自動的に相互運用機能アセンブリを作成してくれる。プロジェクトを保存している場合は、binフォルダの下に実際にアセンブリ・ファイル(本稿の例では「Interop.ADODB.dll」)が作成されているのを確認することができる。

プロジェクトをビルドしたbinフォルダ
binフォルダの下にアセンブリ・ファイル(この例では「Interop.ADODB.dll」)が作成されている。

 このようにCOMコンポーネントへの参照を追加することによって、ADOやRDOのコンポーネントをVB6と同じように呼び出せるようになる。CreateObject関数を呼び出した遅延バインドも引き続き利用可能である。ただし、.NET Frameworkは、データ・アクセスにADO.NETを使用することを前提に設計されているため、ADOやRDOで読み込んだデータを.NET Frameworkのコントロールから直接使うことはできない。

 ただし1つだけ例外的に、ADOで取得したデータをADO.NETで読み込む機能があるので、COMオブジェクトの呼び出し方と併せて紹介しておこう。

■4.2 ADO.NETによるADOレコードセットの読み込み

 ADO.NETは、.NET Frameworkで使用されるデータ・アクセス・ライブラリの総称である。SQL ServerやOracleネイティブなものもあるし、OLE DBを使うものもある。VB6で使用されていたADOは、内部的にOLE DBを呼び出していた。そのため、ADOのレコードセット(RecordSet)に読み込んだデータは、ADO.NETに用意されているOLE DBライブラリを使ってADO.NETのデータセット(DataSet)に読み込むことができるのだ。

 以下のコードは、ADOの互換アセンブリを使用して読み込んだSQL ServerのレコードセットをADO.NETのデータセットに読み込んで、VB2005のDataGridViewコントロールに表示する例である。

Dim cn As New ADODB.Connection
Dim rs As ADODB.Recordset

cn.Open(“Provider=SQLOLEDB.1;Data Source=(local);Initial Catalog=testDB;Integrated Security=SSPI;”)
rs = cn.Execute(“SELECT * FROM TestTable”)

Dim da As New OleDbDataAdapter
Dim ds As New DataSet
' ↓ここでADOのレコードセットをADO.NETのデータセットに読み込んでいる。
da.Fill(ds, rs, “adoRs”)
DataGridView1.DataSource = ds.Tables(“adoRs”)

cn.Close()

System.Runtime.InteropServices.Marshal.ReleaseComObject(rs) System.Runtime.InteropServices.Marshal.ReleaseComObject(cn)
ADOのレコードセットをADO.NETのデータセットに読み込む例
ADOのレコードセットに受け取ったデータベースのクエリ結果を、ADO.NET のOleDbDataAdapterを使用してADO.NETのデータセットに読み込み、DataGridViewコントロールにバインドしている。なおADODBはADOの相互運用機能アセンブリで名前空間として定義される。

 このように、COMオブジェクトであるADOも、VB6と同じように呼び出せる。また、データセットにデータを読み込むことによって、コントロールにデータをバインドすることもできようになっている。

 なおこのコードの最後の2行に、VB6開発者が見慣れないメソッドの呼び出しがあるのが分かるだろう。実は、VB6ではCOMオブジェクトに対してNothingをセットすればそれを解放できたのだが、.NETではNothingをセットしてもすぐには解放されないのだ。そのため.NETでは、COMオブジェクトを解放したい場合には明示的に解放するメソッド(ReleaseComObjectメソッド)を呼び出す必要があるのだ。

 前回も書いたが.NET Frameworkでは、オブジェクトは、プログラマが不要になったタイミングではなく、ガーベジ・コレクションによって暗黙的に解放される。もちろんオブジェクトの種類によってはすぐに解放する必要がないものもあるが、データベース・コネクションなどのように複数のクライアントで必要となる共有のリソースや、長時間保持していると問題が発生するリソースの場合には、不要になった時点で迅速に解放する必要がある。

 このようなリソースなどのオブジェクト破棄に関する問題に対応するために、VB 2005ではUsing〜End Usingステートメントが用意された、ということは前回でも解説した。だがCOMオブジェクトの場合は、IDisposableインターフェイスの実装もDisposeメソッドも用意されていなため、Usingキーワードで初期化したとしても解放されないのだ。そこで.NET Frameworkから呼び出されたCOMオブジェクトは、上記のようにReleaseComObjectというメソッドを呼び出して手動で明示的に解放する必要があるというわけだ。

 それでは次にアプリケーションの配布について見ていこう。

5. アプリケーションの配布

 VB6では、アプリケーションをクライアントへ配布するためのインストーラを作成する機能が用意されていた。だが、頻繁にバージョンが上がるアプリケーションの場合、そのたびに配布コストが発生して大変だった。これを回避するために、独自の自動更新機能を用意したり、ファイル・サーバ上で実行ファイルを共有したりしたものだ。

 しかし.NET Frameworkでは、このファイル・サーバ上で共有するというアプリケーション配置手法はほとんど使えなくなった。これはウイルスなどの悪意のあるプログラムの実行を未然に防ぐために、コード・アクセス・セキュリティというセキュリティ機能が追加されたためだ。

 これにより、実際にファイル・サーバ上で共有されたアプリケーションを実行すると、アプリケーションから呼び出せる機能がかなりの制限を受けるようになり、現実的にそのようにして起動したアプリケーションはほとんど使いものにならなかった(これはノータッチ・デプロイメントの機能を利用した場合も同様である。これについては「特集:ノータッチ・デプロイメント」を参照)。

 そのため、ファイル共有によるアプリケーション配布を行っていたVB6技術者の多くがVB.NETへの移行をあきらめた。しかしVB2005では、アプリケーション配布の問題を解決できる新しい配布方法が追加されている。

■5.1 ClickOnce

 VB2005には、ClickOnceと呼ばれる配布方法が追加された。

連載:ClickOnceの真実

 詳細な説明は割愛するが、この機能を使うことによって、アプリケーションの配布方法やセキュリティの制限を大幅に緩和できるようになった。アプリケーションの実行時に必要なセキュリティ設定は、アプリケーション開発時に指定できるようになっている。

 また、アプリケーションの配布はASPやASP.NETなどのWebアプリケーションと同じように、サーバにアップロードするだけで済む。Webサーバ経由で配布する方法やファイル共有で配布する方法などが用意されている。

■5.2 ランタイムなどの必須コンポーネントの配布

 .NET対応アプリケーションを配布するに当たって、最も問題なのはクライアントに.NET Framework自体がインストールされていないことが多いことである。そのため、.NETでアプリケーションを作ったとしても、アプリケーションをインストールする前にユーザーに.NET Frameworkをインストールしてもらう必要があった。VB6開発者の多くが、これによって移行することを見送ったのではないだろうか。

 VB2005では、先ほどのClickOnceの設定の際に、アプリケーションを実行するうえでインストールが必要なコンポーネントを選択することができる。

 例えば下の図では.NET Framework 2.0が必須コンポーネントとして選択されているが、これによりユーザー側のクライアント環境に.NET Framework 2.0がインストールされていなければ、事前にそれをインストールさせるようにできるわけだ。

ランタイムなどの必須コンポーネントの配布
ClickOnceアプリケーションの配布時には.NET Framework 2.0などの必須コンポーネントも同時に配布できるようになっている。

 このように必須コンポーネントを選択してアプリケーションを配布すると、インストール時にまず、必須コンポーネントがインストールされているかがチェックされる。ここでインストールされていないと、アプリケーションをインストールする前に、必須コンポーネントが指定した場所(上の画面の例では「開発元のWebサイト」)からダウンロードされインストールされるのである。

 これによって、配布先のPCに.NET Frameworkがインストールされていなくても、容易にアプリケーションを配布できるようになった。

 VB2005/VS2005には、VB.NET/VS.NETと同様にアップグレード・ウィザードが用意されている。次にこのアップグレード・ウィザードについて説明しよう。


 INDEX
  [特集] Visual Basic 2005へ移行する理由
  VB2005は.NETへの移行を加速できるのか!?
    1.なぜVB6開発者はVB.NETに移行しなかったか?
    2.互換性が高まった開発環境
 
  VB6開発者にやさしいVB2005の言語仕様
    1.フォームのデザインと生成されるコード、フォームのインスタンス化処理
    2.Myオブジェクト、コード・スニペット、配列の下限指定、暗黙の型変換
    3.デフォルト・プロパティ、オブジェクトの解放、エディット&コンティニュー
   
  VB6開発者が待ち望んだVB2005の便利機能
  1. 進化したデータ・アクセス機能とアプリケーションの配布技術
    2. 完成度を高めた移行ウィザードとまとめ
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH