日本オラクル クロスインダストリー統括本部
OracleDirect テクニカルサービスグループ
大田 浩


目次
はじめに
1. oo4oで作成されたアプリケーションのアップグレード
2. .NET開発環境でのoo4oの利用
3. Oracle Database 10gにおけるoo4oのサポート状況


 はじめに

「意外と簡単!? .NETでOracle」シリーズではMicrosoft Visual Studio.NETを使用してOracle10g対応アプリケーションをこれから開発されるかた向けの情報を公開しておりましたが、現在Oracle Objects for OLE(以下、oo4o)を利用されているかたから、
「Oracleのバージョンアップをしたい!!」
「でも今まで開発したクライアントアプリケーションはどうなるの?」
という声が多く、急遽番外編として「意外と簡単!? 番外編 oo4oのバージョンアップについて」の情報を公開するようになりました。今回はOracleをバージョンアップをした際に、oo4oを使用して開発されたアプリケーションを移行する方法を説明します。また、Visual Basic .NET(以下、VB.NET)からoo4oを利用する方法についても説明します。

  「意外と簡単!? 番外編 oo4oのバージョンアップ」は、以下の3つの内容から構成しております。

  1. oo4oで作成されたアプリケーションのアップグレード
    • oo4oのバージョンを上げる必要性
    • 既存バージョンからのアップグレード注意点
    • 既存のoo4oの削除手順
    • 再コンパイルが必要な場合
    • キャラクタセットの問題
    • NULL値の扱いの変更
    • 再配布環境でのレジストリ登録時の注意

  2. .NET開発環境でのoo4oの利用
    • .NET環境でのoo4oのサポート
    • VB.NETからoo4oを使用する方法
    • ASP.NETからoo4oを使用する際の注意点

  3. Oracle Database 10gにおけるoo4oのサポート状況

 1. oo4oで作成されたアプリケーションのアップグレード

oo4oで作成されたアプリケーションのアップグレードに関して、まず初めにoo4o自体をアップグレードする必要性があるのかを最初に検討する必要があります。oo4oをアップグレードした場合、次にアプリケーションの再コンパイルを実行し、最後にアップグレードによる問題が発生した場合の対応を行う必要があります。

  oo4oのバージョンを上げる必要性

以下のような場合にoo4oのバージョンアップを検討する必要があります。
  • クライアント端末のOSのバージョンアップに従い、既存のoo4oが使用できない場合。 対応OSは以下の 図1の 「oo4o対応OS表」を参照してください。 また、最新の情報は以下のURLを参照してください。
    http://www.oracle.co.jp/products/system/index.html
  対応OS
oo4oのバージョン 95 98 NT4.0 2000 XP PRO 2003
Objects for OLE(OO4O) R8.0.6 × × ×
Objects for OLE(OO4O) R8.1.7 ×
Objects for OLE(OO4O) R9.0.1 × ×
Objects for OLE(OO4O) R9.2.0 ×
Objects for OLE(OO4O) R10.1.0 × ×
図.1 oo4o対応OS表


  • DBサーバーのバージョンアップに従い、既存のoo4oでは接続ができない場合。 対応DBサーバーは以下の 図.2 oo4oバージョン別対応表を参照してください。 また、最新の情報は以下のURLを参照してください。
    http://www.oracle.co.jp/products/system/matrix_db.html
  接続先データベース
接続元oo4oバージョン 7.3.4 8.0.6 8.1.7 9.0.1 9.2.0 10.1.0
Objects for OLE(OO4O) R8.0.6 ×
Objects for OLE(OO4O) R8.1.7
Objects for OLE(OO4O) R9.0.1
Objects for OLE(OO4O) R9.2.0 ×
Objects for OLE(OO4O) R10.1.0 × ×
◎:接続可 (推奨される組み合わせ)
この組み合わせにおいて関係する製品/コンポーネントのサポート・ライフサイクルに応じて、 サポート・サービス・レベルが遷移した時点で◎から○へ移行します。
○:接続可
この組み合わせのフル・サポートは終了しています。そのため新規に確認された障害に対する修正が提供されません。 障害への対処としましては、リリースアップまたは回避策による対応が必要となります。
×:接続不可
図.2 oo4oバージョン別接続先データベース対応表


  既存バージョンからのアップグレード注意点

oo4oは、一台のクライアントに対して、一つのORACLE_HOMEのみ対応します。すなわち、1台で使用できるバージョンは1つのみで複数バージョンは使用できません。また、Oracle Database 10gからは、新たなORACLE_HOMEにoo4oをインストールすると、レジストリが書き換えられ、それ以前にインストールされたoo4oバージョンは使用できませんのでご注意ください。

注意:Oracle Database 10gより前のoo4oのバージョンを導入する際には、一度既存のoo4oを削除した上で、再度インストールすることが必要になります。


  既存のoo4oの削除手順

oo4oを1つのクライアントに複数バージョンインストールすることは出来ませんので、 新規に新たなOracle Clientをインストールする場合に、既にインストールされているoo4oを削除する必要があります。 また、R8.0.4より前のバージョンのOracle Clientが既にインストールされている場合には、マルチオラクルホーム (複数のOracle Clientを、オラクルホームを分けてインストール)が使用できませんので、既存のOracle Client全体を 削除する必要があります。既存のoo4o、もしくはOracle Clientを削除するには、削除対象のバージョンの Oracle Universal Installerを使用します。


図.3 Oracle Universal Installer画面

Oracle Universal Installer画面上の、「製品の削除」ボタンをクリックします。 インストール済みの製品一覧が表示されますので、 oo4oもしくはオラクルクライアント全てを選択して、削除を実行します。


図.4 削除対象製品の選択画面


  再コンパイルが必要な場合

Visual Basic 6以前のバージョン(以下、VB)で開発しており、 アーリー・バインディング を使用している場合には再コンパイルが必要になります。 アーリー・バインディングとは図.5のようにVBの開発環境画面の参照設定でoo4oを設定して 使用している場合になります。アーリー・バインディングを行っている場合、 VBの開発環境画面の参照設定でOracle InProc Serverを選択しなおし、再コンパイルを行う必要があります。


図.5 Visual Basicの開発環境画面でoo4oの参照設定を行っている画面


アーリー・バインディングを使用している場合のコードは以下のようになります。

Dim OraSession As New OraSessionClass
Dim OraDatabase As OraDatabase
Set OraDatabase = OraSession.OpenDatabase("orcl", _
 "scott/tiger", dbOption.ORADB_DEFAULT)
<アーリー・バインディングを使用した場合のコード>

参照設定を行わずにoo4oを使用している場合(レイト・バインディング)のコードは以下のようになります。

Dim OraSession As Object       ''セッション・オブジェクト
Dim OraDatabase As Object      ''データベース・オブジェクト
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
Set OraDatabase = OraSession.OpenDatabase("orcl", "scott/tiger", 0&)
<参照設定を行わずにoo4oを使用しているコード(レイト・バインディング)>

レイト・バインディングを使用してコンパイルされたモジュールは、再コンパイルせずに動作可能ですが、 確実に移行作業を行うために、再コンパイルしていただくことを推奨しております。


  キャラクタセットの問題

oo4oは 8.1.7.3.14および8.1.6.3.14以上のバージョンでUnicodeに対応しております。このため'〜'のUnicode(U+301C)がSJISとMS932でのマッピングの違いにより'?'と変換されてしまう場合があります。問題の解決にはクライアントの環境変数 NLS_LANGをJA16SJISTILDEと設定する必要があります。この設定が可能なのは oo4oがインストールされているクライアントのOracleClientのバージョンが 9.0.1.4 以降である必要があります。ただし、CLOBデータとして'〜'を使用する場合には、クライアント側での変換が行われないためデータベース側のキャラクタセットもJA16SJISTILDE/JA16EUCTILDE に変更する必要があります。データベース側のキャラクタセットをJA16SJISTILDE/JA16EUCTILDEに設定するためには、データベースのバージョン自体も9.0.1.4以降である必要があります。キャラクタセットの問題に対する対処法は以下の「図.6 oo4oは 8.1.7.3.14および8.1.6.3.14以上のバージョンの‘〜’の対処法」を参照してください。

Oo4oのバージョン Oracle データベース側
のバージョン
対処方
8.1.7.3.14および8.1.6.3.14以上で9.0.1.4より前のバージョン Oracle Database 8.1.6 以前 oo4oを9.0.1.4 以上のバージョンアップを行い、クライアント側のNLS_LANGの設定を JA16SJISTILDEに設定するか、‘〜’を使用せずに‘−’のような文字を代わりに 使用。
また、Oracle データベース側を8.1.7以上へバージョンアップ。
Oracle Database 8.1.7 以降 oo4oを9.0.1.4 以上のバージョンアップを行い、クライアント側のNLS_LANGの設定を JA16SJISTILDEに設定するか、‘〜’を使用せずに‘−’のような文字を代わりに 使用。
9.0.1.4以降のバージョン Oracle Database 8.1.6 以前 クライアント側のNLS_LANGの設定を JA16SJISTILDEに設定。
また、Oracle データベース側を8.1.7以上へバージョンアップ
Oracle Database 8.1.7 以降 クライアント側のNLS_LANGの設定を JA16SJISTILDEに設定。
図.6 oo4oは 8.1.7.3.14および8.1.6.3.14以上のバージョンの‘〜’の対処法

NLS_LANGの設定情報はレジストリに記述されておりますので、レジストリの設定を変更する必要があります。NLS_LANGが記述されている箇所は、HKEY_LOCAL_MACHINE\SOFTWARE\ORACLEにあるNLS_LANGになります。Oracle 8.1.5 以上の環境やマルチ ORACLE_HOME環境の場合、各 ORACLE_HOME 毎に設定が異なります。
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ の下に「HOME0」というように「HOME+数字」のキーが作成されます。この中にそれぞれ 「ORACLE_HOME」「ORACLE_HOME_NAME」という文字列があり、それぞれの値として ORACLE_HOME のディレクトリおよび ORACLE_HOME 名が設定されています。
この値をもとに使用する ORACLE_HOME のキーを探し、そのキーの下の NLS_LANG という文字列に設定します。具体的には HOME2 の ORACLE_HOME の NLS_LANG を設定する場合には以下のようになります。

キー名 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME2
値の名前 NLS_LANG
JAPANESE_JAPAN.JA16SJISTILDE


図.7 レジストリの設定画面

注意: 既存のデータベースがデータベース・キャラクタ・セット JA16SJISまたはJA16EUC から JA16SJISTILDE または JA16EUCTILDE への変更は設定やコマンドで行うことはできません。 その場合は、新規にデータベースの再作成を行った後に、既存のデータベースからデータを Export/Import等にて移行することで対応可能です。


  NULL値の扱いの変更

oo4o V2.3.x と 8.x、9.x、10.x では、NULL値の 扱いが異なっております。具体的には、VBのString型でNULL値を取得する際に、oo4o 2.3.x以前のバージョンでは空文字列(“”)で取得していたのですが、oo4o 8.x、9.x、10.xではNULL値がそのまま戻されます。そのため、8.x、9.x、10.xのoo4oを使用し値を取得する際に、実行時エラー 94 「Nullの使い方が不正です」が発生する場合があります。 このエラーを回避するためには、VB 関数 IsNull(戻りがNULLの場合、TRUEを戻します) を使用する必要があります。

Dim strDataVal As String

If IsNull(OraDynaset.Fields("COL1")) Then
  strDataVal = ""

Else
  strDataVal = OraDynaset.Fields("COL1")
End If
<IsNull関数を使用して値を取得しているサンプルコード>


  oo4o 8.1.5.3.4以降での再配布環境でのレジストリ登録時の注意

以前のバージョンでは oraipsrv.reg ファイルが同時にインストールされていましたが、oo4o 8.1.5.3.4 以降はこのファイルは必要ありません。8.1.5.3.4 以降では、以下のように配布先の環境にて regsvr32.exe を使用して oo4oのレジストリ 登録を行います。こちらは配布先のコマンドプロンプトより実行してください。 以下のレジストリ登録実行例はoo4oのバージョン 8.xの設定例です。

>cd c:\oracle\bin
>regsvr32.exe oip8.dll

実行前に以下のファイルが%ORACLE_HOME%\bin ディレクトリに存在することをご確認下さい。

oo4oのバージョンが8.xxの場合 oip8.dll, oip8.tlb, oraansi.dll
oo4oのバージョンが9.xxの場合 oip9.dll, oip9.tlb, oraansi.dll
oo4oのバージョンが10.xxの場合 oip10.dll, oip10.tlb, oraansi10.dll

いずれかのファイルが存在しない場合、「プロシージャエントリポイントOCINlsGetInfoがダイナミックリンクライブラリ OCI.dll から見つかりません」 というエラーが発生します。 oo4oの再配布を行う場合には、必ず上記のファイルもあわせて配布する必要があります


 2..NET開発環境でのoo4oの利用

Microsoft .NET(以下 .NET)環境では、Oracleに接続するためのミドルウェアとして、.NET環境でOracleにネイティブに接続可能な「Oracle Data Provider for .NET」をご利用いただくことを推奨しております。しかしながら、様々な理由により .NET環境においても oo4oをご利用したいというご要望もあるかと思います。.NET環境においてもoo4oをご利用頂くことは可能ですが、その際における注意点、もしくはVisual Studio .NET環境でoo4oを使用する時の設定方法について説明します。

  .NET環境でのoo4oのサポート

Microsoft .NET環境からoo4oを使用する場合は、Visual Basic.NET(以下 VB.NET)でのみ使用可能です。Visual C#.NET や Visual C++.NET では動作保証されていませんのでご注意ください。

  VB.NETからoo4oを使用する方法

VB.NETからoo4oを使用するには、以下の図.8のように「参照の追加」画面で「COM」タグを選択し、Oracle InProc Serverを選択して下さい。


 図.8 Visual Basic.NETの開発環境画面でoo4oの参照設定を行っている画面


  ASP.NETからoo4oを使用する際の注意点

ASP.NETからoo4oを利用する際の注意点について説明します。Internet Information Services(以下、IIS)では ASP.NETスクリプトの実行時、ASPNETユーザーとして実行されます。ASPNETユーザーがORACLE_HOMEディレクトリにアクセス権が無いと以下のようなエラーが発生します。


 図.9 ORACLE_HOMEへのアクセス権が無いために発生するエラー画面

エラーを回避するためには、以下の手順にてアクセス権を設定する必要があります。

1.   Administrator 権限のあるユーザーで Windows にログオンする

2.   Windows の Explorer (Explorer.exe)を起動し、ORACLE_HOMEディレクトリを選択して右クリック


3.   「プロパティ」を選択し「セキュリティ」タブを開く



4.   「追加(D)」を押し「ユーザーまたはグループの選択」画面を表示する



5.   「場所」からローカルマシンを選択し、上記の「ASPNET」を選択し「追加(A)」を押し「OK」を押して追加する。

注意:ASPからoo4oを使用したい場合は、「IUSR_」というユーザーも追加してください。


6.   5.で追加したユーザーを選択し、アクセス許可(P)より「許可」の列にある「読み取りと実行」のチェックをつけ「適用(A)」に続いて「OK」を押す。



 3.Oracle Database 10gにおけるoo4oのサポート状況

Oracle Database 10g においてもoo4oをサポートし、データベース・グリッド対応など最新の機能を利用可能となっております。

新機能 説明
グリッドのサポート アプリケーションコードを書き換えることなく、10gのグリッドに対応したアプリケーションを開発することが可能です。
Oracle Datatbase 10g
に対応した新データ型
のサポート
Oracle Database 10gで新規に実装された、BINARY_DOUBLE と BINARY_FLOAT のデータ型をサポートしております。
図.10 Oracle Objects for OLE 10g Release 1 (10.1) の新機能