プライマリ・コンテンツに移動

Oracle® Data Provider for .NET開発者ガイド ODAC 12.2c リリース1 (12.2.0.1) for Microsoft Windows E88311-03 |
| 目次 | 索引

前 | 次 |

# グローバリゼーション・サポート

ODP.NETグローバリゼーション・サポートを使用すると、アプリケーションでは地域に依存するデータを適切に処理できます。この機能により、Oracleグローバリゼーション設定に応じて、適切な文字列書式、日付、時刻、金額、数値、ソート順序およびカレンダの表記規則が使用されます。

注意:

- ODP.NET管理対象ドライバは、`NLS_LANG`を認識しません。.NETロケールのみ認識されます。

- ODP.NET管理対象ドライバは、スレッドベースのグローバリゼーションをサポートしていません。

関連項目:

OracleGlobalizationクラス

この項の内容は次のとおりです。

- グローバリゼーション設定

- グローバリゼーションに依存した操作

## グローバリゼーション設定

`OracleGlobalization`オブジェクトを使用すると、次のものを表すことができます。

- クライアントのグローバリゼーション設定

- セッションのグローバリゼーション設定

- スレッドベースのグローバリゼーション設定

### クライアントのグローバリゼーション設定

クライアントのグローバリゼーション設定は、ローカル・コンピュータのWindowsレジストリのOracleグローバリゼーション設定(`NLS_LANG`)から導出されます。クライアントのグローバリゼーション・パラメータ設定は読取り専用で、アプリケーションの存続中は一定です。クライアントのグローバリゼーション設定は、`OracleGlobalization.GetClientInfo`静的メソッドをコールすることで取得できます。

次の例は、クライアントのグローバリゼーション設定を取得します。

    // C#

    using System;
    using Oracle.DataAccess.Client;

    class ClientGlobalizationSample
    {
      static void Main()
      {
        OracleGlobalization ClientGlob = OracleGlobalization.GetClientInfo();

        Console.WriteLine("Client machine language: " + ClientGlob.Language);
        Console.WriteLine("Client characterset: " + ClientGlob.ClientCharacterSet);
      }
    }

`OracleGlobalization`オブジェクトのプロパティは、Oracleグローバリゼーション値の設定を指定します。

### セッションのグローバリゼーション設定

セッション・グローバリゼーション・パラメータは、最初はクライアントのグローバリゼーション設定と同じです。クライアント設定と異なり、セッションのグローバリゼーション設定は更新可能ですが、データベースに対する接続を確立した後にのみ取得できます。セッションのグローバリゼーション設定は、`OracleConnection`オブジェクトで`GetSessionInfo`メソッドをコールすることで取得できます。このメソッドを起動すると、プロパティがセッションのグローバリゼーション設定を表す`OracleGlobalization`クラスのインスタンスのプロパティが戻されます。

`OracleConnection`オブジェクトが接続を確立すると、クライアント・コンピュータのOracleグローバリゼーション(または(NLS))レジストリ設定で指定された値でグローバリゼーション・パラメータが初期化されたセッションが暗黙的にオープンします。セッション設定は更新可能で、存続中に変更できます。

次の例は、セッションの日付書式の設定を変更します。

    // C#

    using System;
    using Oracle.DataAccess.Client;

    class SessionGlobalizationSample
    {
      static void Main()
      {
        OracleConnection con = new OracleConnection();

        con.ConnectionString = "User Id=scott;Password=tiger;Data Source=oracle;";
        con.Open();

        OracleGlobalization SessionGlob = con.GetSessionInfo();

        // SetSessionInfo updates the Session with the new value
        SessionGlob.DateFormat = "YYYY/MM/DD";
        con.SetSessionInfo(SessionGlob);
        Console.WriteLine("Date Format successfully changed for the session");

        // Close and Dispose OracleConnection object
        con.Close();
        con.Dispose();
      }
    }

### スレッドベースのグローバリゼーション設定

スレッドベースのグローバリゼーション・パラメータ設定は、各スレッドに固有です。最初は、これらの設定はクライアントのグローバリゼーション設定と同じですが、アプリケーションで指定されたとおりに変更できます。ODP.NETタイプと文字列の間で変換が行われると、スレッドベースのグローバリゼーション・パラメータが使用されます(該当する場合)。

スレッドベースのグローバリゼーション・パラメータ設定は、`OracleGlobalization`クラスの`GetThreadInfo`静的メソッドを起動することで取得されます。`OracleGlobalization`クラスの`SetThreadInfo`静的メソッドをコールすると、スレッドのグローバリゼーション設定を設定できます。

文化によって異なるデータを操作する場合、ODP.NETクラスおよび構造体は、`OracleGlobalization`設定のみを使用します。.NETスレッドの文化情報は使用されません。アプリケーションで.NET型のみを使用する場合は、`OracleGlobalization`の設定は影響しません。ただし、ODP.NETタイプと.NETタイプ間で変換が行われる場合、`OracleGlobalization`設定が使用されます(該当する場合)。

注意:

`System.Threading.Thread. CurrentThread.CurrentCulture`プロパティを変更しても、スレッドまたはセッションの`OracleGlobalization`設定には影響せず、その逆も同じです。

次のコードは、スレッドのグローバリゼーション設定がODP.NETタイプでどのように使用されるかを示しています。

    // C#

    using System;
    using Oracle.DataAccess.Types;
    using Oracle.DataAccess.Client;

    class ThreadBasedGlobalizationSample
    {
      static void Main(string[] args)
      {
        // Set the thread's DateFormat for the OracleDate constructor
        OracleGlobalization info = OracleGlobalization.GetClientInfo();
        info.DateFormat = "YYYY-MON-DD";
        OracleGlobalization.SetThreadInfo(info);

        // construct OracleDate from a string using the DateFormat specified.
        OracleDate date = new OracleDate("1999-DEC-01");

        // Set a different DateFormat for the thread
        info.DateFormat = "MM/DD/YYYY";
        OracleGlobalization.SetThreadInfo(info);

        // Print "12/01/1999"
        Console.WriteLine(date.ToString());
      }
    }

`OracleGlobalization`オブジェクトは、プロパティの変更を検証します。プロパティの設定に無効な値が使用された場合、例外がスローされます。`Territory`および`Language`プロパティに対する変更により、`OracleGlobalization`オブジェクトの他のプロパティも暗黙的に変更されます。

関連項目:

`Territory`および`Language`グローバリゼーション設定の影響を受けるプロパティの詳細は、Oracle Databaseグローバリゼーション・サポート・ガイドを参照

## グローバリゼーションに依存した操作

この項では、グローバリゼーション設定に依存するODP.NETタイプおよび操作をリストします。

### クライアント・コンピュータのグローバリゼーション設定に依存する操作

`OracleString`構造は、クライアント・コンピュータの`OracleGlobalization`設定に依存します。ローカル・コンピュータのクライアント・キャラクタ・セットは、`GetNonUnicode`メソッドでUnicode文字列を`byte[]`に変換する場合、および`byte[]`を受け入れる`OracleString`コンストラクタでANSI文字の`byte[]`をUnicodeに変換する場合に使用されます。

### スレッドのグローバリゼーション設定に依存する操作

スレッドのグローバリゼーション設定は、.NET文字列タイプとの間で変換が行われるときにODP.NETタイプで使用されます(該当する場合)。ほとんどの場合、次のODP.NETタイプによって、特定のスレッドのグローバリゼーション設定を使用します。

- `ToString`メソッド

- `Parse`静的メソッド

- .NET文字列データを受け入れるコンストラクタ

- .NET文字列との間の変換演算子

たとえば、`ToString`メソッドが起動される場合、`OracleDate`タイプは、スレッド・グローバリゼーション設定の`DateFormat`プロパティを使用します。これは、スレッドの設定で指定された書式の文字列として`DATE`を戻します。

スレッドのグローバリゼーション設定は、Safeタイプ・マッピングを使用する文字列として`DataSet`に取得されるデータにも影響します。タイプが書式に依存する場合、文字列は常にスレッドのグローバリゼーション設定で指定された書式になります。

たとえば、`INTERVAL` `DAY` `TO` `SECOND`データは、スレッド設定の影響を受けません。このタイプには書式が適用されないためです。ただし、`DateFormat`プロパティおよび`NumericCharacters`プロパティは、Safeタイプ・マッピングによって`DataSet`に文字列として取得される場合、それぞれ`DATE`タイプおよび`NUMBER`タイプの文字列表現に影響します。

関連項目:

- ODP.NETタイプと.NET文字列タイプの間で変換を行うODP.NETタイプ・メソッドの詳細、およびその特定のメソッドに使用されているスレッド・グローバリゼーション設定の判別方法は、「OracleGlobalizationクラス」の備考を参照してください。

- OracleDataAdapter Safeタイプ・マッピング

- Oracle Data Provider for .NETタイプの構造

### セッション・グローバリゼーション・パラメータに依存する操作

セッション・グローバリゼーション設定は、データベースとの間で文字列として取得または送信されたデータに影響します。

たとえば、`TO_CHAR()`関数が適用された`DATE`列を選択した場合、`DATE`列データは、セッション・グローバリゼーション設定の`DateFormat`プロパティで指定された日付書式の文字列になります。データを他のディレクションに送信する場合、`DATE`列に挿入される文字列データは、セッション・グローバリゼーション設定の`DateFormat`プロパティで指定された書式にする必要があります。

## ODP.NET管理対象と管理対象外ドライバの差異

ODP.NET管理対象と管理対象外ドライバでは、デフォルト・セッションのタイム・ゾーンが異なる方法で設定されます。管理対象外ODP.NETのセッションのタイム・ゾーンが時間オフセットを使用するのに対し、管理対象ODP.NETはセッションのタイム・ゾーンの設定にリージョン識別子を使用します。結果として、管理対象ODP.NETはタイムスタンプのLTZ値がセッションのタイム・ゾーンから変換された、またはセッションのタイム・ゾーンに変換されたシナリオで、夏時間調整に対応します。

必要に応じて、この差異を解決する方法が2つあります。ODP.NET管理対象外ドライバでは、アプリケーションは明示的にリージョン識別子に環境変数`ORA_SDTZ`を設定します。たとえば、`set ORA_SDTZ = <Region ID>`です。`ORA_SDTZ`変数が設定されている場合、Oracle Clientはこの値をセッション・タイム・ゾーンとみなします。2番目の方法はALTER SESSIONコマンドを実行して、セッション・タイム・ゾーン・プロパティをリージョン識別子に設定することです。