44
サード・パーティ製品での サード・パーティ製品での サード・パーティ製品での サード・パーティ製品での Oracle ODBCドライバの使用 ドライバの使用 ドライバの使用 ドライバの使用 Rick Schultz, Associate Technical Analyst Microsoft Languages Oracle Worldwide Customer Support Revision 20:10032000 [CR File ID:111334]

サード・パーティ製品での Oracle ODBCドライバの …otndnld.oracle.co.jp/tech/linux_win/pdf/ODBCFAQ.pdf- 1 - I. 概要 このホワイト・ペーパーは、様々なサード・パーティ製品の使用時に発生するODBC関連

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

サード・パーティ製品でのサード・パーティ製品でのサード・パーティ製品でのサード・パーティ製品での Oracle ODBCドライバの使用ドライバの使用ドライバの使用ドライバの使用

Rick Schultz,

Associate Technical Analyst

Microsoft Languages

Oracle Worldwide Customer Support

Revision 20:10032000

[CR File ID:111334]

目次目次目次目次 I. 概要 ................................................................................................................................................................ 1 II. 合致と準拠: ドライバの性能 .................................................................................................................... 2 III. ODBCの様々な使用方法............................................................................................................................ 3 IV. 経緯 ............................................................................................................................................................. 4 V. サポートされているドライバのバージョン ........................................................................................... 4 VI. マルチバイト・キャラクタ・セットと各国語対応 .............................................................................. 5 VII. ダイナセットを開く時間およびスクロール速度 ................................................................................ 5 VIII. ODBCアドミニストレータの使用 ......................................................................................................... 6

A. ODBCアドミニストレータのバージョンの判別 ................................................................................. 6 B. Oracle DSNの構成 .................................................................................................................................... 7 C. DSNのオプション(バージョン8.xのドライバ) ............................................................................... 7 D. パフォーマンス改善のヒント ............................................................................................................... 8 E. DSNの「構成」ダイアログ・ボックスが表示されない(ODBCドライバの設定) ...................... 8 F. ODBCコールのトレース ......................................................................................................................... 9 G. SQL*Net接続のトレース ........................................................................................................................ 9 H. ODBC DSN構成時のその他の問題 ...................................................................................................... 10

IX. 必須のビューおよび表のアクセス........................................................................................................ 10 X. データベースのセキュリティとODBC.................................................................................................. 10 XI. 読取り専用ダイナセットの原因............................................................................................................ 11 XII. スレッド例外とマルチスレッド .......................................................................................................... 11 XIII. 結合とOracle ODBCドライバ(ORA-0933およびORA-0936) ....................................................... 11 XIV. ODBCを介したストアド・プロシージャのコール ........................................................................... 12 XV. ODBCを介するLONGおよびLONG RAWデータ................................................................................ 13

A. MSQuery使用時のLONGデータの切捨て ........................................................................................... 13 B. LONG列に対するOracle 8.0ドライバ使用時に表示されるORA-3127 ............................................. 13

XVI. Oracle8のLOB(LONGまたはラージ・オブジェクト)列 .............................................................. 14 A. BLOBフィールドに対するデータの不正挿入(データの破壊).................................................... 14 B. BLOBフィールドへの挿入時に表示されるORA-932 ........................................................................ 14

XVII. SQL文の最大長..................................................................................................................................... 14 XVIII. 「Specified Driver Could Not be Loaded」エラー ............................................................................ 15

A. ORA-3121:............................................................................................................................................... 15 B. ORA-12154: ............................................................................................................................................. 15

XIX. 「Driver Not Capable」エラー ............................................................................................................. 16 XX. 「Conformance Error」または「Function Not Supported by Driver」エラー .................................... 16 XXI. Microsoft® Jet - 具体的な問題(DAO) ......................................................................................... 16

A. Visual Basic 4.x(VB4)、5.x(VB5)または6.x(VB6)を使用する場合 ................................... 16 B. Microsoft® Jetと結合.............................................................................................................................. 16 C. Microsoft® Jetと複数の接続 .................................................................................................................. 17 D. Jetでのパブリック・シノニム(「表またはビューが存在しません」) ...................................... 17 E. Microsoft® Jetでの#Deleted行................................................................................................................ 17 F. 接続タイムアウトのトラブルシューティング(ORA-1013) ........................................................ 17 G. Jet/DAOと日付 ....................................................................................................................................... 19 H. 自動コミット......................................................................................................................................... 20 I. データ型のマッピング .......................................................................................................................... 20 J. Microsoft® Jetの構成 ............................................................................................................................... 21 K. 参考資料................................................................................................................................................. 22

XXII. Microsoft Access固有の問題 ................................................................................................................ 22 A. Access(MDB)データベースにリンクされている表の取扱い ...................................................... 22 B. 表の連結時に「ハング」したように見えるMicrosoft Access ......................................................... 22

C. Microsoft Accessの中からシステム表を表示できない ...................................................................... 22 XXIII. Oracle ODBCドライバとMFCとの使用 ............................................................................................ 22 XXIV. ODBC経由の日付と時刻.................................................................................................................... 23 XXV. その他のODBC SQLエスケープ ....................................................................................................... 23

A. 間隔のエスケープ・シーケンス ......................................................................................................... 23 B. スカラー関数のエスケープ ................................................................................................................. 24

XXVI. Microsoft® Visual Basicを使用したストアド・プロシージャ ....................................................... 24 A. プログラム例......................................................................................................................................... 24 B. Visual Basicエラー40041 - オブジェクトコレクション: テキストで指定された項目はありません .............................................................................................................................................................. 25

XXVII. Microsoft® Visual Basicを使用したRDO ......................................................................................... 25 XXVIII. IIS、MTSおよびADOの問題 .......................................................................................................... 27

A. ODBC経由の接続時に表示されるORA-12641 ................................................................................... 27 B. ASPまたはIDCを使用して接続できない(ORA-1017) .................................................................. 27 C. IIS/ADOで正常に機能しない数値列.................................................................................................... 28 D. ADOを使用した接続時のハングまたはORA-12203.......................................................................... 28 E. 接続プーリングのODBCサポート(MTS/IIS) ................................................................................ 28

XXIX. ODBC API 3.0仕様の問題 .................................................................................................................. 28 A. ODBCバージョン3.xとOracle ODBCドライバ ................................................................................... 28 B. SQLSTATE 08003................................................................................................................................... 29 C. SQLSTATE 01000................................................................................................................................... 29 D. ファイルDSN......................................................................................................................................... 29 E. ファイルDSNを使用した場合のSQLSTATE 08001........................................................................... 29 F. MSQuery 97ではファイルDSNのみを使用 .......................................................................................... 30 G. ファイルDSNの手動構成 ..................................................................................................................... 30 H. データの取出し時にハングするExcel 97 ........................................................................................... 30

XXX. ODBC 3.5仕様の問題 ........................................................................................................................... 30 XXXI. Crystal Reports(Seagate(現Crystal Decisions))での問題 ......................................................... 31 XXXII. 準拠エラー ........................................................................................................................................ 33

A. 準拠エラー - 7751または7713: Access 2.0またはVB 3の使用時 ................................................. 33 B. 準拠エラー - 7711: 16ビットAccess(1.0または2.0)の使用時 .................................................. 33 C. 準拠エラー - 7711: Access 97(または他の32ビットODBCアプリケーション)の使用時 .... 34 D. 準拠エラー - 7739: ビットマップ索引を持つ表の使用時 .......................................................... 34 E. 準拠エラー - 7746: ビットマップ索引を持つ表の使用時........................................................... 34 F. 準拠エラー - 7768: Oracle ODBCドライバ8.0の使用時に、NULL DATEデータが表に含まれている場合 ...................................................................................................................................................... 34 G. 準拠エラー - 7776: Access 2.0の使用時.......................................................................................... 34

XXXIII. その他の問題 ................................................................................................................................... 34 A. 管理者により作成されたシステムDSNが、他のユーザーに表示されない。.............................. 34 B. ドライバをインストールした後、そのドライバがODBCアドミニストレータに使用可能として表示されない。........................................................................................................................................... 35 C. SQLSTATE 01000、Native Error Code 444........................................................................................... 35 D. SQLSTATE 01000、Native Error Code 3121(ORA-3121) ............................................................... 36 E. SQLSTATE IM003、システム・エラー・コード 1157..................................................................... 36 F. Oracle 8.0のドライバで、オブジェクト名の大/小文字を保持しない ............................................. 36 G. Oracle8を使用する際のアンダースコア「_」付きのスキーマ名および表名 ................................ 37 H. Oracle Names Server使用時のODBCT32.EXE(またはMSQuery)を使用した接続でのアクセス違反(GPF)(スタック関連のクラッシュまたはエラー).................................................................... 37 I. ODBC経由のOPS$(OS認証) .............................................................................................................. 37 J. Oracle8ドライバでの非同期サポート・オプションなし ................................................................... 38

K. フェイルセーフおよびOracle Real Application ClustersでのODBCサポート ................................. 38 L. DSNを指定しない接続 .......................................................................................................................... 38 M. 数値(11)列タイプ使用時の「型の不一致」エラー..................................................................... 38 N. * select使用時の不正な列順序.............................................................................................................. 38 O. VARCHAR列を空白文字またはNULL文字で更新しようとしたときに表示される[Oracle][ODBC]Invalid precision value (#0) ............................................................................................... 39 P. 即時ロックのサポート ......................................................................................................................... 39

- 1 -

I. 概要概要概要概要

このホワイト・ペーパーは、様々なサード・パーティ製品の使用時に発生するODBC関連の問題のうち、最も一般的なものについて説明したものです。ご使用の製品がこの説明の中に含まれていない場合でも、同様の原則があてはまる可能性があります。このドキュメントは、ODBCドライバの新規リリースおよびおよびテストを実施するその他のサード・パーティ製アプリケーションにあわせて更新されるため、常に最新のコピーを入手するようにしてください。最新のコピーは、OTN Japan[http://otn.oracle.co.jp/]もしくはサポート[http://support.oracle.co.jp]から入手できます。

ODBCの基本についてまず説明します。

一般的なODBC接続のコンポーネントを次の図に表します。

図からわかるように、接続には多くのレイヤーが含まれ、複数のベンダーのコンポーネントが関与することもあります1。

1 ADOのような新しい製品の場合は、別のレイヤー(OLEDB-ODBCブリッジなど)も含まれます。

- 2 -

ODBCアプリケーションは任意のベンダーにより提供され、ドライバ・マネージャはMicrosoft社、Intersolv社またはその他のベンダーから提供され、ODBCドライバ自体は(オラクル社をはじめとして)さらに多くのベンダーから提供されています。SQL*Netレイヤーはオラクル社から提供されます。ADO(Active Data Objects)などの新しいテクノロジが登場するに伴い、接続に使用されるレイヤーの数はさらに増加します。このホワイト・ペーパーは、Oracle 7.xおよび8.xのRDBMSでオラクル社が提供するODBCドライバを使用するときの問題点について解説します。Microsoft社から提供されるデフォルトのドライバ・マネージャの使用が前提です。これらのコンポーネントにはそれぞれバージョン固有の相互依存性があります。ODBCドライバおよびSQL*Netだけでなく、ドライバ・マネージャ・レイヤーにも特定のバージョン・ナンバーが対応付けられています。ODBC関連の問題は、互換性のない異なるバージョンの構成要素の混在が原因で発生することがよくあります。オラクル社では、ODBCドライバをダウンロード・サイトにODBCドライバのバージョンとSQL*Netのバージョンの対応表を掲載しています。さらに、オラクル社カスタマ・サポート・センターの社外向けFTPサイトからは、現在ダウンロード可能なドライバに対するパッチを入手できます。できるかぎり最新のドライバを入手してご使用ください。旧版のドライバにバグ修正や最新バージョンへのアップグレード・サポートは、オラクル社では提供していません。最新のドライバが出荷メディア(CD-ROMなど)に同梱されることはほとんどありませんが、OTN JapanやサポートのWebサイトから電子的に入手できます。

II. 合致と準拠合致と準拠合致と準拠合致と準拠: ドライバの性能ドライバの性能ドライバの性能ドライバの性能

ODBC仕様の最初のバージョンでは、次の2つの合致レベルが定義されていました。

• コア

• レベル1

バージョン2では、レベル2の合致レベルが定義されました。ODBC API仕様のバージョン2.5では合致レベルは追加されていませんが、レベル2のコールがいくつか新しく追加されています。ODBC API仕様のバージョン3.0でも新しい合致レベルは追加されていませんが、次のような変更がありました。

• レベル2 APIコールの追加

• すべてのレベル1コールの廃止

これにより、特定のドライバの性能を説明するときに、かなり混乱が生じる可能性があります(まだ触れてもいませんが、さらにSQLの文法の合致レベルもあります)。Oracleのドライバは基本的に次のように分類されます。

• バージョン1.16.xまでのドライバは、すべてODBC API仕様バージョン2.0のレベル1に準拠しています。

• バージョン2.xから2.5までのドライバは、すべてODBC API仕様バージョン2.5のレベル2に準拠しています。

• バージョン8.0.3.xのドライバも、ODBC API仕様バージョン2.5のレベル2に準拠しています。

• バージョン8.0.4.xより後のドライバは、ODBC API仕様バージョン3.0のレベル2に準拠しています

- 3 -

• バージョン8.0.5.8以降のドライバは、ODBC API仕様バージョン3.51のレベル2に準拠しています。

SQLの文法に関する合致レベルも、ドライバの進化に伴い着実に拡大しています。これ自体は特記すべきことではありません。ほとんどがドライバ組込みのパーサーの機能であり、パーサーの機能はリリースが新しくなるたびに改善されているためです。

III. ODBCの様々な使用方法の様々な使用方法の様々な使用方法の様々な使用方法

ODBCテクノロジをデータ・アクセスに利用する方法としては、最初は、プログラムからODBC APIを直接使用するか、Microsoft社提供のJet データベース・エンジンを使用するかの2種類しかありませんでした。ODBC APIの成長に伴い、新たにいくつかの方法が付け加えられ、今では次のような方法を使用できるようになっています(他の方法もありますが、次に示す方法が最も一般的です)。

• ODBC API

• Microsoft Access/Jetエンジン

• RDO2(リモート・データ・オブジェクト)

• OLEDB/ODBCブリッジを使用したADO(ActiveXデータ・オブジェクト、別名OLEDB)

以上の方法では、使用するODBCドライバについてそれぞれ異なる要件があります。たとえば、次のとおりです。

• RDOでは、ドライバが最低限ODBC APIのレベル2仕様に完全に準拠していることが前提です。ドライバのカーソル・サポートに関していくつかその他の要件があり、RDOにより提供される機能レベルに影響することがあります。

• ADOでは、ODBCドライバがODBC APIのレベル3仕様に完全に準拠していることが前提です3。

Microsoft社が再配布用に提供しているODBCコア・コンポーネントにも様々なバージョンがあります。コア・コンポーネントには、ODBCアドミニストレータおよびODBCドライバ・マネージャなどが含まれます。これらのコンポーネントは、現在はMicrosoft Data Access Components(MDAC)と呼ばれています。リリース2.5が、NT 4.0およびWindows 95とともに最初に出荷されたバージョンです。これらのコンポーネントをアップグレードするには3つの方法があります。

• OSパッチまたはアップグレードのインストール(例としては、NT 4.0用のService Pack 6)

• 新規バージョンがバンドルされているMicrosoft(またはその他のベンダー)製品のインストール

• http://www.microsoft.com/japan/developer/data/(USサイト:http://www.microsoft.com/data)からのアップデートのダウンロードとインストール

2 このホワイト・ペーパーを作成した時点では、Microsoft社はRDOを廃止してADOに置き換えています。 3 使用されるADOのバージョンにより、ドライバがどの3.x仕様に準拠すべきかが決まります。

- 4 -

これらのアップグレードは、通常、オペレータへの通知なしで行われるため、異なるODBCドライバによる問題を引き起こす原因になる可能性があります。[このような問題のいくつかは、後述の具体的な問題に関する項で詳しく説明します。]

IV. 経緯経緯経緯経緯

1. オラクル社提供の最初のODBC 1.xドライバは、リリース1.11.xから(次の正式バージョンである)リリース1.15.xの間に完全に作成しなおされているため、以前のドライバとはコード・ベースが異なります。同様に、バージョン8.xのドライバも2.xのドライバとはコード・ベースが異なります。この結果、以前のバージョンでは修正されていたバグが後のバージョンで再現することもありました。

2. ODBCドライバのサポートはここ何年間かで変動していましたが、オラクル社ではリリース2.5以降(特に8.xシリーズ)では、動作するだけではなく機能も豊富なドライバの提供を約束しています。

3. 業界の意見とは対照的に、オラクル社では独自のODBCドライバを開発しサポートしています。Oracleデータベース用のドライバを作成しているサード・パーティ・ベンダーは多数あります。無償のもの(Microsoft ODBC for Oracleなど)もあれば、有料のもの(Merant(Intersolv)社のOracle ODBCドライバなど)もあります。このホワイト・ペーパーでは、オラクル社が提供するODBCドライバのみについて説明します。

V. サポートされているドライバのバージョンサポートされているドライバのバージョンサポートされているドライバのバージョンサポートされているドライバのバージョン

サード・パーティ製ドライバとは異なり、オラクル社提供のドライバの構成はクライアント・インストールに厳密に準拠しています4。クライアント・コンポーネントをアップグレードする前に、次の表で準拠状況をチェックしてください(訳注:この表はこの資料が書かれた時点の情報です)。

リリースリリースリリースリリース プラットフォームでサポートされプラットフォームでサポートされプラットフォームでサポートされプラットフォームでサポートされるオペレーティング・システムるオペレーティング・システムるオペレーティング・システムるオペレーティング・システム

SQL*Net要件要件要件要件 RDBMS Required Support Files

8.1.6.1.0 Windows NT 4.0、 Windows 95/98/2000

8.1.6 7.3.4以降 8.1.6

8.1.5.5.0 Windows NT 4.0、Windows 95/98 8.1.5 7.3.4以降 8.1.5 8.0.6.1 Windows NT 4.0、Windows 95/98 8.0.6 7.3.4以降 8.0.6 8.0.5.8.0 Windows NT 4.0、Windows 95/98 8.0.5 7.3.4以降 8.0.5 2.5.3.2.7 Windows NT(3.51または4.0)、

Windows 95/98 2.3.x 7.3以降 7.3

一般に、特定のクライアント・ソフトウェアに同梱されるODBCドライバは、そのバージョンのクライアントに対して有効です。クライアント・ソフトウェアの旧版のCDから古いドライバがインストールされることがよくあるので、インストールするドライバのバージョンが、現在使用中のOracleクライアント・ソフトウェアと互換性があることを確認してください。また、ドライバはOracleクライアント・ソフトウェアとは別個に頻繁に更新されるた

4 ここで「クライアント」とは、ドライバを使用するODBCアプリケーションのことを指しています。アプリケーションがデータベース・サーバー・マシンで実行される場合にも当てはまります。

- 5 -

め、使用中のOracleクライアント・インストール用の最新バージョンが入手可能になっている場合があります。このホワイト・ペーパーの作成時点では、オラクル社提供ドライバのバージョン1.xと2.0.xはすべて廃止されてサポートが打ち切られ、バージョン2.5.x以降に置き換えられています。さらに、8.0.3および8.0.4もサポートが打ち切られ、出荷されていません。

VI. マルチバイト・キャラクタ・セットと各国語対応マルチバイト・キャラクタ・セットと各国語対応マルチバイト・キャラクタ・セットと各国語対応マルチバイト・キャラクタ・セットと各国語対応

オラクル社提供のODBCドライバ5(8.0.xより以前)はシングルバイト仕様です。つまり、システム・キャラクタ・セット・レベルでもOracle NLS翻訳レベルでもUnicodeやその他のマルチバイト・キャラクタをサポートしていません。ODBCでのNLS使用には他にも問題があります。

• ODBC APIには、日付や時刻などの特定の項目について独自の仕様があります。

• ODBCドライバでは、一部の翻訳についてコントロール・パネルの地域設定を使用することがあります。オプションのトランスレータDLLを指定できることもあります。指定できる場合は、ドライバのデータソース(DSN)設定により制御されます。

OracleでのNLS翻訳はOracle Call Interface6(OCI)レイヤーで発生し、さらにODBCドライバに渡されて必要に応じて操作を加えられた後、クライアントに表示されます。これは、データはNLSを介して書式化された後で、ODBC API準拠のために書式化されることを意味します。(訳注:最新のODBC Driverのマルチバイト・キャラクタサポートは、Unicode(UCS2)キャラクタ・コードページを利用しています。そのためUnicodeを利用するWindowsアプリケーションとの間でUnicodeの互換性に起因する問題が起こります。問題の詳細については、OTN-Jのテクノロジー>テクノロジー Javaにある資料『JDBC 8.1.7上でのNLS環境における問題について』を参照してください。)

VII. ダイナセットを開く時間およびスクロール速度ダイナセットを開く時間およびスクロール速度ダイナセットを開く時間およびスクロール速度ダイナセットを開く時間およびスクロール速度

II節で説明した「高レベル」のODBCアクセス方式の多くでは、「ダイナセット」という概念を使用しています。これは、内容をRDBMSと同期させようとする「スマート」スナップショットと考えることができ、明らかに、単純な静的スナップショットよりもオーバーヘッドが大きくなります7。ダイナセットを開く時間およびスクロール速度に悪影響を及ぼす主な要因は、選択する列の数と出力される問合せ表の数です。列は必要なものだけを選択し、列の出力はすべてSELECT TABLEを使用して行うようにします。

SELECT *のほうが便利ですが、速度が遅くなります。また、コンカレント・アプリケーションの場合には複数のユーザーの影響も考慮する必要があります。

ダイナセットは、RDBMSに対してユーザーが加える変更を反映するときに、ダイナセット自体を使用しようとします。その他のユーザーが加えた(またはRDBMSがストアド・プロ

5 Oracleでは漢字固有の日本語ODBCドライバをサポートしています。このドライバは、日本語マルチバイト・キャラクタ・セットをサポートします。 6 これは、Oracleに接続するプログラム用の「低レベル」APIです。 7 スナップショットという用語は、ODBCとOracle RDBMSとでは意味が異なります。ODBCスナップショットは更新できますが、リフレッシュされるまで変更は内容に反映されません。

- 6 -

シージャを使用して自分自身に加えた)変更は、ダイナセットのリフレッシュまたは更新が行われるまで、ダイナセットには認識されません。ドライバによっては、RDBMSに対して加えられるデータ変更をリアルタイムにサポートするものもありますが、Oracleドライバではこの種のダイナセットをサポートしていません。データベース側ダイナセットに関するMicrosoft®の定義では、RDBMSが両方向カーソルをサポートすることが暗黙の前提となっています。Oracle RDBMSカーソルは、前方スクロールのみです。さらに、RDBMSプラットフォームの中には「ダーティ・リード(内容を保証しない読込み)」の概念をサポートするものもあります。これは、ユーザーが変更してまだコミットしていないデータを他のユーザーが表示できるというものですが、Oracleではこのようなデータ・アクセスもできないようになっています。

スナップショットはダイナセットよりも速く開いたりスクロールできることがよくあります。ダイナセットの機能が必要ない場合は、スナップショットを使用します。これは、ODBCアプリケーションをマルチユーザーのクライアント/サーバー環境で使用するように設計するときに、ユーザーの観点から慎重な考慮が必要であることを意味します。これは、特に共有表をアクセスする場合にあてはまり、ユーザーが相互にロックしてアクセスできなくならないようにする必要があります。

VIII. ODBCアドミニストレータの使用アドミニストレータの使用アドミニストレータの使用アドミニストレータの使用

ODBCアドミニストレータはMicrosoft社が提供するODBCコンポーネントで、これを使用するとODBCデータソース(通常はデータソース名(DSN)と呼ばれる)を構成し使用できます。

A. ODBCアドミニストレータのバージョンの判別アドミニストレータのバージョンの判別アドミニストレータのバージョンの判別アドミニストレータのバージョンの判別

16ビット用にリリースされた最後のODBCアドミニストレータはバージョン2.5です。最新の32ビット版でのバージョンは3.52で、MDAC 2.5アップグレードに含まれています。通常、ODBCアドミニストレータはコントロール・パネルのアプレットとして実行されます(オラクル社ではODBCドライバとともにODBCアドミニストレータを再配布していますが、コントロール・パネルに含まれているアドミニストレータの方が新しいことがあるので、コントロール・パネルのアドミニストレータを優先して実行してください)。アドミニストレータのダイアログの上部にタブがある場合はバージョン3.xで、タブがなければバージョン2.xです。ODBC共通コンポーネントの最新版は、Microsoft社のWebサイト(日本:http://www.microsoft.com/japan/developer/data/ US: http://www.microsoft.com/data)から入手できます。

1. ODBCアドミニストレータのバージョン履歴アドミニストレータのバージョン履歴アドミニストレータのバージョン履歴アドミニストレータのバージョン履歴

Microsoft製品製品製品製品 ODBCアドミニストレーアドミニストレーアドミニストレーアドミニストレータのバージョンタのバージョンタのバージョンタのバージョン Windows NT 2.50.3321 Visual Studio 97/ Office 97 PE 3.00.2301. Windows NT sp3 3.00.28.22. Mdac 1.5 3.50.32.14. Visual Studio 6 EE 3.510.3002.13 (Mdac 2.0) Mdac 2.1 3.510.(バージョンにより、3510.0から4202.0まで)

- 7 -

Mdac 2.5 3.520.4403.2. Mdac 2.5 sp1 3.520.5303.2. Mdac 2.6 3.520.6526.0

B. Oracle DSNの構成の構成の構成の構成

Oracle ODBCドライバの構成は、ODBCドライバのバージョンが新しくなるたびに少しずつ変更されていますが、機能するOracle DSNの作成に絶対必要な情報は2種類のみです。

1. DSN名(任意の名前)

2. 有効なSQL*Net接続文字列(TNSエイリアスまたはOracle8サービス名)

Oracle8では、この接続文字列はサービス名と呼ばれることがあり、7.3ドライバのいくつかのバージョン(およびサード・パーティ製ドライバのいくつか)ではサーバー名と呼ばれることがあります。これは、サーバーのネットワーク名やSID名を使用することを意味するものではなく、SQL*Netレイヤーを構成したときに構成した実際のTNSエイリアスを使用します。TNSエイリアスが何に構成されているかを確認するには、 Oracle_Home¥network¥Admin(または Net80¥admin)ディレクトリにあるTNSNAMES.ORAファイル(テキスト・ファイル)を調べます。この情報を表示するには、SQL*Net Easy Config(またはSQL*Netのバージョンと構成するドライバによってはOracle Net Easy Config)プログラムを使用することもできます。ローカルRDBMSの場合は、RDBMSのインストール時に作成されるBeq-Localエイリアスを使用します。わからない場合(あるいはNames Serverを使用している場合)は、Oracle DBAまたはSQL*Net接続を構成した担当者に尋ねることが必要な場合もあります。

C. DSNのオプション(バージョンのオプション(バージョンのオプション(バージョンのオプション(バージョン8.xのドライバ)のドライバ)のドライバ)のドライバ)

8.xドライバでサポートされているDSNの構成可能オプションを、次の表に示します。これは、手動のDSN構成をサポートするため、あるいはDSNのない接続を(プログラムで)使用するために提供されています。これらは、SQLDriverConnect() ODBC APIコールのCONNECTパラメータでサポートされているオプションのキーワードです。

キーワードキーワードキーワードキーワード 意味意味意味意味 DSN ODBCデータソース名 UID ユーザーIDまたはユーザー名 PWD パスワード(空のパスワードの場合は、PWD=;と指定します) DBQ サービス名 DBA データベース属性(W=書込みアクセス、R=読取り専用アクセス) TLO トランスレーション・オプション TLL トランスレーション・ライブラリの名前 PFC プリフェッチ数(ゼロより大きい値を指定します) APA アプリケーション属性 FEN フェイルオーバー使用可能(T=フェイルオーバー使用可能) FRC フェイルオーバー再試行回数(数値) FDL フェイルオーバー遅延(数値) LOB LOBの書込み可(T=LOB使用可能)

- 8 -

RST 結果セット(T=結果セット使用可能) FRL Oracle LONG列の強制取出し(T=LONGの強制取出しが使用可能) MTS Microsoftトランザクション・サーバー・サポート(T=使用禁止、F=使用可能)(8i

のみ) QTO 問合せタイムアウト・オプション(T=問合せタイムアウト使用可能) CSR カーソル・クローズ使用可能(T=カーソル・クローズ使用可能、F=(デフォルト)

カーソル・クローズ使用禁止)

D. パフォーマンス改善のヒントパフォーマンス改善のヒントパフォーマンス改善のヒントパフォーマンス改善のヒント

次のオプションを1つ以上設定すると、Oracle 8.x ODBCドライバのパフォーマンスを向上させることができます。

「ODBCドライバ・セットアップ」ウィンドウで、次のオプションの選択を解除します。

− LOBを有効化

− 結果セットを有効化

− カーソル・クローズを有効化

さらに次のオプションも選択するか、または上記オプションの選択を解除せずに次のオプションだけを選択します。

− MTSサポートを無効化(8iのみ)

「ODBCドライバ・セットアップ」ウィンドウのその他のオプションによってもパフォーマンスが向上することがあるので、アプリケーションでこれらのオプションをテストしてみてください。

使用する必要のあるオプションの選択が解除されていないことも確認してください。

E. DSNの「構成」ダイアログ・ボックスが表示されない(の「構成」ダイアログ・ボックスが表示されない(の「構成」ダイアログ・ボックスが表示されない(の「構成」ダイアログ・ボックスが表示されない(ODBCドライバの設定)ドライバの設定)ドライバの設定)ドライバの設定)

これは、DOSまたはシステムの検索パスにORACLE_HOME¥BINディレクトリが含まれていないことが原因で発生する可能性があります。これが原因かどうかを検証する必要があります。MSDOSプロンプトを開き、PATHと入力し、[Enter]キーを押します。パスを調べて、ORACLE_HOME¥BINディレクトリが含まれていることを確認します。パスが正しくない場合は、次のようにします。

• AUTOEXEC.BATを調べて、PATH文の構文が正しいことと(たとえば空白があると正しくありません。また、構文が正しくないとWindowsでは文全体が無視されます)、適切なORACLE_HOME¥BINディレクトリが含まれていることを確認します。

• AUTOEXEC.BATでPATH文が正しくても、起動後のMSDOS環境ではパスが正しくない場合は、ネットワーク起動バッチ・ファイルまたは必須プロファイルによりパスが上書きされていないかどうかをネットワーク管理者に確認する必要があります。PCがNovellネットワーク上にあり、PCにWindows 95がインストールされていると、これが発生することがあります。

- 9 -

F. ODBCコールのトレースコールのトレースコールのトレースコールのトレース

ODBCレイヤー(具体的にはMicrosoft® Jetエンジン)により生成されるSQLは、RDBMSに送信されるとユーザーが想定するものとはかなり異なる場合があります。ODBC APIを直接使用していないかぎり、ほとんど常にそうなります。問合せの結果が一定しなかったり、SQL*Plus問合せで生成される結果と異なることがあります。これを理解しておくと、SQLの問題の解決に役立ちます。ODBCトレースにより、ODBCアプリケーションが実際に何をODBCドライバに送信しているかがわかります。SQL*Netトレースでは、ODBCドライバが実際に何をRDBMSに送信しているかがわかります。

1. トレースのオントレースのオントレースのオントレースのオン/オフオフオフオフ

単純なODBCトレースは、ODBCアドミニストレータを使用してオンにすることができます8。SQL*Netクライアント・トレースを使用可能にすると、実際にどのSQLが適用されているかの判断に役立ちます。ODBCアドミニストレータ2.5でODBCトレースを使用可能にするには、「オプション」の「ODBC呼び出しのトレース」を選択します。ここでトレース出力ファイル名とその場所も指定できます。デフォルトはSQL.LOGです(アドミニストレータの3.xでは、この情報を含む「トレース」タブがあります)。

2. トレースが生成されないトレースが生成されないトレースが生成されないトレースが生成されない

ODBCアドミニストレータを使用してODBCトレースを使用可能にしてもトレース・ファイルが生成されない場合は、ODBC共通コンポーネントを(Microsoft社がダウンロード用に用意しているMDACキットの1つから)再インストールすることを考える必要があります。これは、基本のODBCコア・コンポーネントに問題があることを示しています。ODBCトレースを生成するのはコア・コンポーネントです。または、単純に、アプリケーションでODBC APIコールを発行する場所まで到達していないことも考えられます。

G. SQL*Net接続のトレース接続のトレース接続のトレース接続のトレース

SQL*Netクライアント・トレースを使用可能にするには、クライアントのORACLE_HOME¥Network¥Adminディレクトリ(Net8 8.0の場合は、NET80¥Adminディレクトリ)にあるSQLNET.ORAファイルに次の変更を加えます。その前に、必ず既存その前に、必ず既存その前に、必ず既存その前に、必ず既存ののののSQLNET.ORAファイルのバックアップ・コピーを作成してください。ファイルのバックアップ・コピーを作成してください。ファイルのバックアップ・コピーを作成してください。ファイルのバックアップ・コピーを作成してください。

項目項目項目項目 値値値値 Automatic_ipc OFF Trace_unique_client ON Trace_level_client 16 Trace_directory_client [path]* Trace_file_client(これはオプションです) [filename]

* [path]は、トレース・ファイルの書込み先の有効なディレクトリです。これがルート・ディレクトリの場合は、後に円記号(c:¥)を含める必要があります。

8 Windows NTまたはWindows 95などのプラットフォームを使用する場合は、正しいトレースを使用可能にするようにします。16ビット・ドライバは16ビットのアドミニストレータで、32ビット・ドライバは32ビットのアドミニストレータで、それぞれトレースを使用可能にする必要があります。

- 10 -

H. ODBC DSN構成時のその他の問題構成時のその他の問題構成時のその他の問題構成時のその他の問題

前項のパスの指定が間違っていない場合は、インストールされているSQL*NetとRequired Support Files(RSF)が、構成対象のODBCドライバ用の正しいバージョンであることを確認します。Microsoft社のWebサイトから最新版のODBC共通コンポーネントをダウンロードしてインストールし、基になるODBCのインストール自体に問題があった場合に修正されるようにすることもお薦めします。

IX. 必須のビューおよび表のアクセス必須のビューおよび表のアクセス必須のビューおよび表のアクセス必須のビューおよび表のアクセス

通常、ODBCエンジンではOracleデータ・ディクショナリにある特定のDBAビューへのアクセスを必要とします。主なビューは次のとおりです。

• ALL_CATALOG

• ALL_CONSTRAINTS

• ALL_OBJECTS

操作の種類によっては、他の表(それぞれALL_という接頭辞付き)が必要になることもあります。ODBC接続が正しく機能するには、ログオンのユーザー名/パスワードにこれらのビューに対する読取りアクセス権が必要です。Microsoft® Jet(Microsoft® Access、Microsoft® Visual Basicなど)を使用するアプリケーションで表を更新できるようにするには、表に対する主キー制約9が必要です。Microsoft® Jetはこれらのカタログ・ビューを介して主キー制約9を検査します。この制限は、SQL*PlusなどのOracle固有のツールには当てはまりません。Oracle固有のツールではROWIDを使用して変更対象の行を一意に識別します。

X. データベースのセキュリティとデータベースのセキュリティとデータベースのセキュリティとデータベースのセキュリティとODBC

データベース管理者にとっては、ODBCアプリケーションの使用によりユーザーのセキュリティが非常に複雑になる可能性があります。固定のユーザー名およびパスワードと、既存のデータベース・アプリケーション(Oracle Formsやその他の3GLアプリケーションなど)に対する適切な更新権限がユーザーに付与されている場合、そのユーザーは(これらのアプリケーションを介して)RDBMSの表を変更できます。Microsoft AccessなどのアプリケーションとODBCを一緒に使用すると、ユーザーは通常使用するアプリケーションにコーディングされているビジネス・ロジックをバイパスして、簡単にRDBMS表をブラウズし、表を直接編集できます。要するに、ODBCはユーザーが付与されているRDBMS権限をすべて継承するということです。ODBCは、ユーザーに関するすべてのセキュリティをRDBMSレベルに任せます。Oracle用のODBCドライバのほとんどが、(SQL*Plusが使用しているような)製品ユーザー・プロファイルを利用していません。承認されたアプリケーションのみがデータを変更できるようにするには、デフォルト以外のロールまたはプロファイルの実装が必要になることがあります。このようなロールやプロファイルは、アプリケーションが接続した後、アプリケーションにより設定されます。これは、ユーザー名/パスワードに対しては最低限の権限のみ(たとえばSELECTのみ)を付与しておき、必要な更新権限は

9 特定の列(または複数の列)に対する一意制約およびNOT NULL制約の組合せは、PRIMARY_KEYとみなされます。

- 11 -

ALTER USER...コマンドを使用して付与することを意味します。これらのロールや権限はデータベース管理者が制御します。

XI. 読取り専用ダイナセットの原因読取り専用ダイナセットの原因読取り専用ダイナセットの原因読取り専用ダイナセットの原因

Oracleではデータ・ディクショナリに情報を格納するため、Microsoft® Jetではシノニムに対する主キー制約を検査できません。このため、ODBC経由ではダイナセットが読取り専用になります。

ダイナセットが読取り専用になるもう1つの原因は、「SQLパススルー」の使用があります。これを使用すると、Microsoft® Jetが使用されなくなり、SQLが変更されないままRDBMSに渡されます。この欠点は、結果がすべて読取り専用になることです。Jet/DAOに関する固有の問題は、「Jet/DAO」の節を参照してください。

Oracleでは特定のオブジェクト(表やシノニムなど)が同じ名前を共有してもかまいませんが、ODBCではできません(実際は、ODBC自体はどちらでもよいのですが、Microsoft Jetで共有できません)。このようなオブジェクトにアクセスしようとするとエラーが返されます。このようなオブジェクトはODBC/Jet経由ではアクセスできません。他のアプリケーションでもこれと同じ制限が発生することがあります。

XII. スレッド例外とマルチスレッドスレッド例外とマルチスレッドスレッド例外とマルチスレッドスレッド例外とマルチスレッド

現在サポートされているOracle ODBCドライバでは、すべてマルチスレッドをサポートします(バージョン2.0以降)。32ビットOracle ODBCドライバのバージョン1.xとマルチスレッド・アプリケーションを一緒に使用すると、スレッド例外の問題が発生する可能性があります。マルチスレッドおよびスレッド・セーフのODBCドライバ(32ビットのバージョン2.x)が正しく機能するのは、Oracle RDBMSバージョン7.3.x以降のクライアント・ライブラリと、バージョン7.3以降のRDBMSのみです。

XIII. ジョインジョインジョインジョインととととOracle ODBCドライバ(ドライバ(ドライバ(ドライバ(ORA-0933およびおよびおよびおよびORA-0936))))

Oracleが配布したバージョン1.xのODBCドライバには、ODBC Join Escape構文またはOracle構文のいずれかを使用したJOIN文の(限定)サポートが含まれていました。バージョン2.xドライバにはJOIN操作のフル・サポートが含まれていますが、このバージョンのドライバでサポートされている唯一の構文はODBC JOIN Escape構文であり、Oracle構文ではありません(ただし、ほとんどのパススルー問合せではOracle構文を使用できます)。スキーマscottにあるサンプルのemp表およびdept表を使用した例を、次に示します。

Example Oracle Join SQL:=============================select dept.deptno, sum(sal)from dept, empwhere emp.deptno(+) = dept.deptnogroup by dept.deptno

Example ODBC Join SQL:=============================

- 12 -

select dept.deptno, sum(sal)from {oj dept left outer join empon dept.deptno = emp.deptno}group by dept.deptno 3つの表の結合を使用した完全なODBC構文使用例を、次に示します。

--SQL to create tables and populatecreate table table_one (one_id integer, one_desc char(20));create table table_two (two_id integer, two_desc char(20));create table table_three (three_id integer, three_desc char(20));insert into table_one (one_id, one_desc) values(1, 'TABLE1-1')insert into table_one (one_id, one_desc) values(2, TABLE1-2'')insert into table_one (one_id, one_desc) values(3, 'TABLE1-3')insert into table_two (two_id, two_desc) values(1, 'TABLE2-1')insert into table_two (two_id, two_desc) values(3, 'TABLE2-3')insert into table_two (two_id, two_desc) values(4, 'TABLE2-4')insert into table_three(three_id, three_desc) values(1, 'TABLE3-1')insert into table_three(three_id, three_desc) values(2, 'TABLE3-2')insert into table_three(three_id, three_desc) values(5, 'TABLE3-5')--the select statement (can be done in ODBCTEST).select one_id, one_desc,two_id, two_desc, three_id, three_desc from{oj table_one left outer join table_two on one_id=two_id},{oj table_one left outer join table_three on one_id=three_id} [37000: [Microsoft][ODBC driver for Oracle][Oracle]ORA-00923:FROMキーワードが指定の位置にありません。

このエラー・メッセージは、次のSQLを実行しようとしたときに発生します。

"SELECT xxxx.yy FROM xxxx, TRY WHERE ((xxxx.yy = www.zz(+)))"

これは現時点でサポートされていません。

XIV. ODBCを介したストアド・プロシージャのコールを介したストアド・プロシージャのコールを介したストアド・プロシージャのコールを介したストアド・プロシージャのコール

[「Microsoft® Visual Basicを使用したストアド・プロシージャ」の節も参照してください。]

ODBC経由でストアド・プロシージャをコールするVisual Basicの構文の例を次に示します。

db.ExecuteSQL("{CALL procedurename(param1,param2,param3)}") 注意注意注意注意: ここでは入力パラメータのみを想定し、各パラメータはリテラルとして文字列内に埋め込まれていることを想定しています。また、この構文はパッケージ・プロシージャには使用できません。パッケージ・プロシージャにはbegin ... end;構文を使用する必要があります。

前述の例では、dbは有効なデータベース・オブジェクトであることが前提です。MSQueryなどのツールを使用する場合は、二重引用符なしの{CALL ...}(ODBC Procedure Call Escape)構文を使用します。パラメータが何もなくても ( ) を指定する必要があります。出力パラメータはODBC合致レベル2(Oracle7 ODBCバージョン2.x)でサポートされています。Oracleレベル1ドライバ(バージョン1.x)ではこれをサポートしません。レベル2以上のドライバを使用する必要があります。Oracleドライバ7.3ではダイナセットを返しません。この機能

- 13 -

が最初に実装されたのは、バージョン8.0.5.xのドライバです。コール構文のかわりの構文を次に示します。

db.ExecuteSQL("BEGIN procedurename(param1,param2,param3); END;",SQLPASSTHROUGH) この構文ではSQLPASSTHROUGHパラメータを使用する必要がありますが、パッケージ・プロシージャ(packagename.procedurename())もコールできます。

ストアド・プロシージャの結果セットを返す方法は、Microsoft WebサイトのSupportのKnowledge Baseで次の項目を参照してください。

• Q147938 (RDO)

• Q126992 (DAO)

Microsoft社提供のOracle用ODBCドライバでは、PL/SQL表タイプを使用してこの機能をサポートしています。Oracle提供の8.0.5.xより前のバージョンドライバではこの機能をサポートしていません(バージョン8.0.5.xではREFカーソルを返すことによりPL/SQLで実装されています)。

ストアド・プロシージャからの単純な出力パラメータには、次のSQLを使用できます。

{call procname(?,?)} これはSQLExecute()に渡され、プログラムに定義した出力バインド変数('?'が指す変数)に対してSQLBindCol()またはSQLBindParameter()を呼び出します。[注意注意注意注意: この場合は、Begin; ... End;構文でも同様に機能します。]Oracle ODBCドライバ8.0.xを使用していて、ORA-6502またはORA-6512(あるいはその両方)を受け取った場合は、ドライバを8.0.3.0.1以降に更新し、MDACを最新版に更新する必要があります。

XV. ODBCを介するを介するを介するを介するLONGおよびおよびおよびおよびLONG RAWデータデータデータデータ

SQLParamData()およびSQLGetData()/SQLPutData()などの組合せを使用してLONGまたはLONG RAWデータを取り出す場合、RDBMSのLONG RAW列に対するデータ・ブロックの読取りおよび書込みには、32KBというサイズ制限(チャンク当たり)があります。LONG列にキャラクタ・データを挿入するには、バインド変数を使用する必要があります。一重引用符(' ')の中に文字列リテラルとして2001文字以上を挿入することはできません。

A. MSQuery使用時の使用時の使用時の使用時のLONGデータの切捨てデータの切捨てデータの切捨てデータの切捨て

MSQueryでは最大30000バイトの固定バッファが割り当てられるようです。データは個々には取り出しません。これはドライバ自体の問題ではなく、MSQueryの問題です。

B. LONG列に対する列に対する列に対する列に対するOracle 8.0ドライバ使用時に表示されるドライバ使用時に表示されるドライバ使用時に表示されるドライバ使用時に表示されるORA-3127

これはすでに認識されている問題(バグ番号666935)です。これは表内でのLONG列の位置に依存するため、可能な回避策の1つとしてLONG列を最後の列以外に変更する方法があります。これは、LONGデータを含む表の設計としては適切ではありません。行の連鎖や移行を助長することになるためです。DSNの構成ウィンドウにオプション

- 14 -

「LONG列の強制取出し」が表示されている場合は、これを選択します。このオプションが表示されない場合は、ODBCドライバを8.0.4.4以降に更新する必要があります。

XVI. Oracle8ののののLOB((((LONGまたはラージ・オブジェクト)列またはラージ・オブジェクト)列またはラージ・オブジェクト)列またはラージ・オブジェクト)列

Oracle ODBCドライバ8.0.4は、ODBC API仕様バージョン3に適合するOracle提供の最初のドライバです。このODBC APIのリリースよりも前にリリースされているドライバは、ODBC API仕様バージョン2.5のレベル2準拠のみをサポートしています。このドライバの最初のバージョンでは、Oracle8での新しいLOB列データ型に対する読込みアクセスが可能です。

バージョン8.0.5.1.xからは、書込みアクセスも可能です10。LOBデータ型にアクセスするには、LONGまたはLONG RAW列の場合のように、LOBデータ型を適切なODBCデータ型(LONG VARCHAR、LONG VARBINARY)としてバインドするか、OracleがMicrosoftに登録した新しいODBC APIデータ型(BLOB、CLOB)を使用します11。[注意注意注意注意: SQLDescribeColを使用すると新しいデータ型が報告されます。] これらの新規データ型の宣言は、Microsoft社から提供されているMDAC 2.0以降に含まれていますが、互換性を保つために適切なLONG VARxxxx型を使用してください。

A. BLOBフィールドに対するデータの不正挿入(データの破壊)フィールドに対するデータの不正挿入(データの破壊)フィールドに対するデータの不正挿入(データの破壊)フィールドに対するデータの不正挿入(データの破壊)

これはバグ番号764772で、Oracle ODBCドライバのバージョン8.0.5.2.0以降では修正済みです。データの挿入時に破壊が実際に発生します(データが切り捨てられます)。

B. BLOBフィールドへの挿入時に表示されるフィールドへの挿入時に表示されるフィールドへの挿入時に表示されるフィールドへの挿入時に表示されるORA-932

Oracle ODBCドライバではバージョン8.0.5.1.0まではLOBデータの書込みをサポートしていませんでしたが、これはそのリリースのバグ(バグ番号760239)で、8.0.5.2.0以降では解決されています。

XVII. SQL文の最大長文の最大長文の最大長文の最大長

1.13.5.xより前のバージョンのドライバでは、SQL文に4,000文字以内という制限がありましたが、1.13.5.x以降のバージョンではこの制限は30,000文字になっています。2.5.3.1.5以降の7.3ドライバでは、この制限は64,000文字です。8.xドライバには事実上制限はありません(実際には、符号なし整数値の最大値が上限になります)。

Oracle ODBCのテスト・ユーティリティでは512バイトの制限があります。

(ただし、サード・パーティ製品ではSQL文字列が切り捨てられるという問題が認識されています。これは、SQL文字列がOracle ODBCドライバに渡される前に発生します。この問題が発生した場合は、サード・パーティ・ベンダーに連絡する必要があります。)

10 BFILEタイプ以外。BFILEタイプはRDBMSレベルで読取り専用です。 11 初期の8.0.xリリースでは、新規データ型(BLOB、CLOB)の列をアクセスするときは、これらのデータ型を明示的に使用する必要がありました。これは、使いやすさを向上させるために8.0.5.xドライバから変更されています。

- 15 -

XVIII. 「「「「Specified Driver Could Not be Loaded」エラー」エラー」エラー」エラー

これは、ORA-3121またはORA-12154エラーとともに表示されることがあります(ネイティブのエラー・コードを参照してください)。

A. ORA-3121:

これは、ODBCドライバ・マネージャがOracle ODBCドライバをロードしようとしたときに、ドライバ自体が依存コンポーネントのいずれか(SQL*NetまたはRequired Support Files(RSF))をロードできなかったことを意味します。これらのファイルは、システムまたはDOSの検索パスを介して検索しロードします(Windows NTまたはWindows 95にも当てはまります)。MSDOSウィンドウのコマンド・プロンプトから(引数を指定しない)PATHコマンドを発行すると、このエラーでパスが問題ではないことを確認できます。表示されるパスには、Oracle_Home¥BINディレクトリが含まれている必要があります。32ビット版のWindowsで16ビット・ドライバを使用する場合は、16ビットのSQL*NetおよびRSFもインストールする必要があります。いずれも独自のOracle_Homeおよび¥BINが割り当てられるため(PATHにも含める必要があります)、 32ビット版と共存します。次の例では、 F:¥ORANT¥BINが問題のOracle_Home¥BINディレクトリです。

Microsoft(R) Windows NT(TM)(C) Copyright 1985-1996 Microsoft Corp.

c:¥users¥admin>pathPATH=C:¥WINNT40¥system32;C:¥WINNT40;F:¥ORANT¥BIN;C:¥DOS

c:¥users¥admin>

[注意注意注意注意: PATH環境の正しい設定方法の詳細は、VIII節のC項を参照してください。]

B. ORA-12154: このエラーは、基本のSQL*Netレイヤーが、DSN構成に使用されるSQL*NetまたはOracle Netのエイリアスを検索できなかったことを示します。このエイリアスは、通常 、 TNSNAMES.ORA フ ァ イ ル に 定 義 さ れ ま す 。 こ の フ ァ イ ル は 、ORACLE_HOME¥NETWORK¥ADMIN(またはNET80¥ADMIN)ディレクトリにあります。

サーバー名またはSQL*Netエイリアスはこの構成ファイルに同じ情報として格納されるため、ODBC DSNを構成したときに正しい情報を指定してあることを確認します。

TNSNAMES.ORAファイルは、システム全体でこの場所にのみ存在することを確認します。ネットワーク・レイヤーでは、現在の作業ディレクトリにTNSNAMES.ORAファイルが見つかった場合、この場所のTNSNAMES.ORAファイルではなく、そちらのファイルを優先してロードしてしまうためです。[Oracle SQL*Net Names Serverを使用すると、この方法が変わります。Names Serverに関する構成の詳細は、システム管理者に連絡してください。]

- 16 -

XIX. 「「「「Driver Not Capable」エラー」エラー」エラー」エラー

このエラーは、コール側プログラムがドライバに対して実行不可能なデータ(データ型)変換を要求したときに返されます。変数はすべて文字列変数または文字変数にバインドするようにします。Oracleドライバではほとんどすべてのデータ型を文字列に変換できます。この場合の本当の問題は、通常、ドライバがSQLに準拠しているかどうかということです。API準拠およびSQL合致レベルの詳細は、Microsoft®社の『ODBC 3.0プログラマーズリファレンス&SDK』を参照してください。

XX. 「「「「Conformance Error」または「」または「」または「」または「Function Not Supported by Driver」エラー」エラー」エラー」エラー

この2つのエラーがよく発生するのは、コール側アプリケーションがドライバでサポートされていないODBC APIコールを使用しようとしたとき(ODBCレベル1のみに準拠するドライバにレベル2コールを実行したときなど)です。コール側プログラムのSQL合致レベルがドライバのSQL合致レベルより高い場合も、このエラーが発生することがあります。具体的な合致エラーが後述してありますので、それも参照してください。「Function Not Supported by Driver」というエラーはそのままの意味で、コール側アプリケーションが、ODBCドライバがサポートしていないことを実行するように要求したために発生します。通常、これは、ドライバがどのODBC API関数をサポートできるかを、アプリケーションがチェックしていないことが原因です。合致レベルに関して認識されている問題と具体的なエラー・メッセージは、後述のXXXII節を参照してください。

XXI. Microsoft® Jet ---- 具体的な問題(具体的な問題(具体的な問題(具体的な問題(DAO))))

Microsoft® Visual Basic 3.0の場合は、Microsoft® Visual Basic 3のインストール時にMicrosoft® Jet 2.0アップグレードがインストールしてあるはずです。その前のバージョンでは問題があります。Microsoft WebサイトのSupportのKnowledge BaseでQ113594を参照してください。Oracle ODBCドライバは、Jet 2.x以降の使用を想定しています。

Microsoft® Visual Basic 4.0の場合、プロパティ・シートのダイアログ・ボックスにユーザーが選択できるODBCデータソースをデフォルトで表示しないことがあります。DSNは手動で入力できます(例: ODBC;DSN=orlnt1;UID=scott;PWD=tiger;)。

A. Visual Basic 4.x((((VB4)、)、)、)、5.x((((VB5)または)または)または)または6.x((((VB6)を使用する場合)を使用する場合)を使用する場合)を使用する場合

使用するOracle ODBCドライバのバージョンによっては、「ツール」→「参照設定」メニュー(VB4)または「プロジェクト」→「参照設定」(VB5)の選択で、「Microsoft DAO 2.5/3.0 Compatibility Library」の使用が必要になることがあります。エラーを受け取った場合は、別のライブラリを使用してみてください。VB6を使用する場合は、Service Pack 3がインストールされていることを確認してください。

B. Microsoft® Jetと結合と結合と結合と結合

Microsoft® Jetを使用して、見かけ上の更新可能な結合SQLを実現できます。Microsoft® Jetを使用して実際の結合を実行する場合、Microsoft® Jetは結合表のローカル・コピー

- 17 -

を作成して更新を個別に適用しています。SQLが大量のデータを返した場合、この操作は明らかにメモリー集中型になります。

C. Microsoft® Jetと複数の接続と複数の接続と複数の接続と複数の接続

Microsoft® JetはRDBMSに対して複数の接続を開きます。これは、ODBCドライバが書込み接続とロックを管理する方法に起因します。詳細は、ODBCの最適化に関するMicrosoft® Developers Networkの記事または『ODBC: Architecture, Performance and Tuning』というMicrosoft社の記事を参照してください。これは、RDBMSに対してMAX_OPEN_CURSORSパラメータを指定した場合の問題につながります。

D. Jetでのパブリック・シノニム(「表またはビューが存でのパブリック・シノニム(「表またはビューが存でのパブリック・シノニム(「表またはビューが存でのパブリック・シノニム(「表またはビューが存在しません」)在しません」)在しません」)在しません」)

Jetアプリケーション内で「システム・オブジェクトの表示」オプションを設定する必要があります。パブリック・シノニムの名前とその基になっている表との名前が同じである場合、Jetはその両者を混同し(失敗し)ます。たとえば、EMP表に対してパブリック・シノニムを作成し、これにEMPという名前を付けるとします。この場合、Jetではこのシノニムに正しくアクセスできません。この一意の名前に関する制限は、この接続に関してJetエンジンが認識するすべてのオブジェクトに当てはまります。オブジェクトに対してスキーマ名を指定しても、この場合は役に立たず、Jetはエラー「xxx.mdbを開けません。」を返します(xxxはアクセスしようとしたオブジェクトの名前です)。回避策としては、スキーマ全体(表、ビュー、その他)で一意の名前を使用することです。

E. Microsoft® Jetでのでのでのでの#Deleted行行行行

データベース・トリガーが表を更新し、Microsoft® Jetで行を一意に識別できなくなった場合、これらの行はdata.sheetビューで#DELETEDとして表示されます。ブックマークとしての浮動小数点列、または主キー/索引列でもこれと同じ状況になります。浮動小数点データの処理精度はマシンにより異なるため、精度の低下が発生することがあります。実際の低下はそれほど重要でないこともありますが、データが表のブックマークの一部である場合、Microsoft® Jetでは行が削除されたと解釈します。この理由は、Microsoft® Jetはサーバーに対して行を行のキー値により求めますが、正確に一致する行が見つからないためです。Microsoft® Jetでは、この状況と、別ユーザーが実際のレコードを削除した状況とを区別できません。

F. 接続タイムアウトのトラブルシューティング(接続タイムアウトのトラブルシューティング(接続タイムアウトのトラブルシューティング(接続タイムアウトのトラブルシューティング(ORA-1013))))

Oracle ODBCドライバのバージョン2.x(クライアント7.x)では、QueryTimeoutオプションをサポートしていません。Oracle ODBCドライバ8.0.5ではこの機能が追加され、デフォルトで使用可能になりました(使用禁止にする方法は、ODBC APIコールのみです)。Jet®で問合せをタイムアウトにすることがあるので、これが自動的に設定され使用されることになります。古いドライバでは正常に機能していた問合せが、新しいドライバでは実行時間の超過により失敗する可能性がありました。Oracle ODBCドラ

- 18 -

イバのバージョン8.0.5.3以降では、問合せのタイムアウトを使用禁止にする機能が提供されています。

後述のMicrosoft® Jetの構成に関するセクションで、ConnectionTimeout項目の説明を参照してください。この項目にはエージング・タイムアウトの秒数を設定します。デフォルト値は600です。ConnectionTimeoutを設定すると、Microsoft® Visual BasicのFreeLocks文をコード内で使用して、アイドル接続を強制的に閉じることができます。INIファイルのこのセクションには、QueryTimeoutおよびLoginTimeout項目も含めることができますが、これらは、それぞれサーバーによる問合せとログインの実行をMicrosoft® Jetが待機する秒数を指定します。これらのタイムアウトが発生するとMicrosoft® Jetは異常終了します。これらの項目のデフォルトはそれぞれ60秒と20秒ですが、この秒数では短すぎることがあります。それぞれ120秒に設定してみるか、使用環境で実験してみて最善の時間を判断します。

注意注意注意注意: INIファイルを単に編集するだけでは十分ではありません。16ビットのAccessでは、この変更を反映させるために問合せを再作成する必要があります。32ビットのAccessの場合は、次のレジストリ・パスに新しい「ODBC」キーを作成できます。

¥HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Jet¥3.x¥Engines¥ODBC

この行の3.xは、使用しているエンジンの実際のバージョン番号(3.0、3.5など)に置き換えます。このキーにQueryTimeoutという名前の新しい値を作成し、これを適切に設定します。この値でデフォルト設定が上書きされます。ここにConnectionTimeout値を設定することもできます。ODBCドライバのバージョン2.5以降では、このかわりにDSN構成用ダイアログ・ボックスにチェックボックスが含まれており、非同期動作を強制的に使用禁止にし、以前のドライバの動作に戻すことができます。

Oracle ODBCドライバ8.0では非同期サポートを実装していませんが、SQLSetConnectコールのQUERY_TIMEOUTオプションは実装しています(これは、7.xシリーズのドライバではサポートされていませんでした)。このオプションを使用しても、Jetはタイムアウトを実装できます。前述のように、バージョン8.0.5.3.0以降のドライバでは、SQLSetConnectOptionコールでのSQL_QUERY_TIMEOUTサポートを使用禁止にするDSN構成可能オプションをサポートします12。

1. Microsoft Access

Microsoft Accessの中には、(製品説明に反して)INI設定またはレジストリ設定でデフォルト・タイムアウトを上書きできないバージョンがあります。この場合は、問合せプロパティ・ページを使用して問合せごとにこれを行う必要があります。Microsoft Access 97で結合問合せを実行する場合、QueryTimeOutを0に設定し、レジストリのLogintimeoutおよびConnectiontimeoutの値をJetエンジン用に増やし、Microsoft Accessで更新の間隔を増やしても、この問題は解決しません。更新の間隔は、メニューの「ツール」→「オプション」→「詳細」の下にあります。この場合は、もう1歩踏み込む必要があります。ODBCタイムアウトを0に設定します。このプロパティは、MS Access 97では問合せ自体に属します。ODBCタイムアウトを設定するには、追加する新規問合せのデザイン・ビューに

12 8.0ドライバでは現時点で非同期サポートがないため、アプリケーションで問合せタイムアウトを発生させることはできません。これは、2.0ドライバおよび初期の7.xドライバの動作です。

- 19 -

進み、「表示」→「プロパティ」でODBCタイムアウトを60のかわりに0と設定します。

2. ストアド・プロシージャとストアド・プロシージャとストアド・プロシージャとストアド・プロシージャとADO

ADOを使用してストアド・プロシージャを実行すると、SQL*Plusレベルでは正常に実行されたとしても時間がかかります。

ADOはコマンド・オブジェクトと呼ばれるストアド・プロシージャを実行するインタフェースを提供します。ADOにはCommandTimeoutというプロパティがあり、これはデフォルトでは30秒に設定されています。ストアド・プロシージャの実行がこの秒数より長くかかると、実行は取り消されて前述のエラーが表示されます。

例:

Public Sub ConnectionStringX()Dim cnn2 As ADODB.Connection' Open a connection using a DSN and ODBC tags.Set cnn2 = New ADODB.Connectioncnn2.ConnectionString = "DSN=Pubs;UID=sa;PWD=pwd;"cnn2.ConnectionTimeout = 30cnn2.Open' Display the state of the connections.MsgBox "cnn1 state: " & GetState(cnn2.State) & vbCrcnn2.CloseEnd Sub

プログラムでCommandTimeoutプロパティを0に設定します。これを行うには、特定の問合せまたはストアド・プロシージャの場合は、コマンド・オブジェクトのプロパティを設定します。すべての問合せおよびストアド・プロシージャの場合は、接続オブジェクト・レベルで行います。

G. Jet/DAOと日付と日付と日付と日付

JetではVBAスタイルの日付形式のみの使用が想定されます。したがって、Oracle ODBCドライバで日付データ型を正しく操作するには、次の構文を使用する必要があります。

Dim odb As DatabaseDim ody As RecordsetSet odb = OpenDatabase(ODBC, False, False, _"ODBC;DSN=ORA32;UID=SCOTT;PWD=TIGER")Set ody = odb.OpenRecordset("SCOTT.EMP", dbOpenDynaset)ody.FindFirst "Hiredate = #03-DEC-81#"Do Until ody.NoMatchCombo1.AddItem ody.Fields("ENAME")ody.FindNext "Hiredate = #03-DEC-81#"Loop

- 20 -

H. 自動コミット自動コミット自動コミット自動コミット

コア関数ではないSQLSetConnectOption()(SQLSetConnectAttr()により置き換えられています)を使用して、自動コミット・モードをオフにする必要があることがあります(設定する属性は、SQL_ATTR_AUTOCOMMITです)。自動コミットをサポートするほとんどのドライバでは、自動コミット・オンがデフォルトです。自動コミット・モードでは、ドライバは個々のSQL文を実行するたびに自動的にコミットします。これらのAPIコールの詳細は、『ODBC 3.0プログラマーズリファレンス&SDK』を参照してください。この動作はODBCアプリケーションにより制御されるため、ODBC APIを直接使用しない場合は、この動作を使用禁止にできないことがあります。

I. データ型のマッピングデータ型のマッピングデータ型のマッピングデータ型のマッピング

ODBCデータ型データ型データ型データ型 Microsoft® Jetデータ型データ型データ型データ型 SQL_BIT Yes/No SQL_TINYINT 数値サイズ: Integer SQL_SMALLINT 数値サイズ: Integer SQL_INTEGER 数値サイズ: Long Integer SQL_REAL 数値サイズ: Single SQL_FLOAT 数値サイズ: Single SQL_DOUBLE 数値サイズ: Double SQL_TIMESTAMP 数値サイズ: Double SQL_DATE DateTime SQL_TIME Text SQL_CHAR Text SQL_VARCHAR 長さが255文字より小さいか等しい場合はText(フィールド・サ

イズ=長さ) 長さが255文字より大きい場合はMemo

SQL_BINARY SQL_VARBINARY 長さが255文字より小さいか等しい場合はBinary(フィールド・

サイズ=長さ) 長さが255文字より大きい場合はOLE Object

SQL_LONGVARBINARY OLE Object SQL_LONGVARCHAR Memo SQL_DECIMAL SQL_NUMERIC wScale=0で精度が4より小さいか等しい場合は、数値サイズ:

Integer 精度が9より小さいか等しい場合は、数値サイズ: Long Integer 精度が15より小さいか等しい場合は、数値サイズ: Double wScaleが0より大きく、精度が15より小さいか等しい場合は、数値サイズ: Double 他のフィールド・タイプはすべてTextにマップされます(フィールド・サイズ=255)。

- 21 -

J. Microsoft® Jetの構成の構成の構成の構成

Microsoft® Jetアプリケーションでは、Microsoft® Jetが特定の機能をどのように管理するかをINIファイルを使用して構成します。Microsoft® Accessの場合、このファイルはmsaccess.ini(またはmsacc20.ini)で、Microsoft® Visual Basicの場合はvb.iniです。Microsoft® Visual Basicで作成したアプリケーションの場合はアプリケーションにより決定されます。Microsoft® Jetを制御するために、アプリケーションINIファイルの中に作成する項目は、次のとおりです。項目はすべて[ODBC]というセクションの中に含まれます。ただし、RmtTraceだけは[Debug]というセクションの中に含まれます。32ビット版のJetでは、この情報はシステム・レジストリの次のキーの下に入れられます。

HKEY_LOCAL_MACHINE¥Software¥Microsoft¥Jet¥3.0¥Engines¥ODBC または

HKEY_LOCAL_MACHINE¥Software¥Microsoft¥Jet¥3.5¥Engines¥ODBC

どちらのキーを更新するかは、インストール済みで構成対象のJetエンジンのバージョンによります。[Microsoft Access®などの製品(特に16ビット版)を使用する場合は、この値を「事後に」変更するだけでは、アプリケーションで有効になりません。Accessなどの製品では、問合せに使用するパラメータを、問合せの作成または変更の時点で格納するためです。新規パラメータが認識されるようにするには、問合せを変更して、問合せとともにパラメータも更新されるようにする必要があります。32ビット版ではこの問題はありません。]

項目項目項目項目 値値値値 効果効果効果効果 RmtTrace 0 可能な場合は非同期問合せ実行を使用します(デフォルト)。 8 ファイル「odbcapi.txt」にODBC APIコールをトレースします。 16 同期問合せ実行を強制します。 24 ODBC APIコールをトレースし、非同期問合せ実行を強制します。 TraceSQLMode 1 SQL® JetからODBCへの送信をファイル「sqlout.txt」にトレースしま

す。 0 Microsoft® JetレベルのSQLトレースを行いません(デフォルト)。QueryTimeout S S秒以内に終了しない問合せを取り消します(デフォルト: 60)。 LoginTimeout S S秒以内に終了しないログイン試行を取り消します(デフォルト:

20)。ConnectionTimeout▼{これは不要では?}▽ ConnectionTimeout S アイドル時間がS秒経過した後にキャッシュ済みの接続を閉じます

(デフォルト: 600)。 AsyncRetryInterval M Mミリ秒ごとにサーバーに対して「問合せが終了したか?」と尋ねま

す(デフォルト: 500)。 AttachCaseSensitive 0 大/小文字を区別しないで、指定した名前に一致した最初の表に連結

します(デフォルト)。 1 指定した名前に正確に一致した最初の表に連結します。 SnapshotOnly 0 連結時にSQLStatisticsをコールして、ダイナセットを使用できるよう

にします(デフォルト)。 1 SQLStatisticsをコールしないで、スナップショットを強制します。 AttachableObjects 文字列 連結できるサーバー・オブジェクト型のリスト(デフォルト :

TABLE、、、、VIEW、、、、SYSTEM TABLE、、、、ALIAS、、、、SYNONYM)。

- 22 -

K. 参考資料参考資料参考資料参考資料

『Microsoft® Jet Database Engine 2.0: A User's Overview』および『Jet Database Engine ODBC Connectivity』

XXII. Microsoft Access固有の問題固有の問題固有の問題固有の問題

A. Access((((MDB)データベースにリンクされている表の取扱い)データベースにリンクされている表の取扱い)データベースにリンクされている表の取扱い)データベースにリンクされている表の取扱い

Oracleの表をODBC接続経由でMicrosoft Access® データベースにリンクし、その後(Visual Basicなどの環境から)Jetを使用してこのAccessデータ・ファイルに連結することができます。このような場合に問題が発生することがありますが、それは、最終的にこのリンク経由でOracle RDBMSに対して指定されるSQLを生成するときに、Jetが混乱することがあるためです。ODBCドライバ自体は、生成されるSQLを直接制御しません(SQLが正しくないことがよくあります)。この場合にお薦めする方法は、ホスト・プログラム(VB、MSVC++など)からはAccess MDBファイル内のリンクを経由しないで、ODBCドライバ経由で直接Oracle RDBMSに連結することです。[この方法を使用する場合は、JetからOracleに送信されるSQLの解析およびトラブルシューティングのためにODBCトレースを利用し、JetでSQLを正しく生成できるように必要に応じて問合せを再編成する必要があります。]

B. 表の連結時に「ハング」したように見える表の連結時に「ハング」したように見える表の連結時に「ハング」したように見える表の連結時に「ハング」したように見えるMicrosoft Access

これは、データベースが大きい(またはデータベースのデータ・ディクショナリが大きい)ためです。Jetではデフォルトで全オブジェクトのカタログ全体を問い合せます。行の数が数百万になると、表のリストを表示しようとしたときに、Accessがハングしたように見えます。

C. Microsoft Accessの中からシステム表を表示できないの中からシステム表を表示できないの中からシステム表を表示できないの中からシステム表を表示できない

Accessでは、デフォルトで、表の参照リストにシステム表を表示できないようになっています。システム表を表示できるようにするには、Accessの「オプション」メニューで、「システム・オブジェクト」チェックボックスを選択する必要があります。

XXIII. Oracle ODBCドライバとドライバとドライバとドライバとMFCとの使用との使用との使用との使用

OracleドライバをMicrosoft® Foundation Class(つまりCRecordset()オブジェクト)とともに使用する場合は、いくつか注意点があります。

• Oracleドライバ自体がサポートするのは(RDBMSと同様)前方スクロール・カーソルのみですが、MFCのバージョンによっては、前方スクロールのみのドライバにはレコード・セットをREAD_ONLYとしても宣言する必要があると定義しているものがあります。これは実際にはMFC内部で実行されるASSERTであり、ドライバ自体の制限ではありません。明らかに、MFCは両方向カーソルを想定して作成されています。このため、MFCのいくつかのバージョンとCRecordset()オブジェクトを一緒に使用すると多少煩雑になります。

- 23 -

• 日付/時刻フィールドに使用される変数が、Rfxを使用してデータを正しくバインドしない可能性があります。

• Oracle ODBCドライバのバージョンによっては、Class Wizardを使用してCRecordset()クラス・テンプレートを作成するときに、Visual C++(VC++)の特定のバージョンで機能しないものがあります。これは、VC++ 4.2およびOracle ODBCドライバ1.15.x以降では解決されているようです。以前のバージョンでは表タイプ文字列での構文エラーが報告されたり、場合によっては、VC++ 1.5xでGPF(一般保護違反)になることがありました。 注意注意注意注意: ドライバ自体は機能しますが、クラスを手動で作成する必要がありました。

XXIV. ODBC経由の日付と時刻経由の日付と時刻経由の日付と時刻経由の日付と時刻

ODBCを使用して日付と時刻を処理するには、選択肢がいくつかあります。

次に示すデフォルトのODBC日付書式を使用できます。

#03-DEC-81# これは、DAO/Jetがデフォルトで使用する形式です。

SQL文を直接実行して任意の日付書式をカプセル化する場合は、SQL関数のTO_DATE()を使用できます。たとえば、次のように指定します▼{TO_CHARではなくTO_DATEではないでしょうか?}▽。

SELECT TO_CHAR(sysdate,'MM/DD/YYYY') FROM dual これは、指定した日付書式を含む文字列として渡されます。

ODBCエスケープを介してANSI日付書式を使用できます。

{ d '1981-12-03' } これは一重引用符で囲まれ、常にYYYY-MM-DDの書式になります。

標準のOracle日付書式も同じように使用できます。

{ '03-Dec-1981' } 時刻は次のように指定します。

{ t 'hh:mm:ss' } タイムスタンプ(時刻を含む日付)は、次の書式になります。

{ ts '1981-12-03 00:00:00' }

XXV. その他のその他のその他のその他のODBC SQLエスケープエスケープエスケープエスケープ

このホワイト・ペーパーで説明されている日付と時刻、外部結合、プロシージャ・コールのエスケープに加えて、ODBC仕様には次のエスケープも含まれています。

A. 間隔のエスケープ・シーケンス間隔のエスケープ・シーケンス間隔のエスケープ・シーケンス間隔のエスケープ・シーケンス {interval-literal}

- 24 -

(つまり、hours-value [:minutes-value [:seconds-value ]])

B. スカラー関数のエスケープスカラー関数のエスケープスカラー関数のエスケープスカラー関数のエスケープ {fn scalar-function}

XXVI. Microsoft® Visual Basicを使用したストアド・プロシージャを使用したストアド・プロシージャを使用したストアド・プロシージャを使用したストアド・プロシージャ

A. プログラム例プログラム例プログラム例プログラム例

次は、Oracle7 Serverに対して接続し、ストアド・プロシージャを実行する単純なODBCアプリケーションです。

これは、Oracle内にテスト用の表を作成するために必要なSQLです。

create table test_tab (col1 varchar2(100), col1 varchar2(100));

次は、Oracle内にストアド・プロシージャを作成するために必要なコードです。

create or replaceprocedure test_sp(field1 varchar, field2 varchar)isbegininsert into test_tab (col1, col2) values (field1, field2);end;

次は、ストアド・プロシージャを実行するMicrosoft® Visual Basicコードです。任意のサイズ(最大100文字)の任意のパラメータを2つ指定します。 Sub Command1_Click()Dim oradb As databaseDim Conn1 As StringDim sql1, sql2, retConn1$ = "odbc;dsn=alias;uid=scott;pwd=scott;"Set oradb = OpenDatabase("", False, False, Conn1$)sql1 = "begin test_sp('one_a','two_a'); end;"ret = oradb.ExecuteSQL(sql1)sql1 = "begin test_sp(col2=>'two_b',col1=>'one_b'); end;"ret = oradb.ExecuteSQL(sql1)oradb.CloseEnd Sub

このコードは、まず、デフォルトの列表記を使用して2つの値「one_a」と「two_a」をデータベースに挿入します。次に、明示的な列表記を使用して「one_b」と「two_b」をデータベースに挿入します。

注意注意注意注意: 値「ret」(ret = oradb.ExecuteSQL(sql1))には、このストアド・プロシージャにより影響される行数を表す整数が含まれます。

CALL指定子を使用してストアド・プロシージャをコールする方法もあります。このためのMicrosoft® Visual Basicの構文を次に示します。oradbは有効なデータベース・オブジェクトです。

- 25 -

oradb.ExecuteSQL("{CALLprocedurename(param1,param2,param3)}")

注意注意注意注意: MSQueryなどのツールから、{CALL ...}構文を使用するだけです。ただし、二重引用符は使用しません。

パラメータがない場合でも、( ) を指定する必要があります。また、出力パラメータはODBC合致レベル2(Oracle7 ODBCバージョン2.x)でのみサポートされています。7.3 Oracleドライバはダイナセットを返すことをサポートしていません。これを実装したOracleドライバの最初のバージョンは、8.0.5.xです。かわりの方法については、ストアド・プロシージャに関する節を参照してください。

B. Visual Basicエラーエラーエラーエラー40041 ---- オブジェクトコレクションオブジェクトコレクションオブジェクトコレクションオブジェクトコレクション: テキストで指定されたテキストで指定されたテキストで指定されたテキストで指定された項目はありません項目はありません項目はありません項目はありません

通常、これは、アップグレード以前に機能していたコードを、アップグレードされたドライバで使用していることを示します。これは、ストアド・プロシージャ名が小文字または大/小文字の混在であるために発生します。ODBCドライバでは、バージョン2.5.3.0.1より前ではプロシージャ名を(二重引用符で指定された場合でも)正しく保存しませんでしたが、このバージョン以降は正しく保存します。このため、以前は機能していたコールが失敗することがあります。バージョン2.5.3.x以降では、プロシージャ名を二重引用符で指定する(これが、DAOおよびRDOがコールを実装する方法です)場合、正確に大/小文字を区別して指定する必要があります。{CALL myproc()}は、OracleのプロシージャMYPROCには自動的にマップされないことを意味します。この場合は、{CALL MYPROC()}を使用する必要があります。

XXVII. Microsoft® Visual Basicを使用したを使用したを使用したを使用したRDO

リモート・データ・オブジェクト(RDO)では、最低限ODBC APIレベル2準拠のドライバの使用を想定しています。RDOが正しく機能するようにするには、Oracle ODBCドライバのバージョン2.xを使用する必要があります。RDOの機能の中には、RDBMSおよびODBCドライバがネイティブにはサポートしていない両方向スクロール・カーソルの利用が必要なものがあります。ドライバの8.0.4.0.2以降のバージョンでは、Microsoftカーソル・ライブラリを使用してスクロール可能カーソルをサポートします(バージョン2.5.3.xにも、MSカーソル・ライブラリのサポートがあります)。RDOを使用する場合は、Oracle ODBCドライバのこれ以降のバージョンを使用するか、この機能をサポートするサード・パーティ製ドライバを使用する必要があります。スクロール可能カーソルを必要とする機能の例としては、ダイナセットまたはキーセットのオープン、LONGまたはLONG RAW列を含む表の更新があります。サード・パーティ製ドライバには、Intersolvバージョン3.xドライバを含み、この機能をエミュレートするドライバがあります。RDO 1.xでは互換性の問題が多数認識されています。RDO 2.x以降を使用する必要があります(Microsoft Webサイトからパッチを入手できます)。

- 26 -

RDOで使用可能なオプションを、次の表に示します13。

RDOカーソル・タイプカーソル・タイプカーソル・タイプカーソル・タイプ 結果セット・タイプ結果セット・タイプ結果セット・タイプ結果セット・タイプ ロック・タイプロック・タイプロック・タイプロック・タイプRdUseNone RdOpenForwardOnly RcConcurReadOnlyRdUseODBC RdOpenStatic RdConcurReadOnly RdConcurValues RdOpenForwardOnly RdConcurReadOnly RdOpenDynamic RdConcurReadOnly RdConcurValues RdOpenKeyset RdConcurReadOnly RdConcurValuesrdUseClientBatch RdOpenStatic RdConcurReadOnly RdOpenForwardOnly RdConcurReadOnly RdOpenDynamic RdConcurValues RdConcurRowVer RdConcurBatch RdOpenKeyset RdConcurValues RdConcurRowVer RdConcurBatch RDBMSのデフォルトのロック動作ではなく、明示的にレコードをロックしようとする(つまり、SELECT ... FOR UPDATEを使用する)と問題が発生しているので、注意してください。サーバー側カーソルを使用しないかぎり、FOR UPDATEはRDOによりSQLから削除されます14。

これを示すVBコード(断片)を次に示します。

Dim Env as rdoEnvironmentDim Con as rdoConnectionDim RST as rdoResultsetDim SQL as StringSet SQL = "SELECT * FROM EMP FOR UPDATE"Set Env = rdoEngine.rdoEnvironments(0)Env.CursorDriver = rdUseServerSet Con = Env.OpenConnection("",rdDriverNoPrompt, False, sConnect)Set rs = rdoConn.OpenResultset (SQL,rdOpenForwardOnly) この結果、EMP表全体に書込みロックがかかります。

RDOでのタイムアウトの問題を処理するために、Jetの場合と同様に適切なタイムアウト値(ログインのアイドル・タイムアウトまたは問合せタイムアウト)を構成できます。ログイン・タイムアウトは、RDOEngineオブジェクトに次のように構成できます。

With rdoEngine.rdoDefaultLoginTimeout = 120.rdoDefaultCursorDriver = rdUseODBC

End with このコード(断片)では、デフォルトのLoginTimeout値を120秒に設定します。

13 7.xは、バージョン2.5.3.1.2以降のみ。8.xは、8.0.4.0.3以降のみ。 14 ADOを使用する場合も同じです。

- 27 -

これは、rdoEnvironmentレベルにも設定できます。QueryTimeout値を調整するには、この値をrdoConnectionオブジェクト・レベルまたは結果セット・レベルに設定します。

次のVisual Basicコード(断片)は、接続レベルでQueryTimeoutを設定します。

Dim ConOBJ as rdoConnectionConObj.Connect = "DSN=mydsn;UID=scott;PWD=tiger;"ConObj.QueryTimeout = 120 このコードは、この接続の問合せにタイムアウト値の120秒を設定します。

XXVIII. IIS、、、、MTSおよびおよびおよびおよびADOの問題の問題の問題の問題

ADOはバージョン7.xドライバのいずれでもサポートされていません。ADOがサポートされる最初のOracle ODBCドライバは、バージョン8.0.5.1.0です。この機能が必要な場合は、サード・パーティ・ベンダーのドライバの使用が必要になることがあります。Microsoft ODBC Driver for Oracleバージョン2.7x以降は、ADOをサポートします。Merant(Intersolv)3.01以降もサポートします。

MTSは、Oracle ODBCドライバのパッチ・キット8.1.5.3a.0以降でサポートされます。ODBCドライバ8.1.5.xでサポートできるようにするには、ORAMTSパッチ8.1.5.0.1をインストールする必要があります。ODBC 8.1.6以降にはORAMTSが含まれています。

IIS固有の問題が発生する可能性があります。つまり、ODBC Testなどのツールを使用しているときは発生せず、IIS環境でのみ発生する問題があります。これは、通常、IISサービスの構成が原因です。IISは通常のユーザーとしてではなくサービスとして実行されるため、サービス接続固有の問題が発生する可能性があります。IIS 3.xの場合、このような問題を軽減する最も簡単な方法は、環境が正しく構成されたWWWパブリッシング・サービスをユーザー(システム管理者など)として実行することです。IIS 4.xの場合は、管理コンソールを介して特殊なユーザー(インターネット・ゲスト・アカウント)が構成されます(IUSR_xxxxx)。これは、サーバー経由のインターネット接続に使用されるユーザーなので、このユーザーの環境とアクセス権が正しいことを確認します。IISの構成方法の詳細は、IISのドキュメントまたはMicrosoft Webサイトを参照してください。

A. ODBC経由の接続時に表示される経由の接続時に表示される経由の接続時に表示される経由の接続時に表示されるORA-12641

これは、IISまたはODBCを使用するサービスで頻繁に発生します。SQLNET.ORAファイル(通常はORACLE_HOME¥NETWORK¥ADMINディレクトリにあります)を編集し、次の項目を追加または変更します。

SQLNET.AUTHENTICATION_SERVICES = (none)

B. ASPまたはまたはまたはまたはIDCを使用して接続できない(を使用して接続できない(を使用して接続できない(を使用して接続できない(ORA-1017))))

ユーザー名を指定する行のすぐ後にパスワードのディレクティブが指定されていることを確認します。

Datasource: Oracle7Username: scottPassword: tiger

- 28 -

IISでの解析方法により、これがIDCファイルでは必須です。

C. IIS/ADOで正常に機能しない数値列で正常に機能しない数値列で正常に機能しない数値列で正常に機能しない数値列

これは、クライアントのRSF(Required Support Files)の問題です。Oracleクライアントのバージョン8.0.5以降をインストールする必要があります。ODBCドライバはバージョン8.0.5.2.x以降を使用する必要があります。

D. ADOを使用した接続時のハングまたはを使用した接続時のハングまたはを使用した接続時のハングまたはを使用した接続時のハングまたはORA-12203

ODBC用のMS OLEDBプロバイダが使用されていることを確認します(デフォルトなので、接続文からProviderディレクティブを省略するだけで済みます)。Microsoft社ではOracle OLEDBプロバイダ(MSDAORA)を開発しましたが、これはOracleではサポートされていません。このプロバイダで問題がある場合は、Microsoft社のサポート担当に連絡してください。他社(Intersolv社など)でもODBCドライバとともに使用するOLEDB-ODBCブリッジ製品を提供しています。オラクル社では、リリース8.1.6から自社のOLEDBプロバイダを提供しています。

E. 接続プーリングの接続プーリングの接続プーリングの接続プーリングのODBCサポート(サポート(サポート(サポート(MTS/IIS))))

この機能に対するサポートは、Oracle ODBCドライバのバージョン8.0.5.1.0bに追加されています。この機能はODBCアドミニストレータにより制御されます。MDACのバージョン2.0以降をインストールする必要があります(これにはODBCアドミニストレータの3.510.xが含まれています)。

XXIX. ODBC API 3.0仕様の問題仕様の問題仕様の問題仕様の問題

ODBC API 3.0仕様で提供されている新機能を使用した最初のOracle ODBCドライバは、バージョン8.0.4.xです。Oracle 2.xドライバでは、ODBC API 3.0仕様の追加機能の実装は計画されていません。2.5.xドライバではファイルDSNのサポートを実装していますが、それ以外はODBC API 2.5仕様に準拠しています。

A. ODBCバージョンバージョンバージョンバージョン3.xととととOracle ODBCドライバドライバドライバドライバ

Oracle ODBCドライバのバージョン2.0.3以前は、Microsoftドライバ・マネージャ2.5に対して認証されています。Microsoft ODBCドライバ・マネージャの新しいバージョン3.xを、Oracle ODBCドライバ2.0.3以前のバージョンとともに使用すると、問題がいくつか発生します。バージョン2.5以降ではAPI 3.0の拡張機能を実装していないため、制限付きで稼働します。この拡張サポートを初めて実装したのは、ドライバのバージョン8.0.4.xです。

- 29 -

B. SQLSTATE 08003 Native Error Code: 0

Driver Message: [Oracle][ODBC Oracle Driver]接続されていません。(C項を参照してください。)

C. SQLSTATE 01000 Native Error Code: 0

Driver Message: [Microsoft][ODBC Driver Manager] ド ラ イ バ が 無 効 なSQL_DRIVER_ODBC_VERを返したか、返すのに失敗しました。%s

BとCは、Oracleバージョン1.0ドライバ(レベル1準拠)を新しいバージョン3.0のドライバ・マネージャまたはODBCアドミニストレータで使用しようとすると発生します。Microsoftドライバ・マネージャのバージョン3.0では、少なくともODBC API 2.0仕様に準拠していないドライバに対するサポートが削除されています。Oracle ODBCドライバのバージョン1.xの準拠レベルは1であるため、レベル2以上のドライバ(バージョン2.x以降)をインストールし使用する必要があります。

D. ファイルファイルファイルファイルDSN

特定のODBC DSNをサポートするようにレジストリを変更する要求に対するMicrosoft社の答です(古いODBC.INIでの状況を覚えていますか?)。ファイルDSNは、単にファイル内にDSN構成情報を保持するものです(デフォルトでは、ODBCアドミニストレータ3.0がインストールされるときに、既存のマシンDSNのそれぞれに対してファイルDSNが作成されます)。ファイルDSNは、次のように表示されます。

[ODBC]Oracle7

Oracle7は、レジストリ内での実際のDSN情報の名前です。このファイルにはデフォルトで次のように名前が付けられます。

Oracle7 (not sharable).dsn

このファイルはデフォルトで次のディレクトリに入れられます。

¥Program Files¥Common Files¥ODBC¥Data Sources

共有可能ファイルDSNのサポートは、ドライバ2.5.3.1.5から含まれています。

E. ファイルファイルファイルファイルDSNを使用した場合のを使用した場合のを使用した場合のを使用した場合のSQLSTATE 08001

ファイルDSNに対するサポートは、Oracle ODBCドライバのバージョン2.0.3.x以前には含まれていません。バージョン2.5.x以降を使用する必要があります。これより前のバージョンでファイルDSNを使用しようとすると、ODBCアドミニストレータがこのエラーを生成します。

- 30 -

F. MSQuery 97ではファイルではファイルではファイルではファイルDSNのみを使用のみを使用のみを使用のみを使用

ドライバのバージョン2.5.x以降を使用していない場合は、他に選択肢がないため、ファイルDSNを手動で作成する必要があります。MSQuery内に新しいDSNボタンを作成しても、以前のバージョンと使用すると、次のエラーが返されます。

データベース・サーバーデータベース・サーバーデータベース・サーバーデータベース・サーバーに接続できません。ドライバのに接続できません。ドライバのに接続できません。ドライバのに接続できません。ドライバのSQLSetConnectAttrは失敗は失敗は失敗は失敗しました。しました。しました。しました。

ODBCトレースを調べると、実際にSQLDriverConnect()に対するコールで失敗していることがわかります。ファイルDSNがすでに存在する場合は、これを使用してMSQueryから接続し、データを取り出せます。

G. ファイルファイルファイルファイルDSNの手動構成の手動構成の手動構成の手動構成

バージョン2.5.xより前のOracle ODBCドライバには新しいODBC APIコールが含まれていないため、これらのバージョンでファイルDSNを使用することはできません15。旧版のバージョンを使用する必要がある場合、サポートされていないオプションを使用するには、*.dsnファイルに次の項目を作成します。ただし、これはマシンDSNを参照するため、共有ファイルDSNではありません。

[ODBC]DSN=Oracle7

[Oracle7は、既存のマシンDSN(システムまたはユーザー)です。]

H. データの取出し時にハングするデータの取出し時にハングするデータの取出し時にハングするデータの取出し時にハングするExcel 97

ファイルDSNを手動で構成し、MSQueryがOracle ODBC DSNを参照できるようにした後でも、Excelでスプレッドシートにデータを取り出そうとすると、Excelが「ハング」するという問題があります。問合せを構成するとき、問合せが実行される直前に「Microsoft Excel への外部データの取り出し」というダイアログ・ボックスが表示されます。このダイアログ・ボックスが表示された後、「プロパティ」ボタンを選択し、プロパティ「コントロールの更新」の下にあるプロパティ「バックグラウンドで更新する」の選択を解除する(使用禁止にする)必要があります。これは、Microsoft Excelで、非同期問合せ(Oracleドライバ2.0.3ではデフォルト)を実装するドライバとの操作にバグがあるためです。ドライバのバージョンドライバのバージョンドライバのバージョンドライバのバージョン2.5.3.x以降には、以降には、以降には、以降には、DSNの構成時にこの構成時にこの構成時にこの構成時にこの動作を強制的に使用禁止にする方法(非同期サポートを使用可能にしないという方の動作を強制的に使用禁止にする方法(非同期サポートを使用可能にしないという方の動作を強制的に使用禁止にする方法(非同期サポートを使用可能にしないという方の動作を強制的に使用禁止にする方法(非同期サポートを使用可能にしないという方法)が含まれています。法)が含まれています。法)が含まれています。法)が含まれています。

XXX. ODBC 3.5仕様の問題仕様の問題仕様の問題仕様の問題

Oracle ODBCドライバの8.0.5.8.0以降および8.1.5.5.0以降は、ODBC API 3.51仕様に適合するように作成されています。詳細は、ODBCのオンライン・ヘルプを参照してください。

15 ファイルDSNサポートはODBC API 3.0仕様で追加されていますが、この新規APIコールに対するサポートはこのバージョンのドライバにはありません。

- 31 -

XXXI. Crystal Reports((((Seagate(現(現(現(現Crystal Decisions))での問題))での問題))での問題))での問題

この節の情報は、すべてオラクル社からお客様へのサービスとして提供されています。この情報は、次のサイトから入手できます。

http://support.crystaldecisions.com/library/kbase.asp

「Oracle ODBC」と入力すると、記事の一覧が表示されます。この製品はサポートしていませんが、トラブルシューティングの出発点として次の情報を提供します。情報はすべてSeagate(現Crystal Decisions)社からのものをそのまま記載してあります。

Crystal Reports ののののバージョンバージョンバージョンバージョン

説明の概要説明の概要説明の概要説明の概要 Article ID

5.x、16ビットおよび32ビット

ODBCドライバのバージョンに関する技術詳細情報 c2000171

5 Btrieve表とOracle表のリンク c20004856 Oracleからレポートを取得するにはP2sora7.dll(バージョン7.0.0.45)が必

要です。 c2002184

6(only?) ODBC DSNはシステムDSNにする必要があります。▼{左欄のカッコ内は著者の独り言?}▽

c2002954

6 現時点で、Oracleの複合型にはアクセスできません。イメージ、ビデオまたは音声に関して具体的に参照されています。サポートされる型は、行、コレクション、distinctおよびopaqueです。データブレード、カートリッジおよびエクステンダとのインタフェースも現在開発中です。

c2000063

6 レポート作成対象のオブジェクトの最大数は8000オブジェクトです。 c20011626 SCRダイレクト・ドライバP2sora7.dllを使用した場合のみ、Oracleストア

ド・プロシージャにアクセスできます。ドライバのバージョン6.0.0.20には、最大97フィールドの制限があります。これは、バージョン7.0.0.46で修正されています。

c2001269

すべて 非同期問合せを実行するSCRオプションがOracleで機能しません。Oracle ODBCドライバで非同期問合せをサポートしていないためです。

c2003042

7 ODBCまたはOracleネイティブ・ドライバ(OCI?▼{疑問符は著者が後で確認しようとして付けたものではないでしょうか?}▽)を使用すると、SCRではUNIONおよびSELECT DISTINCTを使用した結合で無効なコードが生成されます。ORDER BY句に表の名前が追加されます。

c2002660

7(16ビット) Oracle7の表からレポートを取得するには、Cror704.dllまたはCror707.dllが必要です。

c2006778

7(32ビット) Oracle7.1~7.3の表からレポートを取得するにはCror709.dllが必要です。 c20067787 Oracleストアド・プロシージャのサポート c20045817 Oracle 7.3データベースからの計算結果列を含むビューを作成します。 c20051408 RAWフィールドを含むOracleの表からODBCを使用してレポートを作成

する際に問題が発生します。 c2005140

8 Oracle ODBCドライバ8.1.5.5.0を使用すると、表からの文字列値で切捨てが発生します。この問題は、バージョン8.1.5.0.0を再インストールすると訂正されます。

c2006909

- 32 -

次の表は、ODBCに関するMicrosoft社またはSeagate(現Crystal Decisions)/Merant社のdllを示します。(Article ID: c2001889)

一般的な依存性 16ビットODBC: 32ビットODBC: Odbc.dll Odbc32.dll Odbccp.dll Odbccp32.dll Odbcint.dll Odbcint.dll Msvcrt.dll Msvcrt.dll Advapi.dll Advapi32.dll Kernel.dll Kernel32.dll Crbas09.dll User32.dll Crutl09.dll Crbas11.dll Crflt09.dll Crutl11.dll Crflt11.dll 次の表は、Seagate(現Crystal Decisions)社またはMerant社が提供する特定のODBCドライバに関する情報です。(Seagate Article ID: c2001889)

個々の依存性 Seagate(現Crystal Decisions)社提供のOracle用ドライバ(16ビット)

Seagate(現Crystal Decisions)社提供のOracle用ドライバ(32ビット)

ドライバ: CR Oracle7 ドライバ: CR Oracle7 説明: INTERSOLV Oracle7 ODBC ドライバ 説明: INTERSOLV Oracle7 ODBC ドライバ バージョン: 2.50.0000 バージョン: 3.00.0000 ファイル名: Cror709.dll Cror711.dll 直接依存するファイル: Ociw16.dll Ociw32.dll Seagate(現Crystal Decisions)社提供のOracleネイティブ・ドライバ(16ビット)

Seagate(現Crystal Decisions)社提供のOracleネイティブ・ドライバ(32ビット)

説明: Crystal Reports 32-bit Physical Server DLL for Oracle 7.x

説明: Crystal Reports 32-bit Physical Server DLL for Oracle 7.x

バージョン: 6.0.0.15 バージョン: 6.0.0.15 ファイル名: Pdsora7.dll P2sora7.dll 直接依存するファイル: Ociw16.dll Ociw32.dll 次のドライバは、Oracle8iとの接続のために

Seagate(現Crystal Decisions)からダウンロードできます。SCR 7および8とともに機能します。

Seagate(現Crystal Decisions)社提供のOracle用ドライバ(32ビット)

ドライバ: CR Oracle8 説明: INTERSOLV Oracle7 ODBC ドライバ Cror815.dll Ociw32.dll

- 33 -

様々なOracleデータベースとの接続性を詳しく説明したSeagate(現Crystal Decisions)社の記事

Oracle接続サポート(Article ID: c2000287→c2001157へ統合) Oracle7より前 Oracle 7.x Oracle 8 5.0 16-bit Directより前 No No No ODBC Yes Yes Yes 32-bit Direct No No No ODBC Yes Yes Yes 5.0.x.108 16-bit Direct No 7.2, 7.3 No ODBC Yes Yes Yes 32-bit Direct No Yes No ODBC Yes Yes Yes 6.0.x.135 16-bit Direct No 7.2, 7.3 Yes ODBC Yes Yes Yes 32-bit Direct No Yes Yes ODBC Yes Yes Yes 前述の表の最後の項目から、32ビットODBCでCrystal Reports 7および8を使用したOracle 8.1.5への接続がサポートされると想定されます。 Webページから判断するかぎり、Seagate(現Crystal Decisions)社がサポートしているのは同社製のOracle用ODBCドライバ、またはMerant(旧Intersolv)社から提供されているODBCドライバのみです。Seagate(現Crystal Decisions)社のWebページには、Oracle ODBCドライバを使用した接続をサポートしているという記述はありません。

XXXII. 準拠エラー準拠エラー準拠エラー準拠エラー

Oracle ODBCドライバの使用時に検出される既知の準拠エラーとその解決策は、次のとおりです。

A. 準拠エラー準拠エラー準拠エラー準拠エラー ---- 7751またはまたはまたはまたは7713: Access 2.0またはまたはまたはまたはVB 3の使用時の使用時の使用時の使用時

Jet DLL(MSAJT200.DLL)の古いバージョンをOracle ODBCドライバの新しいバージョンとともに使用すると、このエラーが発生します。このDLLをバージョン2.0からバージョン2.5にアップグレードする必要があります。このアップグレードは、Microsoft社のFTPサイトから入手できます。

B. 準拠準拠準拠準拠エラーエラーエラーエラー ---- 7711: 16ビットビットビットビットAccess((((1.0またはまたはまたはまたは2.0)の使用時)の使用時)の使用時)の使用時

これはドライバのバージョン1.10での問題で、バージョン1.11.0.2以降では解決済みです。

- 34 -

C. 準拠エラー準拠エラー準拠エラー準拠エラー ---- 7711: Access 97(または他の(または他の(または他の(または他の32ビットビットビットビットODBCアプリケーション)アプリケーション)アプリケーション)アプリケーション)の使用時の使用時の使用時の使用時

この問題は、ODBCドライバ・パーサーのバグが原因です(バグ番号758536を参照)。この問題は、次の構文を使用してストアド・プロシージャをコールすることと関係します。

BEGINMyproc();END;

コールの構文を次のように変更します。

BEGIN Myproc(); END;

これで正しく機能します。

D. 準拠エラー準拠エラー準拠エラー準拠エラー ---- 7739: ビットマップ索引を持つ表の使用時ビットマップ索引を持つ表の使用時ビットマップ索引を持つ表の使用時ビットマップ索引を持つ表の使用時

これはOracle ODBCドライバ8.0.3のバグで、バージョン8.0.4.x以降では解決済みです。

E. 準拠エラー準拠エラー準拠エラー準拠エラー ---- 7746: ビットマップ索引を持つ表の使用時ビットマップ索引を持つ表の使用時ビットマップ索引を持つ表の使用時ビットマップ索引を持つ表の使用時

これはODBCドライバ7.xのバグで、バージョン2.0.3.1.2以降を使用する必要があります。

F. 準拠エラー準拠エラー準拠エラー準拠エラー ---- 7768: Oracle ODBCドライバドライバドライバドライバ8.0の使用時にの使用時にの使用時にの使用時に、、、、NULL DATEデータデータデータデータが表に含まれている場合が表に含まれている場合が表に含まれている場合が表に含まれている場合

これも、ODBCドライバのバージョン8.0.3.0.2以降で解決されているバグです。

G. 準拠エラー準拠エラー準拠エラー準拠エラー ---- 7776: Access 2.0の使用時の使用時の使用時の使用時

これは、Oracle ODBCドライバが無効な日付書式(表に無効な日付データが含まれている場合)を処理する方法のバグです。これは、バージョン2.0.3.1.5以降で修正されています。

XXXIII. その他の問題その他の問題その他の問題その他の問題

A. 管理者により作成されたシステム管理者により作成されたシステム管理者により作成されたシステム管理者により作成されたシステムDSNが、他のユーザーに表示されない。が、他のユーザーに表示されない。が、他のユーザーに表示されない。が、他のユーザーに表示されない。

これは、NTレジストリ内の権限に関する問題です。問題のPCでREGEDT32プログラム を 管 理 者 と し て 実 行 し ま す 。 レ ジ ス ト リ でHKEY_LOCAL_MACHINE¥SOFTWARE¥ODBCハイブをハイライトします。メニューから「セキュリテイ」→「アクセス権」を選択します。ユーザーEVERYONEは、Query Value、Set Value、Create Subkey、Enumerate Subkeys、Notify、DeleteおよびRead Control

- 35 -

を持った「特殊なアクセス権」に設定されている必要があります。かわりに、このハイブでEVERYONEに「フル コントロール」を付与することもできます。

B. ドライバをインストールした後、そのドライバがドライバをインストールした後、そのドライバがドライバをインストールした後、そのドライバがドライバをインストールした後、そのドライバがODBCアドミニストレータに使アドミニストレータに使アドミニストレータに使アドミニストレータに使用可能として表示されない。用可能として表示されない。用可能として表示されない。用可能として表示されない。

これは、通常、レジストリ内のアクセス権が原因です。REGEDITを開き、次の場所を探します。

HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI

(ODBCINST.INIキーの下の)ODBC Driversキーに、次の項目が1つ以上表示されている必要があります。

Oracle73 Ver 2.5 = "Installed"

または

Oracle ODBC Driver = "Installed"

メインのODBCINST.INIキー・リストに、対応する項目が表示されます。これらの項目は、2.5.3.1.xドライバと、8.0.5.xドライバまたは8.1.xドライバのいずれかに対応します。「Oracle ODBC Driver」が8.0.5.xドライバを指すか8.1.xドライバを指すかを見分けるには、メイン・キーを調べて、指定されているパスを調べる方法しかありません。パスはドライバのホームを示します。

正しい項目がないと、インストール済みとしてアドミニストレータに表示されません。通常は、Oracle Installerにより正しい項目が作成されます。次のテストを実行してみてください。

• ODBCINST.INIキーの下にTESTという新しいキーを作成します。

• TESTキーの中に新しい文字列値を作成し、これに値TESTを割り当てます。

• レジストリ・エディタを閉じます。

• レジストリ・エディタを再起動し、ODBCINST.INIキーにナビゲートします。加えた変更がそのまま表示されている(しかも、キーの作成中にエラーが返されなかった)場合は、必要な権限が付与されているので、ODBCのインストールの失敗は別の理由によるものです。加えた変更が表示されていない場合(または作成中にエラーが返された場合)は、ODBCドライバのインストールに必要な権限がありません。解決するには、システム管理者としてログオンするか、Windows 95/98の場合は、ネットワーク管理者から必要な権限を付与されていることを確認します(必須プロファイルに記載されている可能性があります)。

C. SQLSTATE 01000、、、、Native Error Code 444

表示されるメッセージは、「Sqlstate 01000 native error 444 driver message invalid or failed to return sql_driver_odbc_ver:03.51」です。

「sqlstate 01000 native error code 444」の原因は、8.1.6 ODBCドライバの準拠レベルが3.5.1のためです。ODBCアドミニストレータの準拠レベルは3で、ODBCアドミニストレータとODBCドライバとの準拠レベルが一致していません。MDACを2.5に更新する

- 36 -

か再インストールしてください。このインストール/更新は、www.microsoft.com/dataからダウンロードできます。MDAC 2.5ダウンロードのリンクに従ってください。

D. SQLSTATE 01000、、、、Native Error Code 3121((((ORA-3121))))

このエラーは、ODBCレイヤーが基になるSQL*Netレイヤーと通信できないことを示します。この原因としては次のようなことが考えられます。

• ORACLE_HOME¥BIN(つまり、ORAWIN¥BIN、ORANT¥BIN、ORAWIN95¥BIN)ディレクトリが検索パスに含まれていません。 Oracle Toolsとは異なり、ODBCは通常ではORACLE_HOME¥BINディレクトリからは実行されないため、基になるRequired Support Filesをシステム検索パス経由でロードする必要があります。RSFを見つけられないと、このエラーになります。MSDOSプロンプトからPATHコマンドまたはSETコマンドを使用して、プラットフォームに適したORACLE_HOME¥BINディレクトリがシステム検索パスに含まれていることを確認します。

• インストール済みのSQL*Netのバージョンとインストール済みのODBCドライバのバージョンとの互換性がありません。 V節「サポートされているドライバのバージョン」の表を参照してください。サポートされているODBCドライバとSQL*Netのバージョンがリストされています。

• ODBC DSNを構成したときに、SQL*Net接続文字列オプションで不正な情報を指定しました。SQL*Net接続文字列は、SQL*Plusでの接続に指定する接続情報での接続に指定する接続情報での接続に指定する接続情報での接続に指定する接続情報とまったとまったとまったとまったく同じです。く同じです。く同じです。く同じです。SQL*Netバージョン2.xでは、これはSQL*Netエイリアスそのものです。SQL*Netバージョンバージョンバージョンバージョン1.xがインストールしてあり機能していて、このバージョンがインストールしてあり機能していて、このバージョンがインストールしてあり機能していて、このバージョンがインストールしてあり機能していて、このバージョン1.xを使用する場合を除き、このエイリアスにはを使用する場合を除き、このエイリアスにはを使用する場合を除き、このエイリアスにはを使用する場合を除き、このエイリアスにはT:ややややX:などの接頭辞を付けないでくだなどの接頭辞を付けないでくだなどの接頭辞を付けないでくだなどの接頭辞を付けないでください。さい。さい。さい。ODBCドライバのバージョンによっては、ヘルプの記述でこの点が明確に記載されていないものがあります。

E. SQLSTATE IM003、システム・エラー・コード、システム・エラー・コード、システム・エラー・コード、システム・エラー・コード 1157

前述のD項の最初の箇条書きを参照してください。システム検索パスにORACLE_HOME¥BINディレクトリが含まれていないことが原因です。Required Support Filesがないことも、この原因になります。ドライバでは、Oracleクライアント・ソフトウェアの特定のバージョンがインストールされていると想定します。違うバージョンがインストールされていると、このエラーが返されることがあります。(前述のV節の表を参照してください。)

F. Oracle 8.0のドライバで、オブジェクト名の大のドライバで、オブジェクト名の大のドライバで、オブジェクト名の大のドライバで、オブジェクト名の大/小文字を保持しない小文字を保持しない小文字を保持しない小文字を保持しない

サード・パーティ・ツール(Microsoft Accessなど)により作成された表では、大/小文字を混在させて作成した表の名前などが、すべて大文字で作成されることがあります。これは、ODBCドライバのバージョン8.0.3.0.1以降で解決されています。

- 37 -

G. Oracle8を使用する際のアンダースコア「を使用する際のアンダースコア「を使用する際のアンダースコア「を使用する際のアンダースコア「_」付きのスキーマ名および表名」付きのスキーマ名および表名」付きのスキーマ名および表名」付きのスキーマ名および表名

これは、ODBCドライバ8.0.3.xおよび8.0.4.xで認識されている問題で、8.0.4.0.2以降で解決済みです。スキーマ名または表名にアンダースコア文字が含まれている場合、このオブジェクトのアクセス時にエラーが返されます。スキーマ名にアンダースコアが含まれている場合は、ユーザーとしてログオンすれば、ODBC API経由でこのオブジェクトにアクセスできます。USER_TABLESはアクセスできません(Jetではスキーマ名をオブジェクトの接頭辞として付けるため、オブジェクトにアクセスできません)。

H. Oracle Names Server使用時の使用時の使用時の使用時のODBCT32.EXE(または(または(または(またはMSQuery)を使用した接)を使用した接)を使用した接)を使用した接続でのアクセス違反(続でのアクセス違反(続でのアクセス違反(続でのアクセス違反(GPF)(スタック関連のクラッシュまたはエラー))(スタック関連のクラッシュまたはエラー))(スタック関連のクラッシュまたはエラー))(スタック関連のクラッシュまたはエラー)

これは、SQL*Net名の使用ですでに認識されている問題(バグ番号562551)です。問題は、ODBCT32アプリケーションに十分なスタック領域が割り当てられていないということです(MSQueryでも同じ問題です)。アプリケーション(ODBCT32.EXE)に大きなデフォルト・スタック領域が指定されるようなパッチが必要になります。このプログラムの新しいリリースで修正される予定です。ドライバのバージョン8.0.5.1.x以降は、コール側アプリケーションに対するスタック要件を最小化するようにチューニングされています。同じ問題のあるサード・パーティ・アプリケーションにはこれが役立つ可能性があります。Names Serverでの既存のバグでは、スタック要件をこのレイヤー内で最小化することが求められます(ODBCレイヤーではすでにこれが行われています)。アプリケーションには最低限のスタックを実装することが求められます16が、これはODBCドライバやネットワーク・レイヤーの制御範囲外のことです。

I. ODBC経由の経由の経由の経由のOPS$((((OS認証)認証)認証)認証)

最初のステップは、RDBMS上でOS認証が正しく設定されていることと、SQL*Plusなどのツールを介して機能することの確認です。これを行った後は、次のようにODBC経由でOS認証を使用できます。

プログラムで接続する場合は、SqlDriverConnect(ODBC接続のための任意のAPIコール)に対して、ユーザー名(UID)およびパスワード(PWD)パラメータのかわりに空の文字列(" ")を渡します。DSN構成にデフォルトのユーザー名を指定してある場合は、OPS$が機能しないことがあります。デフォルト・ユーザーは空白(空)に設定する必要があります。その後、ODBCドライバの接続時に、OSユーザーが自動的に認証されます。ログオン・ダイアログ・ボックスが表示された後、ユーザー名とパスワードのフィールドを空白に設定すると、OSユーザーとして接続できる可能性があります。「可能性がある」というのは、Oracle8ドライバ(8.0.4.0.2のレベル)では、デフォルト・ユーザーが構成されている場合はデフォルト・ユーザーが常に優先しますが、7.3ドライバ(2.5.xのレベル)では、この指定で接続できるためです。OS認証を使用する場合は、デフォルト・ユーザーを構成しないでください。

16 Windows 32ビット・アプリケーションではスタック・サイズが非常に大きくなる可能性があるため、これはWin32アプリケーション開発者にとっては制約にはなりません。ODBC対応のアプリケーションの場合、アプリケーション開発者は通常よりも大きいスタック領域が必要になることを想定する必要があります。

- 38 -

J. Oracle8ドライバでの非同期サポート・オプションなしドライバでの非同期サポート・オプションなしドライバでの非同期サポート・オプションなしドライバでの非同期サポート・オプションなし

Oracle 7.x ODBCドライバは、文の非同期実行をサポートする最後のドライバです。Oracle 8.0 OCIでは非ブロック化モードをサポートしていません(ただし、これはRDBMSの将来のリリースでの復活が計画されています)。これが非同期動作を実装するために使用されたメカニズムであるため、7.x以降のドライバではこれは使用できません。

K. フェイルセーフおよびフェイルセーフおよびフェイルセーフおよびフェイルセーフおよびOracle Real Application ClustersでのでのでのでのODBCサポートサポートサポートサポート

これらの機能に対するサポートは、Oracle ODBCドライバのバージョン8.0.5.1.0bに追加されています。

L. DSNを指定しない接続を指定しない接続を指定しない接続を指定しない接続

この機能は、ODBC API仕様レベル3で追加されています。Oracle ODBCドライバのバージョン8.0.4.0.3以降でこの種の接続を使用できます。8.0.4.0.3時点では、SERVERパラメータはまだ使用されていません。かわりに、DBQパラメータに接続情報(SQL*Netサービス名またはエイリアス名)を指定します。これは、ドライバの将来のリリースで変更される可能性があります。DSNを使用しない接続を示すVBコード(断片)を、次に示します。

Dim en As rdoEnvironmentDim cn As rdoConnectionSet en = rdoEnvironments(0)Set cn = en.OpenConnection(dsName:="", Prompt:=rdDriverNoPrompt, _

Connect:="uid=scott;pwd=tiger; _driver={Oracle ODBC Driver};" _& "DBQ=Beq-Local;")

MsgBox cn.Connect

Set RdoRecordset = cn.OpenResultset("select * from dept", _rdOpenDynamic, rdConcurValues)

While Not RdoRecordset.EOFMsgBox RdoRecordset(1)RdoRecordset.MoveNextWend

M. 数値(数値(数値(数値(11)列タイプ使用時の「型の不一致」エラー)列タイプ使用時の「型の不一致」エラー)列タイプ使用時の「型の不一致」エラー)列タイプ使用時の「型の不一致」エラー

このバグは、ODBCドライバのバージョン8.0.5.0.0以降で解決されています。

N. * select使用時の不正な列順序使用時の不正な列順序使用時の不正な列順序使用時の不正な列順序

このバグは、Oracle ODBCドライバのバージョン8.0.4.4.0以降で解決されています。

- 39 -

O. VARCHAR列を空白文字または列を空白文字または列を空白文字または列を空白文字またはNULL文字で更新しようとしたときに表示される文字で更新しようとしたときに表示される文字で更新しようとしたときに表示される文字で更新しようとしたときに表示される[Oracle][ODBC]Invalid precision value (#0)

これはバグ番号771026のバグで、ODBCドライバのバージョン8.0.5.3.0以降で解決されています。

P. 即時ロックのサポート即時ロックのサポート即時ロックのサポート即時ロックのサポート

問題は、ADOがクライアント側カーソルでのadLockPessimisticをサポートしていないということです。Microsoft Knowledge BaseのQ190625にこれが説明されています。カーソル位置にadUseServerを指定するようにします。

* 一般情報: ADO、ODBCおよびカーソル

ADOでは、プロパティ「CursorLocation」に指定するオプションとして「adUseClient」と「adUseServer」があります。これらの名前は、SQL Serverを使用している場合は意味がありますが、Oracleを使用している場合はあまり意味がありません。Oracle ODBCドライバではサーバー側カーソルをサポートしていませんが、adUseServerとadUseClientの間には動作上重要な違いがあります。

* adUseClientおよびadUseServerの実際の意味

adUseClientは、Microsoft ODBCドライバ・マネージャにより提供されているカーソル・ライブラリを使用するように、ドライバに対して指示します。AdUseServerは、ドライバ独自のカーソル・ライブラリを使用するように指示します。Microsoft SQL Serverのドライバでは、ドライバ・マネージャのライブラリを使用しないように指定するとサーバー側カーソルを使用するため、Microsoft社ではこのような命名規則を使用しています。

* Oracleのカーソル・ライブラリとドライバ・マネージャのカーソル・ライブラリの大きな違い

注意注意注意注意: 『ODBC 3.0プログラマーズリファレンス&SDK』の付録Fにはこの違いやその他様々な違いが詳しく説明されています。

1) ドライバ・マネージャのライブラリでは、次のようなSQL文を変更します。

- 位置の決められた更新文または削除文

- SELECT FOR UPDATE文

- バッチSQL文

最もよくある問題は、FOR UPDATE句がカーソル・ライブラリにより削除されてしまうことです。この場合、文は警告やエラーなしで正常に実行され、データベースでは行がロックされるべきところロックされないため、混乱が発生します。

2) ドライバ・マネージャのカーソル・ライブラリを指定した場合、クライアントにデータを2回キャッシュしてしまうことがあります。ドライバ・マネージャのカーソル・ライブラリがデータをキャッシュし、Oracleドライバがデータをキャッシュする可能性があります。ドライバはMicrosoftカーソル・ライブラリが使用されていることを認識しないため、このキャッシュの重複の問題は避けられません。

- 40 -

3) ドライバ・マネージャのカーソル・ライブラリを指定した場合、アプリケーションとデータベースとの間にレイヤーが1つ追加されます。通常は、次のレイヤー構造です。

クライアント→ドライバ・マネージャ→Oracleドライバ→データベース

これが、次のようになります。

クライアント→ドライバ・マネージャ→MSカーソル・ライブラリ→Oracleドライバ→データベース

この場合、ほとんどのケースで速度が低下します。