ADO から ADO.NET への移行方法

Cc440840.download(ja-jp,MSDN.10).gif サンプル コードのダウンロード (vbmigtips_ado.exe, 242 KB)


Visual Basic 6.0 と Visual Basic .NET では、データベースへのアクセス方法が異なります。Visual Basic では、ADO(ActiveX Data Objects)、DAO(Data Access Objects)、RDO(Remote Data Objects)を使ってデータベースにアクセスします。Visual Basic .NET では、.NET Framework が提供する ADO.NET を使ってデータベースにアクセスします。今回は、Visual Basic 6.0 で ADO を使い Access データベースにアクセスするアプリケーションを、どのように .NET 化すればよいか紹介します。
まず、.NET 化する Visual Besic 6.0 のアプリケーションがどのような実装になっているか簡単に説明します。

図1 の Access データベースにアクセスし、Visual Besic 6.0 の DataGrid コントロールに一覧(図2)を表示するアプリケーションの実装コード(リスト1)は以下のとおりです。

 Cc440840.ado_fig01(ja-jp,MSDN.10).gif
 図1

 Cc440840.ado_fig02(ja-jp,MSDN.10).gif
 図2

Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset

Private Sub Form_Load()
Set Cn = New ADODB.Connection
Cn.CursorLocation = adUseClient
Cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\Test.mdb;"
Cn.Open
Set Rs = Cn.Execute("SELECT * FROM TestTable", , adCmdText)
Set Me.DataGrid1.DataSource = Rs
End Sub
リスト1

では、Visual Basic .NET ではどのように記述すれば良いのでしょうか。まずは、アップグレードウィザードを使った場合に、Visual Basic .NET にどう変換されるかコードを参考に見ていきましょう。
Visual Basic 6.0 で作成したリスト1 のプロジェクトを、Visual Basic .NET で開きます。すると、自動的にウィザードが起動し、支持に従った操作を行うと、コードが変更されます。下記のコード(リスト2)は、アップグレードウィザードによって変更されたコードです。

Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
Cn = New ADODB.Connection
Cn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
Cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & VB6.GetPath & "\Test.mdb;"
Cn.Open()
Rs = Cn.Execute("SELECT * FROM TestTable", , ADODB.CommandTypeEnum.adCmdText)
Me.DataGrid1.DataSource = Rs
End Sub
リスト2

アップグレードウィザードを使って Visual Basic .NET へ移行すると、コード上では、「Set Cn = New ADODB.Connection」、「Set Rs = Cn.Execute("SELECT * FROM TestTable", , adCmdText)」や、「Set Me.DataGrid1.DataSource = Rs」の「Set ステートメント」が省略された以外、大きな変更はありません。
アップグレードウィザードを使った場合、データベースへのアクセスは、ADO.NET に変換されるわけではなく、ADO のラッパークラスを使って ADO のまま動作するように変換されます。また、DataGrid コントロールも Visual Basic 6.0 のコントロールがそのまま使われています。確かに、この実装でも正しく動作します。しかも開発者は殆どコードを変更することなく、Visual Basic .NET に移行することができます。しかしながら、この実装方法には、幾つか注意しなければならない点があります。ラッパクラスを返して ADO を使うことにより、オーバーヘッドが発生し、従来の Visual Basic 6.0 で作成したアプリケーションよりパフォーマンスが低下いたします。本来、.NET Framework が提供する ADO.NET を使用することによる、パフォーマンスの向上や、非接続型のデータアクセスと言った .NET のメリットを十分に発揮できません。
今回紹介しているサンプルでは、Load 時に一度データベースにアクセスするだけなため、このままでもパフォーマンスの影響は、あまり受けません。ですが、既存のアプリケーションを .NET 化する場合には、予め考慮しておく必要があるでしょう。

上記の実装をアップグレードウィザードを使わずに ADO.NET で実装する方法を紹介いたします。
下記のコード(リスト3)は、ADO.NET を使って、Access データベースにアクセスし、DataGrid に一覧を表示する実装コードです。(DataGrid は、.NET Framework が提供している DataGrid クラスを使用しています。)

Imports System.Data.OleDb

Private oleConn As OleDbConnection
Private oleCmd As OleDbCommand
Private oleAdp As OleDbDataAdapter
Private dts As DataSet

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
oleConn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Application.StartupPath & "\Test.mdb;")
oleCmd = oleConn.CreateCommand()
oleCmd.CommandText = "SELECT * FROM TestTable"
oleAdp = New OleDbDataAdapter(oleCmd)
dts = New DataSet
oleAdp.Fill(dts, "TestTable")
DataGrid1.SetDataBinding(dts, "TestTable")
End Sub
リスト3

リスト3 では、OleDbConnection や、OleDbDataAdapter を自前で実装しました。
VisualBasic .NET では、サーバー エクスプローラやツールボックスを利用することで、一行コードを書くだけで、同じ動作を実現することも可能です。
サーバー エクスプローラやツールボックスの使用方法は以下のとおりです。

まず、データベースを接続します。サーバー エクスプローラのデータ接続で、「接続の追加」を選択します。すると、データ リンク プロパティ ダイアログが表示されます。今回は Access のデータベースを使用するため、[プロパイダ]タブで「Microsoft Jet 4.0 OLE DB Provider」を選択し、「次へ (N)>>」ボタンをクリックします。そして、[接続]タブの「1.データベース名を選択または入力します」で、mdb ファイルを指定し、「OK」ボタンをクリックすると、サーバーエクスプローラに mdb ファイルへの接続が追加されます(図3)。「OK」ボタンをクリックする前に、「接続のテスト」ボタンをクリックし、接続できるかを確認してください。

 Cc440840.ado_fig03(ja-jp,MSDN.10).gif
 図3

続いて、データベースを参照します。サーバーエクスプローラから参照するテーブルをフォーム上にドラック&ドロップすると、oleDbConnection1 と、oleDbDataAdapter1 のインスタンスが生成されます。oleDbDataAdapter1 の Table Mappings プロパティで「...」ボタンをクリックし、[Table Mappings の設定]ダイアログを表示します。そこで、「テーブル名および列名を指定するにデータセットを使用する」にチェックし「OK」ボタンをクリックします。次に、データセットを追加(ファイル名は「Dataset1.xsd (任意)」)し、サーバーエクスプローラから参照するテーブルを Dataset1.xsd 上にドラック&ドロップします。すると、データベースのスキーマが自動的に生成されます。
そして、ツールボックスのデータから、 DataSet を Form1 上にドラッグ&ドロップすると、[データセットの追加]ダイアログが表示されるので、[型指定されたデータセット]に先ほど作成したスキーマを指定し、「OK」ボタンをクリックします。
最後に、フォームに DataGrid コントロールを追加し、Dock プロパティを「Fill」に、DataSource プロパティを「dataset11」に、DataMember プロパティを「Books」に変更します。そして、フォームの Load イベントを下記のように設定します。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.OleDbDataAdapter1.Fill(Me.dataset11)
End Sub

上記を実装すると、図4 のように表示されます。

 Cc440840.ado_fig04(ja-jp,MSDN.10).gif
 図4

データベースにアクセスしている Visual Basic 6.0 アプリケーションを Visual Basic .NET に移行する場合は、予めどのようなデータアクセスが行われているかを考慮し、どのようにアプローチする決める必要があります。Visual Basic .NET のメリットを十分に発揮したい場合には、ADO.NET を使って書き直すことをお薦めいたします。


表示: