3.22 グローバリゼーション・サポート
ODP.NETグローバリゼーション・サポートを使用すると、アプリケーションでは地域に依存するデータを適切に処理できます。この機能により、Oracleグローバリゼーション設定に応じて、適切な文字列書式、日付、時刻、金額、数値、ソート順序およびカレンダの表記規則が使用されます。
注意:
-
ODP.NET管理対象ドライバは、
NLS_LANGを認識しません。.NETロケールのみ認識されます。 -
ODP.NET管理対象ドライバは、スレッドベースのグローバリゼーションをサポートしていません。
関連項目:
この項の内容は次のとおりです。
3.22.1 グローバリゼーション設定
OracleGlobalizationオブジェクトを使用すると、次のものを表すことができます。
3.22.1.1 クライアントのグローバリゼーション設定
クライアントのグローバリゼーション設定は、ローカル・コンピュータの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グローバリゼーション値の設定を指定します。
3.22.1.2 セッションのグローバリゼーション設定
セッション・グローバリゼーション・パラメータは、最初はクライアントのグローバリゼーション設定と同じです。クライアント設定と異なり、セッションのグローバリゼーション設定は更新可能ですが、データベースに対する接続を確立した後にのみ取得できます。セッションのグローバリゼーション設定は、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();
}
}
3.22.1.3 スレッドベースのグローバリゼーション設定
スレッドベースのグローバリゼーション・パラメータ設定は、各スレッドに固有です。最初は、これらの設定はクライアントのグローバリゼーション設定と同じですが、アプリケーションで指定されたとおりに変更できます。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グローバリゼーション・サポート・ガイドを参照
3.22.2 グローバリゼーションに依存した操作
この項では、グローバリゼーション設定に依存するODP.NETタイプおよび操作をリストします。
3.22.2.1 クライアント・コンピュータのグローバリゼーション設定に依存する操作
OracleString構造は、クライアント・コンピュータのOracleGlobalization設定に依存します。ローカル・コンピュータのクライアント・キャラクタ・セットは、GetNonUnicodeメソッドでUnicode文字列をbyte[]に変換する場合、およびbyte[]を受け入れるOracleStringコンストラクタでANSI文字のbyte[]をUnicodeに変換する場合に使用されます。
3.22.2.2 スレッドのグローバリゼーション設定に依存する操作
スレッドのグローバリゼーション設定は、.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クラス」の備考を参照してください。
3.22.3 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コマンドを実行して、セッション・タイム・ゾーン・プロパティをリージョン識別子に設定することです。