この章の内容は次のとおりです。
関連項目:
|
この章では、.NETでのOracle Databaseを使用するグローバル・アプリケーションの開発について説明します。ここでは、ロケール認識の開発やユーザーのロケールによる文化的な表記規則を使用したデータ表示など、グローバルにデプロイできるアプリケーションを開発するための基本的なタスクを扱います。また、Oracle Data Provider for .NETで使用できるグローバリゼーション・サポート機能についても説明します。
様々なロケールをサポートするグローバル対応アプリケーションを作成するには、正しい開発手順が必要です。
ロケールとは、各国語およびその言語が話されている地域を意味します。アプリケーション自体で、ユーザーのロケール・プリファレンスを認識し、ユーザーが期待する文化的な表記規則に従ってコンテンツを表示できる必要があります。正しい日付書式や数値書式など、該当するロケールの特性を使用してデータを表示することが重要です。Oracle Databaseは完全に国際化されており、グローバル・アプリケーションの開発およびデプロイに対応したグローバル・プラットフォームを提供しています。
グローバル対応アプリケーションを計画する際には、次の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を使用して、SYS
やSYSTEM
などのデータベース管理者権限を持つユーザーとして接続する必要があります。
関連項目: 詳細は、『Oracle Database Express Edition 2日でデータベース管理者』のユーザー・アカウントのロックおよびロック解除に関する項を参照してください。 |
Oracle Databaseの日付表示書式には、標準の書式、短い書式、長い書式の3種類があります。次の手順では、アメリカ合衆国とドイツでの短い日付書式と長い日付書式の違いを示します。
Oracleの日付書式を変更するには、次の手順を実行します。
Windowsのコマンド・プロンプトから次のコマンドを入力します。
C:\>sqlplus "sys as sysdba"
Enter password:passwd
passwd
は、データベースのインストール時に設定したSys
パスワードです。文字を入力しても、パスワードは表示されません。
nls00.gifの説明
SQLプロンプトで次のコマンドを入力します。
SQL> ALTER SESSION SET NLS_TERRITORY=america NLS_LANGUAGE=american;
「Session altered
」というメッセージが表示されます。
パラメータを現行の設定に設定しても問題はありません。セキュリティ上必要な場合に行うことはできます。現行の設定を確認するには、次のように入力します。
SQL> select * from v$nls_parameters;
または
select * from v$nls_parameters where parameter = 'NLS_LANGUAGE';
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で指定した米語書式で戻されます。
SQLプロンプトで次のコマンドを入力します。
SQL> ALTER SESSION SET NLS_TERRITORY=germany NLS_LANGUAGE=german;
「Session altered
」というメッセージが表示されます。
SQLプロンプトで、手順3の問合せを入力します。
問合せ結果は、手順4で指定したドイツ語書式で戻されます。
小数点文字およびグループ・セパレータにも違いがあります。次の手順では、アメリカ合衆国とドイツでのこれらの違いを示します。
Oracleの数値書式を変更するには、次の手順を実行します。
SQLプロンプトで次のコマンドを入力します。
SQL> ALTER SESSION SET NLS_TERRITORY=america NLS_LANGUAGE=american;
「Session altered
」というメッセージが表示されます。
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で指定した米語書式で戻されます。
SQLプロンプトで次のコマンドを入力します。
SQL> ALTER SESSION SET NLS_TERRITORY=germany;
「Session altered
」というメッセージが表示されます。
SQLプロンプトで、手順2の問合せを入力します。
問合せ結果は、手順3で指定したドイツ語書式で戻されます。
スペインでは、伝統的にch
、ll
およびñ
が独自の文字として扱われ、それぞれc
、l
およびn
の後に順序付けられています。次の手順では、Chen
、Chung
およびColmenares
という従業員名にスペイン語のソートを使用した場合の結果を説明します。
Oracleの言語ソートを変更するには、次の手順を実行します。
SQLプロンプトで次のコマンドを入力します。
SQL> ALTER SESSION SET NLS_SORT=binary;
「Session altered
」というメッセージが表示されます。
SQLプロンプトで次の問合せを入力します。
SQL> SELECT employee_id "ID", last_name "Name" FROM hr.employees WHERE last_name LIKE 'C%' ORDER BY last_name;
問合せ結果は、手順1で指定したバイナリ・ソート順で戻されます。
SQLプロンプトで次のコマンドを入力します。
SQL> ALTER SESSION SET NLS_SORT=spanish_m;
「Session altered
」というメッセージが表示されます。
SQLプロンプトで、手順2の問合せを入力します。
問合せ結果は、手順3で指定したスペイン語のソート順で戻されます。
NLS_LANGUAGE
パラメータでは、データベースのエラー・メッセージの言語を制御することもできます。次の手順で示すとおり、SQL問合せを実行する前にこのパラメータを設定することで、ローカル言語固有のエラー・メッセージが戻されるようになります。
OracleのNLS言語パラメータを変更するには、次の手順を実行します。
SQLプロンプトで次のコマンドを入力します。
SQL> ALTER SESSION SET NLS_LANGUAGE=american;
「Session altered
」というメッセージが表示されます。
SQLプロンプトで次の問合せを入力します。
SQL> SELECT * FROM managers;
問合せ結果として、手順1で指定した言語でエラー・メッセージが戻されます。
SQLプロンプトで次のコマンドを入力します。
SQL> ALTER SESSION SET NLS_LANGUAGE=french;
「Session altered
」というメッセージが表示されます。
SQLプロンプトで、手順2の問合せを入力します。
問合せ結果として、手順3で指定した言語でエラー・メッセージが戻されます。
言語、ローカルおよびソート設定をリセットし、元の値に戻します。
グローバル・アプリケーションを開発するときは、データベースとクライアントのユーザー・ロケール設定を常に同期させます。同期させない場合は、文化によって異なる情報が矛盾した状態でアプリケーションから表示されることがあります。たとえば、.NETアプリケーションでは、SQL操作を実行する前に、アプリケーション・ユーザーのCulture IDを正しいNLS_LANGUAGE
パラメータ値およびNLS_TERRITORY
パラメータ値にマップする必要があります。
表9-1に、一般的に使用されるロケールの.NET環境とOracle環境での定義を示します。
表9-1 一般的なNLS_LANGUAGEおよびNLS_TERRITORYパラメータ
文化 | 文化ID | NLS_LANGUAGE | NLS_TERRITORY |
---|---|---|---|
中国語(中華人民共和国) |
|
|
|
中国語(台湾) |
|
|
|
英語(アメリカ合衆国) |
|
|
|
英語(イギリス) |
|
|
|
フランス語(カナダ) |
|
|
|
フランス語(フランス) |
|
|
|
ドイツ語 |
|
|
|
イタリア語 |
|
|
|
日本語 |
|
|
|
韓国語 |
|
|
|
ポルトガル語(ブラジル) |
|
|
|
ポルトガル語 |
|
|
|
スペイン語 |
|
|
|
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
オブジェクトに設定を保存し直します。
グローバリゼーション・セッション設定を指定するには、次の手順を実行します。
アプリケーションHR_Connect_CS
またはHR_Connect_VB
を開きます。
付録B「フォームのコピー」の手順に従って、第4章の最後で完成させたForm3.
xx
のコピーを作成し、Form5.
xx
という名前を付けます。
プロジェクトのForm1を開き、設計ビューに切り替えます。
「View」メニューから「Toolbox」を選択します。
「Toolbox」の「Windows Forms」の下にある「Button」をForm1にドラッグ・アンド・ドロップします。
新しい「Button」を右クリックして「Properties」を選択します。「Properties」ウィンドウが表示されます。
「Properties」ウィンドウで、次のプロパティを設定します。
「Appearance」の下で、「Text」をChange
Date
Format
に変更します。
「Design」の下で、「(Name)」をdate_change
に変更します。
Form1の外観は次のようになります。
「Properties」ウィンドウで「Events」(稲妻のアイコン)をクリックすると、date_change_Click()
が日付ボタンの「Event」として表示されます。
作成したばかりの新しい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()
をコールすると、変更したデータがポストされる前に古い結果が消去されることに注意してください。
該当するメソッド内に、次のコードを追加します。
Visual C#: Form1()
メソッドに追加
date_change.Enabled = false;
Visual Basic: Form1_Load
メソッドに追加
date_change.Enabled = false
次のコードを使用して、既存のForm1クラス宣言のpublic
Form1()
ブロックの直後に次のクラス変数を追加します。
Visual C#:
private OracleGlobalization si;
Visual Basic:
private si As OracleGlobalization
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
Form1
を保存します。
[F5]キーボード・ショートカットを使用してアプリケーションを実行します。
アプリケーションがデータベースに正しく接続されると、データ・グリッドに問合せ結果が移入されます。
「Change Date Format」をクリックします。
日付書式が元のDD-MON-RR
からYYYY-MM-DD
に変更されることを確認します。
アプリケーションを閉じます。
スレッドベースのグローバリゼーション・パラメータ設定は、各スレッドに固有です。これらの設定は、最初はクライアント・グローバリゼーション・パラメータと同じですが、プログラムで変更できます。ODP.NET型と文字列との間で変換が行われるときに、適用可能であればスレッドベースのグローバリゼーション・パラメータが使用されます。
スレッド・ベースのグローバリゼーション・パラメータ設定を取得するには、OracleGlobalization
クラスのGetThreadInfo()
静的メソッドをコールします。SetThreadInfo()
静的メソッドをコールすると、スレッドのグローバリゼーション設定が設定されます。
文化によって異なるデータを操作する場合、ODP.NETクラスおよび構造体は、OracleGlobalization
設定のみを使用します。.NETスレッドの文化情報は使用されません。アプリケーションで.NET型のみを使用する場合は、OracleGlobalization
の設定は影響しません。ただし、ODP.NET型と.NET型の間で変換を行う場合は、該当する箇所でOracleGlobalization
の設定が使用されます。
注意: System.Threading.Thread. CurrentThread.CurrentCulture プロパティを変更しても、スレッドまたはセッションのOracleGlobalization 設定は変わりません。その逆も同様です。 |