Oracle Objects for OLE (OO4O)リリース・ノート


最新のOO4Oパッチおよび情報は、次のサイトで入手できます。
http://otn.oracle.com/tech/windows/ole/

リリース 11.1.0.7.20

2009年8月

Copyright (C) Oracle Corporation 2009


このファイルには、Oracle Objects for OLEに関する重要な情報が含まれています。内容は次のとおりです。

インストールの注意: Oracle Objects for OLEは複数のOracleホームにインストールできます。しかし、COMコンポーネントであるため、インストールされたコンピュータでアクティブにできるインスタンスは1つのみです。つまり、現在(最新)のインストールにより前のインストールは非アクティブになります。

「新機能」

32ビットの稼働中のOLEオートメーション・サーバーについてサポートされる新機能

10g(10.1)リリースでは、OO4Oを使用すると、開発者は10gデータベースに新規に導入された2つの数値データ型(BINARY_FLOATおよびBINARY_DOUBLE)へのアクセスおよび操作ができます。これらの型のインスタンスは、データベースからフェッチするか、または入出力変数としてSQL文およびPL/SQLブロック(ストアド・プロシージャおよびファンクションなど)に渡すことができます。

OO4Oを使用すると、oraconst.txtで定義されている次の値を使用して、これらのデータ型をバインドできます。

Oracleデータ型

定数

BINARY_FLOAT

ORATYPE_BFLOAT

100

BINARY_DOUBLE

ORATYPE_BDOUBLE

101

リリース9.2.0.4.8で導入された新機能

OO4Oで提供される4つの新規オブジェクトを使用すると、開発者は、Oracle9iで導入された新規日時および期間データ型にアクセスしたり操作できます。

OO4Oオブジェクト

Oracleデータ型

OraIntervalDS

INTERVAL DAY TO SECOND

OraIntervalYM

INTERVAL YEAR TO MONTH

OraTimeStamp

TIMESTAMP
TIMESTAMP WITH LOCAL TIME ZONE

OraTimeStampTZ

TIMESTAMP WITH TIME ZONE

これらの型のインスタンスは、データベースからフェッチするか、または入出力変数としてSQL文およびPL/SQLブロック(ストアド・プロシージャおよびファンクションなど)に渡すことができます。

これらの新規データ型は、PL/SQL索引付き表、VARRAYまたはネストされた表などのコレクション内の要素としてはサポートされません。詳細は、OO4Oのマニュアルを参照してください。

既知の問題

Oracleの稼働中のサーバー

XMLサポート

LONGまたはLONG RAWフィールドのデータはレンダリングされません。
RAW型のオブジェクトまたはコレクション属性のデータはレンダリングされません。

拡張型のパラメータについて、OraParameters.Removeをコールした場合のオートメーション・エラー

OraObject、OraRef、OraCollection、OraBlob、OraClobまたはOraBfile型のOraParameterについてOraParameters.Removeをコールすると、オートメーション・エラーになる場合があります。回避策は、Removeをコールしないことです。

一時LOBを解放した場合のアクセス違反

このバグは、一時LOBが範囲を外れたり、「nothing」に設定されることで解放されると発生します。回避策としては、LOBのOraDatabaseの親がLOBの後に解放されることを確認します。

Set OraClob = nothing
Set OraDatabase = nothing

ORA-4108 索引構成表に基づいてダイナセットを更新する場合

現在、OO4OではOraDynasetを使用した索引構成表の更新はサポートしていません。更新はOraDatabase.ExecuteSQLメソッドにより実行できます。

CLOBと可変幅キャラクタ・セットの使用: ドキュメントの訂正

OraClobのドキュメントが訂正されているので注意してください。CLOBを可変幅キャラクタ・セットとともに使用する場合は、必ず最新バージョンのドキュメントを参照してください。

その他の訂正:
OraClob.Write
chunksize引数が文字で指定されています。

OraLob.Pollingamount = 0であるが、OraLob.WriteのpiecetypeがORALOB_ONE_PIECEでない場合、ポーリングが依然として発生します。ORALOB_LAST_PIECEがWriteへのコールに対する引数として送信されると、ポーリングは完了します。これは特に、事前の合計文字数のカウントに負荷がかかる場合、可変幅キャラクタ・セットでOraClob.Writeをコールする際に役立ちます。
 

OraParameter値により空の文字列ではなくNULLの変数が戻される問題

以前のバグ修正の一部として、OraParameter.Valueにより、データベースのNULL値に対応するNULL型の変数が戻されます。以前のケースでは、空の文字列を戻すことがありました(バグ)。現在は、文字列変数をOraParameter.Valueに設定してNULLが戻される場合は、文字列変数をNULLに設定できないため、Visual Basicによりエラーが出されます。かわりに変数を使用してください。

接頭辞「Db」で始まるメソッドのドキュメントからの削除

接頭辞「Db」で始まるメソッドはドキュメント(OraSession.DbOpenDatabaseなど)から削除されましたが、
下位互換性を確保するために引き続きサポートされます。接頭辞「Db」が付かない同じメソッドは、完全に同じものです。

NCHARまたはNVARCHAR2データ型に関するORA-12704

NCHARおよびNVARCHAR2データ型は、このリリースではサポートされません。これらの型に対して操作が試行された場合、エラー「キャラクタ・セットが一致しません。」が発生する可能性があります。

ORADYN_ORAMODEを使用したダイナセットにおけるLOB列

ORADYN_ORAMODEオプションで作成されたダイナセットにおけるLOB列の追加は、このリリースでは機能しません。

LOB、オブジェクト、REF、コレクションの内容を保証しない書込み

他のすべての列型で更新を試行し、フィールドの値が別のユーザーによって変更されている場合、エラーOIP-4119「データが変更されました」を受け取ります。このエラーは、BLOBおよびCLOB、オブジェクト、REFおよびコレクション・タイプでは発生せず、データは関係なく更新されます。

OpenDatabaseのORADB_NOWAITオプション

このオプションの影響は、バージョン2.3における動作とは大きく異なります。このオプションは、現在ではOraDynasetにのみ適用されます。OraSqlStmtオブジェクトまたはExecuteSQLコールには影響しません。また、ロックされた行ではエラーが発生します(2.3では、データベース・リソースの競合が存在する場合、短時間の競合であっても、通常は混乱を生じさせるため、エラーが発生していました)。

LONG、LONG RAW列のChunkSize

オンライン・ドキュメントに示しているとおり、ChunkSizeを65280バイト以下、64K以外の値にできます。これは、GetChunk、GetChunkByte、GetChunkByte、GetChunkByteExおよびReadChunkのすべてのチャンク・メソッドに当てはまります。

MoveTo、MoveRel、Movexxxxnの動作

MoveTo:

このメソッドの動作は正確ですが、ドキュメントではこのメソッドの動作について明らかになっていません。リフレッシュ間の行番号は静的です。行番号は行IDと非常によく似ています。行番号は、削除後は動的に再割当てされません。したがって、MoveFirstの後にMoveTo 4を実行する場合、行2および3が削除されたかどうかにかかわらず、同じ行で終了します。このため、行が削除されていないことを保証できる場合(リフレッシュ直後など)は除き、行番号の値に基づいて算術を実行しないでください。つまり、有効な(削除されていない)行を基準にした行1および行4の距離は確認できないということです。行番号はラベルまたはIDとしてのみ機能しますが、行が削除された場合は常に、行番号の実際の値は相対位置の点では意味のないものになります。

MoveRel、Movexxxxn

これらのメソッドは、行が削除された場合には正しく機能しません。これらのメソッドは、指定したオフセットを行番号の値に不正に追加し、その場所(または、結果の行が削除されている場合は、次の使用可能かつ有効な行)に移動します。行が削除されていないことを保証できる場合(リフレッシュの直後など)を除き、これらのメソッドは使用しないでください。かわりに、MoveNextまたはMovePrevのループを使用して、同じ結果を達成します。

検索メソッド

 

Oracleクラス・ライブラリ


CLOBと可変幅キャラクタ・セットの使用: ドキュメントの訂正

最近のバージョンでは、OraClobのドキュメントが訂正されているため注意してください。CLOBを可変幅キャラクタ・セットとともに使用する場合、必ず最新バージョンのドキュメントを参照してください。

その他の訂正

unsigned long OClob::Read

バッファ・サイズ: ストリーミングが有効である場合はバイト数、無効である場合は文字数
オフセット: 文字数
戻り値: 読取りバイト数

void OClob::CopyToFile

ファイルはNLS_LANG設定と同じ形式になります。

void OClob::CopyFromFile

ファイルはNLS_LANG設定と同じ形式である必要があります。
 

OShutdown()コール後のプログラム終了時のアクセス違反

OShutdown()がコールされてプログラムが終了した場合、スタックにあるOO4Oオブジェクトは、コンパイラで生成されたクリーンアップ・コードにより削除されます。OO4Oオブジェクトが削除されると、関連付けられたOIP COMオブジェクトについてRelease()がコールされます。COMがすでに停止している場合は、これによりアクセス違反となる可能性があります。したがって、このような場合は、ユーザーはOShutdown()をコールする前にスタック上の各オブジェクトについてClose()をコールするか(オブジェクトが含まれるOValueの場合はClear())、または、いずれにしてもプログラムは終了するため、OShutdown()を一切コールしないようにする必要があります。OO4OオブジェクトについてClose()をコールする必要はなく、OO4Oオブジェクトが削除されると自動的に処理されます。ただし、こうした特殊なケースでは、必ずOShutdownの前にClose()をコールする必要があります。

例:

main()
{
OSession sess;
ODatabase db;
OValue val;
OStartup();
db.Open(sess, "exampledb", "scott", "tiger", 0);
sess.Close();
db.Close();
oval.Clear(); //only needed if OValue can contain an object
OShutdown();
}
 
 

RAWデータ型に対する追加サポート

C++ライブラリに、RAWデータ型のサポートを有効にする他のメソッドが追加されました。

ODynaset:
oresult GetFieldValue(int index, char *val, unsigned short maxlen, unsigned short *outlen) const;
oresult GetFieldValue(const char *fieldname, char *val, unsigned short maxlen, unsigned short *outlen) const;
oresult SetFieldValue(int index, const char *val, int len);
oresult SetFieldValue(const char *fieldname, const char *val, int len);

OField:
oresult GetValue(const char **val, int *len) const;
oresult SetValue(const char *val, int len);

OParamArray:
oresult GetValue(const char **val, int *len, int index) const;
oresult SetValue(const char *val, int len, int index);

OParameter:
oresult GetValue(const char **val, int *len) const;
oresult SetValue(const char *val, int len);

OParameterCollection:
OParameter Add(const char *name, const char *value, int len, int iotype, int serverType);

サンプル・コードは、¥ORACLE_HOME¥OO4O¥CPP¥WORKBOOK¥RAWディレクトリに提供しています。
 

ORACLM32.LIBのリンク付けを試行した場合のエラー

最近のリリースのC++クラス・ライブラリに同梱されたORACLM32.LIBは、VC++ 6.0より以前のリンカーでは認識されません。

ApartmentThreaded(デフォルト)オプションを使用したOStartup

OSTARTUP_MULTITHREADEDオプションを使用せずにC++クラス・ライブラリからOStartupをコールすると、
同じユーザー名、パスワードおよび接続別名による接続が共有されます。これは、バージョン2.3以前との下位互換性を確保するためのものです。

VC++におけるデータ制御の使用

エラー条件により、MFC42.DLLに例外が発生します。たとえば、データ制御とともにVC++アプリケーションを実行していると、他の条件下ではOIPエラーとなる無効なデータ入力により、MFC42.DLLで未処理の例外が発生します。

IIS/ASP

IIS

IISでは、OO4Oのインスタンス化に<OBJECT>タグを使用する必要があります。

<OBJECT RUNAT=Server SCOPE=Application ID=OraSession PROGID="OracleInProcServer.XOraSession"></OBJECT>

アプリケーション(「OraSession」)構文を使用せずにOraSessionオブジェクトを参照するのみで、このオブジェクトにアクセスできます。SCOPE=Applicationにより処理されます。

サンプルのglobal.asaファイルを次に示します。

<OBJECT RUNAT=Server SCOPE=Application ID=OraSession PROGID="OracleInProcServer.XOraSession"></OBJECT>
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
End Sub

Sub Application_OnEnd
End Sub

</SCRIPT>

ASPでのLONGおよびLONG RAW列の読取り

OraFieldオブジェクトのメソッドGetChunkByteExを使用して、ASPからLONGおよびLONG RAW列を読み取る必要があります。詳細は、オンライン・ヘルプを参照してください。かわりにLOBを使用することをお薦めします。

Oracle Data Control

Oracle Data Controlに複数の編集コントロールがバインドされている場合、データ表示の問題が存在する可能性があります。回避策として、かわりにリッチ・テキスト・コントロールを使用してください。