特集:VBでOracle Database開発入門(後編)

SQL Server開発者のためのOracle DB入門

初音 玲
2008/12/09
Page1 Page2 Page3

VB6×Oracleから.NET×Oracle 11g移行のポイント

 まずはVB6時代のOracleデータベース開発について振り返ろう。

VB6時代の接続手法(DAO/RDO/ADO/oo4o)

図5 VB6時代の接続手法

 VB6時代の接続方法は、Visual Basicに標準搭載されているOracle Database向けのODBCドライバを介してDAD/JetやRDOで接続するか、あるいはOLE DBプロバイダを介してADOで接続するか、もしくはオラクル社が提供しているOracle Objects for OLE(oo4o)を使うかであった。この4つの接続用コンポーネントはすべてCOMコンポーネントであり、VB6から手軽に呼び出せた。

 特にOracle Objects for OLEは、Oracle Database専用であったのでほかの接続方法に比べてパフォーマンスも良かった。また、DAOのプロパティやメソッドに近い構成になっており、VB6+DAO/Jet(Accessデータベース)という組み合わせからの移行もしやすかった。

 それでは、対する.NET時代の接続方法を見てみよう。

.NET時代の接続手法(ADO.NET/ODP.NET)

図6 .NET時代の接続手法

 上の図のように、VB 2005/2008のプログラム・コードとのインターフェイスは.NETデータ・プロバイダの仕様に沿ったものであり、使用するクラス、イベントおよびプロパティなどがほぼ同じになっている。このため、いったん1つの.NETデータ・プロバイダの使い方を覚えてしまえば、さまざまな.NETデータ・プロバイダにその知識を応用できる。

DataReaderクラスに移行するうえでのポイント

 先ほど説明したDataReaderクラスは読み取り専用で、SELECT文により取得したレコードを1レコードずつ処理していくコード・スタイルになる。そのため、VB6時代の接続方法での処理形態と似通っているので、移行は比較的容易だろう。

 以下は、VB6+Oracle Objects for OLEでデータベースからデータを読み取り、すべてのデータのENAMEフィールドの値を、ListBox1コントロールに追加していくコード。

Dim ds As Object

Set ds = _
  objDatabase.CreateDynaset("SELECT * FROM EMP", 12&)

Do While Not ds.eof
  Me.ListBox1.Add(ds.Fields("ENAME").Values)
Loop
VB6+Oracle Objects for OLEのコード例
CreateDynasetメソッドの第2引数として記述している「12&」はオプション・フラグで、「読取り専用」(ORADYN_READONLY)+「前方参照専用」(ORADYN_NOCACHE)を意味する。

 同じ内容をVB 2008+ODP.NETで書いたのが以下のコード。

Dim rd As OracleDataReader = Nothing

rd = _cmd.ExecuteReader
Do While rd.Read
  Me.ListBox1.Items.Add(rd.Item("ENAME").ToString)
Loop
VB 2008+ODP.NETのコード例

データアダプタに移行するうえでのポイント

 データアダプタに移行する場合のポイントは、プログラム・コードから値を取り出したり、値をデータベースに反映したりするのに、データセットを使う点だろう。

 また、データアダプタを使ってデータベースの値をデータセットに設定した後は、データベースとの接続をいったん切断しておくのが通常で、そのためデータアダプタを使ったときの接続形態を「非接続型」と呼ぶ(データベースとの接続をキープしたままの接続形態は「接続型」と呼ばれる)。

 以下はVB6+Oracle Objects for OLEのコード例。EMPテーブルを更新している。

Dim ds As Object
Set ds = _
  objDatabase.CreateDynaset("SELECT * FROM EMP", 0&)
If Not ds.eof Then
  ds.AddNew
Else
  ds.Edit
End If
  :
  :
ds.Update
VB6+Oracle Objects for OLEのコード例
CreateDynasetメソッドの第2引数として記述している「0&」はオプション・フラグで、「デフォルトの動作」(ORADYN_DEFAULT)を意味する。

 上記のコードと同じコード内容をVB2008+ODP.NETで記述した例。データアダプタ経由でEMPテーブルを更新している。

Using cb As New OracleCommandBuilder(_da)
  _da.UpdateCommand = cb.GetUpdateCommand()
  _da.InsertCommand = cb.GetInsertCommand()
  _da.DeleteCommand = cb.GetDeleteCommand()
  MessageBox.Show(_da.UpdateCommand.CommandText)
  _da.Update(Ds, "EMP")
End Using
VB2008+ODP.NETのコード例
「_da」はデータアダプタ(=OracleDataAdapterクラスのオブジェクト)。「Ds」はデータセット。

まとめ

 VB 2005/2008(.NET)からデータベースに接続する場合、VB6時代と共通しているのは、接続先データベースに対する専用ミドルウェア(本稿の例でいえばOracle Data Provider for .NET)を選択することが重要だということだ。専用ミドルウェアであれば、汎用的な.NETデータ・プロバイダに伴う汎用化のためのオーバーヘッドを回避できるし、また接続対象が限定されるため、データベース固有の機能が使いやすいように工夫されている。

 しかも.NETデータ・プロバイダは、専用ミドルウェアをデータベース接続先ごとに切り替えて利用するという開発スタイルを考慮した構成になっているため、以前より少ない労力でOracle DatabaseへもSQL Serverへも簡単に切り替えて使える。.NETデータ・プロバイダを習得すれば、マルチなデータベース開発者になるのも夢ではないだろう。End of Article

 

 INDEX
  [特集]VBでOracle Database開発入門(前編)
  .NETによるOracle Database開発とは?
    1..NETで、なぜデータベースが必要なのか?
    2.Oracle Databaseの歴史と最新のOracle 11gとは
    3.Oracleデータベース開発のテクノロジ
 
  [特集]VBでOracle Database開発入門(後編)
  SQL Server開発者のためのOracle DB入門
    1.SQL Server開発者から見たOracle Databaseの特徴
    2.Oracle DatabaseとSQL Serverのコードの主な違い
  3.VB6×Oracleから.NET×Oracle 11g移行のポイント


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