日本オラクル クロスインダストリー統括本部
OracleDirect テクニカルサービスグループ
大田 浩 |
 |
「意外と簡単!? .NETでOracle」シリーズではMicrosoft Visual Studio.NETを使用してOracle10g対応アプリケーションをこれから開発されるかた向けの情報を公開しておりましたが、現在Oracle Objects for OLE(以下、oo4o)を利用されているかたから、
「Oracleのバージョンアップをしたい!!」
「でも今まで開発したクライアントアプリケーションはどうなるの?」
という声が多く、急遽番外編として「意外と簡単!? 番外編 oo4oのバージョンアップについて」の情報を公開するようになりました。今回はOracleをバージョンアップをした際に、oo4oを使用して開発されたアプリケーションを移行する方法を説明します。また、Visual Basic .NET(以下、VB.NET)からoo4oを利用する方法についても説明します。
 |
| 「意外と簡単!? 番外編 oo4oのバージョンアップ」は、以下の3つの内容から構成しております。 |
- oo4oで作成されたアプリケーションのアップグレード
- oo4oのバージョンを上げる必要性
- 既存バージョンからのアップグレード注意点
- 既存のoo4oの削除手順
- 再コンパイルが必要な場合
- キャラクタセットの問題
- NULL値の扱いの変更
- 再配布環境でのレジストリ登録時の注意
- .NET開発環境でのoo4oの利用
- .NET環境でのoo4oのサポート
- VB.NETからoo4oを使用する方法
- ASP.NETからoo4oを使用する際の注意点
- Oracle Database 10gにおけるoo4oのサポート状況
| 1. oo4oで作成されたアプリケーションのアップグレード |
oo4oで作成されたアプリケーションのアップグレードに関して、まず初めにoo4o自体をアップグレードする必要性があるのかを最初に検討する必要があります。oo4oをアップグレードした場合、次にアプリケーションの再コンパイルを実行し、最後にアップグレードによる問題が発生した場合の対応を行う必要があります。
 |
| oo4oのバージョンを上げる必要性 |
以下のような場合にoo4oのバージョンアップを検討する必要があります。
| |
対応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表
| |
接続先データベース |
| 接続元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の再配布を行う場合には、必ず上記のファイルもあわせて配布する必要があります
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へのアクセス権が無いために発生するエラー画面
|
エラーを回避するためには、以下の手順にてアクセス権を設定する必要があります。
| 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) の新機能
|