ヘッダーをスキップ
Oracle Database 2日で.NET開発者ガイド
11gリリース2(11.2)
B56266-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

9 グローバリゼーション・サポートの組込み

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


参照:


グローバル・アプリケーションの概要

この章では、.NETでのOracle Databaseを使用するグローバル・アプリケーションの開発について説明します。ここでは、ロケール認識の開発やユーザーのロケールによる文化的な表記規則を使用したデータ表示など、グローバルにデプロイできるアプリケーションを開発するための基本的なタスクを扱います。また、Oracle Data Provider for .NETで使用できるグローバリゼーション・サポート機能についても説明します。

様々なロケールをサポートするグローバル対応アプリケーションを作成するには、正しい開発手順が必要です。

ロケールとは、各国語およびその言語が話されている地域を意味します。アプリケーション自体で、ユーザーのロケール・プリファレンスを認識し、ユーザーが期待する文化的な表記規則に従ってコンテンツを表示できる必要があります。正しい日付書式や数値書式など、該当するロケールの特性を使用してデータを表示することが重要です。Oracle Databaseは完全に国際化されており、グローバル・アプリケーションの開発およびデプロイに対応したグローバル・プラットフォームを提供しています。

.NET Frameworkを使用したグローバル・アプリケーションの開発

グローバル対応アプリケーションを計画する際には、次の2つの主なタスクを考える必要があります。

.NET FrameworkのSystem.Globalization名前空間には、言語、国および地域、カレンダ、日付の書式パターン、通貨、数値および文字列のソート順序など、文化に関連する情報を定義するクラスが含まれています。これらのクラスによりグローバル対応アプリケーションの開発プロセスが簡略化されます。そのため、ユーザーの文化を表すCultureInfoオブジェクトをSystem.Globalization名前空間に含まれるメソッドに渡すと、一連の正しいルールとデータが適用されます。

.NET Frameworkではリソースの作成とローカリゼーションもサポートされており、リソースをパッケージ化したりデプロイするためのモデルが提供されています。アプリケーションのリソースを特定の文化用にローカライズすることで、翻訳版のアプリケーションの開発がサポートされます。 .NET Frameworkの基本クラス・ライブラリでは、アプリケーション・リソースを構築および操作するための様々なクラスをSystem.Resources名前空間で提供しています。

ユーザーの正しいローカル規則でのデータ表示

アプリケーションのデータはユーザーが期待するとおりに表示される必要があり、そうでない場合は意味が誤って解釈される可能性があります。たとえば、12/11/05は、アメリカ合衆国では2005年12月11日を意味しますが、イギリスでは2005年11月12日を意味します。数値書式と通貨書式にも同様の違いがあります。たとえば、ピリオド(.)は、アメリカ合衆国では小数点セパレータですが、欧州では千単位のセパレータです。

各言語には、それぞれ独自のソート規則があります。アルファベットの文字の順序に従う言語や、文字の画数に従う言語、単語の発音に従う言語などがあります。ユーザーが慣れている言語順序でソートされていないデータを表示すると、情報の検索が難しくなり、時間がかかることがあります。

アプリケーション・ロジックおよびデータベースから取得されるデータの量によっては、アプリケーション・レベルよりもデータベース・レベルでデータを書式設定した方が適切な場合があります。 Oracle Databaseには、ユーザーのロケール・プリファレンスがわかっている場合に、データの表現を調整する機能が多く用意されています。

SQL*Plusへの接続

次の例のいくつかでは、SQL*Plusを使用して、SYSSYSTEMなどのデータベース管理者権限を持つユーザーとして接続する必要があります。


参照:

詳細は、『Oracle Database 2日でデータベース管理者』のユーザー・アカウントのロックおよびロック解除に関する項を参照してください。

Oracleの日付書式の使用

Oracle Databaseの日付表示書式には、標準の書式、短い書式、長い書式の3種類があります。次の手順では、アメリカ合衆国とドイツでの短い日付書式と長い日付書式の違いを示します。

Oracleの日付書式を変更するには、次の手順を実行します。

  1. Windowsのコマンド・プロンプトから次のコマンドを入力します。

      C:\>sqlplus "sys as sysdba"
    Enter password:passwd
    

    passwdは、データベースのインストール時に設定したSysパスワードです。文字を入力しても、パスワードは表示されません。 nls00.gifの説明が続きます。
    nls00.gifの説明

  2. SQLプロンプトで次のコマンドを入力します。

    SQL> ALTER SESSION SET NLS_TERRITORY=america NLS_LANGUAGE=american;
    

    「セッションが変更されました。」というメッセージが表示されます。

    パラメータを現行の設定に設定しても問題はありません。セキュリティ上必要な場合に行うことはできます。現行の設定を確認するには、次のように入力します。

    SQL> select * from v$nls_parameters;
    

    または

    select * from v$nls_parameters where parameter = 'NLS_LANGUAGE';
    
  3. SQLプロンプトで次の問合せを入力します。

    SQL> SELECT employee_id "ID",
      SUBSTR (first_name,1,1)||'. '||last_name "Name",
      TO_CHAR (hire_date, 'DS') "Short Hire",
      TO_CHAR (hire_date, 'DL') "Long Hire Date"
      FROM hr.employees
      WHERE employee_id < 105;
    

    現在はhrではなくsysでログインしているため、hrスキーマのemployees表にアクセスするには、hr.employeesを使用する必要があることに注意してください。

    問合せ結果は、手順1で指定した米語書式で戻されます。

    nls01.gifの説明が続きます。
    nls01.gifの説明

  4. SQLプロンプトで次のコマンドを入力します。

    SQL> ALTER SESSION SET NLS_TERRITORY=germany NLS_LANGUAGE=german;
    

    「セッションが変更されました。」というメッセージが表示されます。

  5. SQLプロンプトで、手順3の問合せを入力します。

    問合せ結果は、手順4で指定したドイツ語書式で戻されます。

    nls02.gifの説明が続きます。
    nls02.gifの説明

Oracleの数値書式の使用

小数点文字およびグループ・セパレータにも違いがあります。次の手順では、アメリカ合衆国とドイツでのこれらの違いを示します。

Oracleの数値書式を変更するには、次の手順を実行します。

  1. SQLプロンプトで次のコマンドを入力します。

    SQL> ALTER SESSION SET NLS_TERRITORY=america NLS_LANGUAGE=american;
    

    「セッションが変更されました。」というメッセージが表示されます。

  2. SQLプロンプトで次の問合せを入力します。

    SQL> SELECT employee_id "ID",
      SUBSTR (first_name,1,1)||'. '||last_name "Name",
      TO_CHAR (salary, '99G999D99') "Salary"
      FROM hr.employees
      WHERE employee_id < 105;
    

    問合せ結果は、手順1で指定した米語書式で戻されます。

    nls03.gifの説明が続きます。
    nls03.gifの説明

  3. SQLプロンプトで次のコマンドを入力します。

    SQL> ALTER SESSION SET NLS_TERRITORY=germany;
    

    「セッションが変更されました。」というメッセージが表示されます。

  4. SQLプロンプトで、手順2の問合せを入力します。

    問合せ結果は、手順3で指定したドイツ語書式で戻されます。

    nls04.gifの説明が続きます。
    nls04.gifの説明

Oracleの言語ソートの使用

スペインでは、伝統的にchllおよびñが独自の文字として扱われ、それぞれclおよびnの後に順序付けられています。次の手順では、ChenChungおよびColmenaresという従業員名にスペイン語のソートを使用した場合の結果を説明します。

Oracleの言語ソートを変更するには、次の手順を実行します。

  1. SQLプロンプトで次のコマンドを入力します。

    SQL> ALTER SESSION SET NLS_SORT=binary;
    

    「セッションが変更されました。」というメッセージが表示されます。

  2. SQLプロンプトで次の問合せを入力します。

    SQL> SELECT employee_id "ID",
              last_name "Name"
      FROM hr.employees
      WHERE last_name LIKE 'C%'
      ORDER BY last_name;
    

    問合せ結果は、手順1で指定したバイナリ・ソート順で戻されます。

    nls05.gifの説明が続きます。
    nls05.gifの説明

  3. SQLプロンプトで次のコマンドを入力します。

    SQL> ALTER SESSION SET NLS_SORT=spanish_m;
    

    「セッションが変更されました。」というメッセージが表示されます。

  4. SQLプロンプトで、手順2の問合せを入力します。

  5. 問合せ結果は、手順3で指定したスペイン語のソート順で戻されます。

    nls06.gifの説明が続きます。
    nls06.gifの説明

Oracleのエラー・メッセージ

NLS_LANGUAGEパラメータでは、データベースのエラー・メッセージの言語を制御することもできます。次の手順で示すとおり、SQL問合せを実行する前にこのパラメータを設定することで、ローカル言語固有のエラー・メッセージが戻されるようになります。

OracleのNLS言語パラメータを変更するには、次の手順を実行します。

  1. SQLプロンプトで次のコマンドを入力します。

    SQL> ALTER SESSION SET NLS_LANGUAGE=american;
    

    「セッションが変更されました。」というメッセージが表示されます。

  2. SQLプロンプトで次の問合せを入力します。

    SQL> SELECT * FROM managers;
    

    問合せ結果として、手順1で指定した言語でエラー・メッセージが戻されます。

    nls07.gifの説明が続きます。
    nls07.gifの説明

  3. SQLプロンプトで次のコマンドを入力します。

    SQL> ALTER SESSION SET NLS_LANGUAGE=french;
    

    「セッションが変更されました。」というメッセージが表示されます。

  4. SQLプロンプトで、手順2の問合せを入力します。

    問合せ結果として、手順3で指定した言語でエラー・メッセージが戻されます。

    nls08.gifの説明が続きます。
    nls08.gifの説明

  5. 言語、ローカルおよびソート設定をリセットし、元の値に戻します。

.NETとOracle Databaseのロケール環境の同期化

グローバル・アプリケーションを開発するときは、データベースとクライアントのユーザー・ロケール設定を常に同期させます。同期させない場合は、文化によって異なる情報が矛盾した状態でアプリケーションから表示されることがあります。 たとえば、.NETアプリケーションでは、SQL操作を実行する前に、アプリケーション・ユーザーのCulture IDを正しいNLS_LANGUAGEパラメータ値およびNLS_TERRITORYパラメータ値にマップする必要があります。

表9-1に、一般的に使用されるロケールの.NET環境とOracle環境での定義を示します。

表9-1 一般的なNLS_LANGUAGEおよびNLS_TERRITORYパラメータ

Culture Culture ID NLS_LANGUAGE NLS_TERRITORY

中国語(中華人民共和国)

zh-CN

SIMPLIFIED CHINESE

CHINA

中国語(台湾)

zh-TW

TRADITIONAL CHINESE

TAIWAN

英語(アメリカ合衆国)

en-US

AMERICAN

AMERICA

英語(イギリス)

en-GB

ENGLISH

UNITED KINGDOM

フランス語(カナダ)

fr-CA

CANADIAN FRENCH

CANADA

フランス語(フランス)

fr-FR

FRENCH

FRANCE

ドイツ語

de

GERMAN

GERMANY

イタリア語

it

ITALIAN

ITALY

日本語

ja

JAPANESE

JAPAN

韓国語

ko

KOREAN

KOREA

ポルトガル語(ブラジル)

pt-BR

BRAZILIAN PORTUGUESE

BRAZIL

ポルトガル語

pt

PORTUGUESE

PORTUGAL

スペイン語

es

SPANISH

SPAIN


Oracle Data Provider for .NETでのクライアント・グローバリゼーションのサポート

Oracle Data Provider for .NETを使用すると、Oracle Databaseで定義されている文化によって異なる表記規則を使用して、適切な文字列書式、日付、時間、金額、数値、ソート順序を保持したり、カレンダをサポートするなど、文化によって異なるデータをアプリケーションで操作できます。デフォルトのグローバリゼーション設定は、クライアントのNLS_LANGパラメータによって決まります。このパラメータは、ローカル・コンピュータのWindowsレジストリで定義されます。OracleConnection Openメソッドにより接続が確立されるときに、NLS_LANGパラメータの値で指定されたグローバリゼーション・パラメータを使用してセッションが暗黙的にオープンされます。

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

クライアント・グローバリゼーション・パラメータ設定は読取り専用であり、アプリケーションの存続期間中は変わりません。OracleGlobalizationオブジェクト・プロパティを変更しても、セッションまたはスレッドのグローバリゼーション設定は変更されません。次の項では、セッションおよびスレッド・レベルでグローバリゼーション設定を変更する方法を説明します。

.NETアプリケーションでは、OracleGlobalization.GetClientInfo()静的メソッドをコールすることでグローバリゼーション設定を取得できます。次のOracleGlobalizationのサンプル・コードは、.NETの値の一部を取得する方法を示しています。

Visual 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);
  }
}

Visual Basic:

Imports System
Imports Oracle.DataAccess.Client

Class ClientGlobalizationSample
  Shared Sub Main()
    Dim ClientGlob As OracleGlobalization = OracleGlobalization.GetClientInfo()
    Console.WriteLine("Client machine language: " + ClientGlob.Language)
    Console.WriteLine("Client characterset: " + ClientGlob.ClientCharacterSet)
  End Sub
End Class

セッション・グローバリゼーション設定の使用

セッション・グローバリゼーション・パラメータは、最初はクライアント・グローバリゼーション設定と同じですが、変更が可能です。セッション・パラメータを変更するには、データベース接続を確立する必要があります。その後、OracleConnectionオブジェクトのGetSessionInfo()メソッドをコールしてセッション・グローバリゼーション設定を取得します。次に、必要に応じてグローバリゼーション設定を変更し、SetSessionInfo(OracleGlobalization)メソッドを使用してOracleConnectionオブジェクトに設定を保存します。

グローバリゼーション・セッション設定を指定するには、次の手順を実行します。

  1. アプリケーションHR_Connect_CSまたはHR_Connect_VBを開きます。

  2. 付録B「フォームのコピー」の手順に従って、第4章の最後で完成させたForm3.xxのコピーを作成し、Form5.xxという名前を付けます。

  3. プロジェクトのForm1を開き、設計ビューに切り替えます。

  4. 「View」メニューから「Toolbox」を選択します。

  5. 「Toolbox」の「Windows Forms」の下にある「Button」をForm1にドラッグ・アンド・ドロップします。

  6. 新しい「Button」を右クリックして「Properties」を選択します。「Properties」ウィンドウが表示されます。

  7. 「Properties」ウィンドウで、次のプロパティを設定します。

    • 「Appearance」の下で、「Text」Change Date Formatに変更します。

    • 「Design」の下で、「(Name)」date_changeに変更します。

      Form1の外観は次のようになります。

      nls09.gifの説明が続きます。
      nls09.gifの説明

    「Properties」ウィンドウで「Events」(稲妻のアイコン)をクリックすると、date_change_Click()が日付ボタンの「Event」として表示されます。

  8. 作成したばかりの新しいdate_change_Click()メソッドを開き、次のコードを追加して日付書式を標準のDD-MON-RRからYYYY-MM-DDに変更し、DataSetを更新します。

    Visual C#:

    si.DateFormat = "YYYY-MM-DD";
    conn.SetSessionInfo(si);
    
    ds.Clear();
    da.Fill(ds);
    departments.DataSource = ds.Tables[0];
    

    Visual Basic:

    si.DateFormat = "YYYY-MM-DD"
    conn.SetSessionInfo(si)
    
    ds.Clear()
    da.Fill(ds)
    departments.DataSource = ds.Tables(0)
    

    ds.Clear()をコールすると、変更したデータがポストされる前に古い結果が消去されることに注意してください。

    また、siクラス変数の宣言およびセッション・グローバリゼーション情報の取得は、手順10および手順11で行います。

  9. 該当するメソッド内に、次のコードを追加します。

    Visual C#: Form1()メソッドに追加

    date_change.Enabled = false;
    

    Visual Basic: Form1_Loadメソッドに追加

    date_change.Enabled = false
    
    nls10.gifの説明が続きます。
    nls10.gifの説明

  10. 次のコードを使用して、既存のForm1クラス宣言のpublic Form1()ブロックの直後に次のクラス変数を追加します。

    Visual C#:

    private OracleGlobalization si;
    

    Visual Basic:

    private si As OracleGlobalization
    
    nls11.gifの説明が続きます。
    nls11.gifの説明

  11. connect_Click()メソッドのTryブロックに、次の操作を実行するコードを追加します。

    • OracleGlobalizationオブジェクトの値の取得

    • EMPLOYEES表からのデータの取得(新しい問合せ)

    • 「Change Date Format」ボタンの有効化

    変更したコードは太字で示しています。

    Visual C#:

    conn.Open();
    connect.Enabled = false;
    
    si = conn.GetSessionInfo();
    
    string sql = "select employee_id, first_name, last_name, TO_CHAR(hire_date)" +
       " \"Hire Date\" from employees where employee_id < 105";
    cmd = new OracleCommand(sql, conn);
    cmd.CommandType = CommandType.Text;
    
    da = new OracleDataAdapter(cmd);
    cb = new OracleCommandBuilder(da);
    ds = new DataSet();
    
    da.Fill(ds);
    
    departments.DataSource = ds.Tables[0];
    
    save.Enabled = true;
    date_change.Enabled = true;
    

    Visual Basic:

    conn.Open()
    connect.Enabled = false
    
    si = conn.GetSessionInfo()
    
    Dim sql As String = "select employee_id, first_name, last_name, " & _
        "TO_CHAR(hire_date) ""Hire Date"" from employees where employee_id < 105"
    cmd = new OracleCommand(sql, conn)
    cmd.CommandType = CommandType.Text
    
    da = new OracleDataAdapter(cmd)
    cb = new OracleCommandBuilder(da)
    ds = new DataSet()
    
    da.Fill(ds)
    
    departments.DataSource = ds.Tables[0]
    
    save.Enabled = true
    date_change.Enabled = true
    
  12. Form1を保存します。

  13. [F5]キーボード・ショートカットを使用してアプリケーションを実行します。

    アプリケーションがデータベースに正しく接続されると、データ・グリッドに問合せ結果が移入されます。

    nls12.gifの説明が続きます。
    nls12.gifの説明

  14. 「Change Date Format」をクリックします。

    nls13.gifの説明が続きます。
    nls13.gifの説明

    日付書式が元のDD-MON-RRからYYYY-MM-DDに変更されることを確認します。

  15. アプリケーションを閉じます。

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

スレッドベースのグローバリゼーション・パラメータ設定は、各スレッドに固有です。これらの設定は、最初はクライアント・グローバリゼーション・パラメータと同じですが、プログラムで変更できます。 ODP.NET型と文字列との間で変換が行われるときに、適用可能であればスレッドベースのグローバリゼーション・パラメータが使用されます。

スレッド・ベースのグローバリゼーション・パラメータ設定を取得するには、OracleGlobalizationクラスのGetThreadInfo()静的メソッドをコールします。SetThreadInfo()静的メソッドをコールすると、スレッドのグローバリゼーション設定が設定されます。

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


注意:

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