ヘッダーをスキップ

Oracle® Data Provider for .NET開発者ガイド
リリース9.2.0.4

部品番号 B13807-01
Go To Table Of Contents
目次
Go To Index
索引

Go to previous page Go to beginning of chapter Go to next page

Oracle.DataAccess.Clientネームスペース、5/30


OracleDataAdapterクラス

OracleDataAdapterオブジェクトは、DataSetにデータを移入し、DataSetでの変更をOracleデータベースに反映するデータ・プロバイダ・オブジェクトを表します。

クラスの継承

Object

  MarshalByRefObject

    Component

      DataAdapter

        DbDataAdapter

          OracleDataAdapter

宣言
// C#
public sealed class OracleDataAdapter : DbDataAdapter, IDbDataAdapter
スレッド・セーフティ

インスタンス・メソッドではスレッド・セーフティを保証しませんが、すべてのpublic staticメソッドはスレッド・セーフです。

この項のOracleDataAdapterの例は、次のように定義されたEMPINFO表を基にしています。

  CREATE TABLE empInfo (
    empno NUMBER(4) PRIMARY KEY,
    empName VARCHAR2(20) NOT NULL,
    hiredate DATE,
    salary NUMBER(7,2),
    jobDescription Clob,
    byteCodes BLOB
);

EMPINFO表には、次の値が含まれています。


EMPNO    EMPNAME    HIREDATE    SALARY     JOBDESCRIPTION  BYTECODES
                                                           (Hex Values)
=====    =======    ========    ======     ==============  ============

    1    KING       01-MAY-81   12345.67   SOFTWARE ENGR   {0x12, 0x34}
    2    SCOTT      01-SEP-75   34567.89   MANAGER         {0x56, 0x78}
    3    BLAKE      01-OCT-90   9999.12    TRANSPORT       {0x23, 0x45}
    4    SMITH      NULL        NULL       NULL             NULL

次の例では、OracleDataAdapterおよびデータセットを使用して、EMPINFO表を更新しています。

// C#
public static void AdapterUpdate(string connStr)
{
  string cmdStr = "SELECT EMPNO, EMPNAME, SALARY FROM EMPINFO";

  //create the adapter with the selectCommand txt and the
  //connection string
  OracleDataAdapter adapter = new OracleDataAdapter(cmdStr, connStr);

  //get the connection from the adapter
  OracleConnection connection = adapter.SelectCommand.Connection;

  //create the UpdateCommand object for updating the EMPINFO table
  //from the dataset
  adapter.UpdateCommand = new OracleCommand("UPDATE EMPINFO SET SALARY = "+
    " :iSALARY where EMPNO = :iEMPNO", connection);
  adapter.UpdateCommand.Parameters.Add(":iSALARY", OracleDbType.Double,
    0, "SALARY");
  adapter.UpdateCommand.Parameters.Add(":iEMPNO", OracleDbType.Int16,
        0, "EMPNO");

  //Create and fill the DataSet using the EMPINFO
  DataSet dataset = new DataSet();
  adapter.Fill(dataset, "EMPINFO");

  //Get the EMPINFO table from the dataset
  DataTable table = dataset.Tables["EMPINFO"];

  //Get the first row from the EMPINFO table
  DataRow row0 = table.Rows[0];

  //update the salary in the first row
  row0["SALARY"] = 99999.99;

  //Now update the EMPINFO using the adapter, the salary
  //of 'KING' is changed to 99999.99
  adapter.Update(dataset, "EMPINFO");

}

要件

ネームスペース: Oracle.DataAccess.Client

アセンブリ: Oracle.DataAccess.dll

関連項目:

OracleDataAdapterのメンバー

OracleDataAdapterのメンバーを次の表に示します。

OracleDataAdapterのコンストラクタ

OracleDataAdapterのコンストラクタを表4-31に示します。

表4-31 OracleDataAdapterのコンストラクタ
コンストラクタ 説明

OracleDataAdapterのコンストラクタ

OracleDataAdapterクラスの新規インスタンスをインスタンス化します(オーバーロード)。

OracleDataAdapterのstaticメソッド

OracleDataAdapterのstaticメソッドを表4-32に示します。

表4-32 OracleDataAdapterのstaticメソッド 
メソッド 説明

Equals

Objectから継承されます(オーバーロード)。

OracleDataAdapterのプロパティ

OracleDataAdapterのプロパティを表4-33に示します。

表4-33 OracleDataAdapterのプロパティ 
名前 説明

AcceptChangesDuringFill

DataAdapterから継承されます。

Container

Componentから継承されます。

ContinueUpdateOnError

DataAdapterから継承されます。

DeleteCommand

Oracleデータベースから行を削除するSQL文またはストアド・プロシージャ。

InsertCommand

Oracleデータベースに新規の行を挿入するSQL文またはストアド・プロシージャ。

MissingMappingAction

DataAdapterから継承されます。

MissingSchemaAction

DataAdapterから継承されます。

Requery

Fillへの次のコールでSelectCommandが再実行されるかどうかを判断します。

SafeMapping

データを保持するために、結果セットの列名と.NET型との間にマッピングを作成します。

SelectCommand

単一または複数の結果セットを返すSQL文またはストアド・プロシージャ。

Site

Componentから継承されます。

TableMappings

DataAdapterから継承されます。

UpdateCommand

DataSetからOracleデータベースに行を更新するSQL文またはストアド・プロシージャ。

OracleDataAdapterのpublicメソッド

OracleDataAdapterのpublicメソッドを表4-34に示します。

表4-34 OracleDataAdapterのpublicメソッド 
publicメソッド 説明

CreateObjRef

MarshalByRefObjectから継承されます。

Dispose

Componentから継承されます。

Equals

Objectから継承されます(オーバーロード)。

Fill

Oracleデータベース内のデータと一致するようDataSet内の行を追加またはリフレッシュします(オーバーロード)。

FillSchema

DbDataAdapterから継承されます。

GetFillParameters

DbDataAdapterから継承されます。

GetHashCode

Objectから継承されます。

GetLifetimeService

MarshalByRefObjectから継承されます。

GetType

Objectから継承されます。

InitializeLifetimeService

MarshalByRefObjectから継承されます。

ToString

Objectから継承されます。

Update

DbDataAdapterから継承されます。

OracleDataAdapterのイベント

OracleDataAdapterのイベントを表4-35に示します。

表4-35 OracleDataAdapterのイベント 
イベント・デリゲート名 説明

EventHandler

Componentから継承されます。

FillErrorEventHandler

DbDataAdapterから継承されます。

OracleRowUpdatedEventHandler

RowUpdatedイベント用のイベント・デリゲート。

OracleRowUpdatingEventHandler

RowUpdatingイベント用のイベント・デリゲート。

OracleDataAdapterのイベント・デリゲート

OracleDataAdapterのイベント・デリゲートを表4-36に示します。

表4-36 OracleDataAdapterのイベント・デリゲート  
イベント・デリゲート名 説明

EventHandler

Componentから継承されます。

FillErrorEventHandler

DbDataAdapterから継承されます。

OracleRowUpdatedEventHandler

RowUpdatedイベント用のイベント・デリゲート。

OracleRowUpdatingEventHandler

RowUpdatingイベント用のイベント・デリゲート。

OracleDataAdapterのコンストラクタ

OracleDataAdapterのコンストラクタは、OracleDataAdapterクラスの新規インスタンスを作成します。

オーバーロード一覧:

OracleDataAdapter()

このコンストラクタは、引数を使用せずにOracleDataAdapterクラスのインスタンスを作成します。

宣言
// C#
public OracleDataAdapter();
備考

次のOracleDataAdapterプロパティの初期値は、次のように設定されます。

OracleDataAdapter(OracleCommand)

このコンストラクタは、指定されたOracleCommandSelectCommandとして使用して、OracleDataAdapterクラスのインスタンスを作成します。

宣言
// C#
public OracleDataAdapter(OracleCommand selectCommand);
パラメータ
備考

次のOracleDataAdapterプロパティの初期値は、次のように設定されます。

OracleDataAdapter(string, OracleConnection)

このコンストラクタは、指定されたOracleConnectionオブジェクトおよびSelectCommandのコマンド・テキストを使用して、OracleDataAdapterクラスのインスタンスを作成します。

宣言
// C#
public OracleDataAdapter(string selectCommandText, OracleConnection
selectConnection);
パラメータ
備考

まだオープンされていない場合は、OracleDataAdapterが接続をオープンし、クローズします。接続がオープンしている場合は、明示的にクローズする必要があります。

次のOracleDataAdapterプロパティの初期値は、次のように設定されます。

OracleDataAdapter(string, string)

このコンストラクタは、指定された接続文字列およびSelectCommandのコマンド・テキストを使用して、OracleDataAdapterクラスのインスタンスを作成します。

宣言
// C#
public OracleDataAdapter(string selectCommandText, string
selectConnectionString);
パラメータ
備考

次のOracleDataAdapterプロパティの初期値は、次のように設定されます。

OracleDataAdapterのstaticメソッド

OracleDataAdapterのstaticメソッドを表4-37に示します。

表4-37 OracleDataAdapterのstaticメソッド 
メソッド 説明

Equals

Objectから継承されます(オーバーロード)。

関連項目:

OracleDataAdapterのプロパティ

OracleDataAdapterのプロパティを表4-38に示します。

表4-38 OracleDataAdapterのプロパティ 
名前 説明

AcceptChangesDuringFill

DataAdapterから継承されます。

Container

Componentから継承されます。

ContinueUpdateOnError

DataAdapterから継承されます。

DeleteCommand

Oracleデータベースから行を削除するSQL文またはストアド・プロシージャ。

InsertCommand

Oracleデータベースに新規の行を挿入するSQL文またはストアド・プロシージャ。

MissingMappingAction

DataAdapterから継承されます。

MissingSchemaAction

DataAdapterから継承されます。

Requery

Fillへの次のコールでSelectCommandが再実行されるかどうかを判断します。

SafeMapping

データを保持するために、結果セットの列名と.NET型との間にマッピングを作成します。

SelectCommand

単一または複数の結果セットを返すSQL文またはストアド・プロシージャ。

Site

Componentから継承されます。

TableMappings

DataAdapterから継承されます。

UpdateCommand

DataSetからOracleデータベースに行を更新するSQL文またはストアド・プロシージャ。

関連項目:

DeleteCommand

このプロパティは、Oracleデータベースから行を削除するSQL文またはストアド・プロシージャです。

宣言
// C#
public OracleCommand DeleteCommand {get; set;}
プロパティ値

Updateのコール中に、DataSetで削除された行に対応して、Oracleデータベースの表から行を削除するために使用されるOracleCommand

備考

デフォルトはnullです。

DataSetに主キー情報が存在する場合、コマンドが指定されていなければ、OracleCommandBuilderを使用してDeleteCommandを自動的に生成することができます。

関連項目:

InsertCommand

このプロパティは、Oracleデータベースに新規の行を挿入するSQL文またはストアド・プロシージャです。

宣言
// C#
public OracleCommand InsertCommand {get; set;}
プロパティ値

Updateのコール中に、DataSetに挿入された行に対応して、表に行を挿入するために使用されるOracleCommand

備考

デフォルトはnullです。

DataSetに主キー情報が存在する場合、コマンドが指定されていなければ、OracleCommandBuilderを使用してInsertCommandを自動的に生成することができます。

関連項目:

Requery

このプロパティは、Fillへの次のコールでSelectCommandが再実行されるかどうかを判断します。

宣言
// C#
public Boolean Requery {get; set;}
プロパティ値

Fillへの次のコールでSelectCommandが再実行される場合、trueを返し、それ以外の場合、falseを返します。

関連項目:

SafeMapping

このプロパティは、データを保持するために、結果セットの列名とDataSetの列の値を表す.NET型との間にマッピングを作成します。

宣言
// C#
public Hashtable SafeMapping {get; set;}
プロパティ値

ハッシュテーブル

備考

デフォルトはnullです。

次の型でデータを保持するため、必要に応じてSafeMappingプロパティが使用されます。

// C#
// The following example shows how to use the SafeMapping property to fill the
// dataset
public static void UseSafeMapping(
string connStr)
  {

    //In this SELECT statement, EMPNO, HIREDATE and SALARY must be
    //preserved using safe type mapping.
    string cmdStr = "SELECT EMPNO, EMPNAME, HIREDATE, SALARY FROM EMPINFO";

    //create the adapter with the selectCommand txt and the connection string
    OracleDataAdapter adapter = new OracleDataAdapter(cmdStr, connStr);

    //get the connection from the adapter
    OracleConnection connection = adapter.SelectCommand.Connection;

     //create the safe type mapping for the adapter
    //which can safely map column data to byte arrays, where
    // applicable. By executing the following statement, EMPNO, HIREDATE AND
    //SALARY columns will be mapped to byte[]
    adapter.SafeMapping.Add("*", typeof(byte[]));

    //Map HIREDATE to a string
    //If the column name in the EMPINFO table is case-sensitive,
    //the safe type mapping column name must be case-sensitive.
    adapter.SafeMapping.Add("HIREDATE", typeof(string));

    //Map EMPNO to a string
    //If the column name in the EMPINFO table is case-sensitive,
    //the safe type mapping column name must also be case-sensitive.
    adapter.SafeMapping.Add("EMPNO", typeof(string));

    //Create and fill the DataSet using the EMPINFO
    DataSet dataset = new DataSet();

    adapter.Fill(dataset, "EMPINFO");

    //Get the EMPINFO table from the dataset
    DataTable table = dataset.Tables["EMPINFO"];

    //Get the first row from the EMPINFO table
    DataRow row0 = table.Rows[0];

    //Print out the row info
    Console.WriteLine("EMPNO Column: type = " + row0["EMPNO"].GetType() +
        "; value = " + row0["EMPNO"]);
    Console.WriteLine("EMPNAME Column: type = " + row0["EMPNAME"].GetType() +
        "; value = " + row0["EMPNAME"]);
    Console.WriteLine("HIREDATE Column: type = " + row0["HIREDATE"].GetType()+
        "; value = " + row0["HIREDATE"]);
    Console.WriteLine("SALARY Column: type = " + row0["SALARY"].GetType() +
        "; value = " + row0["SALARY"]);

 }


出力:

EMPNO Column: type = System.String; value = 1
EMPNAME Column: type = System.String; value = KING
HIREDATE Column: type = System.String; value = 01-MAY-81
SALARY Column: type = System.Byte[]; value = System.Byte[]

関連項目:

SelectCommand

このプロパティは、単一または複数の結果セットを返すSQL文またはストアド・プロシージャです。

宣言
// C#
public OracleCommand SelectCommand {get; set;}
プロパティ値

Fillのコール中に、選択された行をDataSetに移入するために使用されるOracleCommand

備考

デフォルトはnullです。

SelectCommandが行をまったく返さない場合は、データセットに表は追加されず、例外は発生しません。

SELECT文の選択先がVIEWの場合、FillSchema()またはFill()MissingSchemaAction.AddWithKeyとともにコールされると、キー情報は取得されません。

関連項目:

UpdateCommand

このプロパティは、DataSetからOracleデータベースに行を更新するSQL文またはストアド・プロシージャです。

宣言
// C#
public OracleCommand UpdateCommand {get; set;}
プロパティ値

Updateのコール中に、DataSetで更新された行に対応して、Oracleデータベースの行を更新するために使用されるOracleCommand

備考

デフォルトはnullです。

DataSetに主キー情報が存在する場合、このプロパティに対してコマンドが指定されていなければ、OracleCommandBuilderを使用してUpdateCommandを自動的に生成することができます。

関連項目:

OracleDataAdapterのpublicメソッド

OracleDataAdapterのpublicメソッドを表4-39に示します。

表4-39 OracleDataAdapterのpublicメソッド 
publicメソッド 説明

CreateObjRef

MarshalByRefObjectから継承されます。

Dispose

Componentから継承されます。

Equals

Objectから継承されます(オーバーロード)。

Fill

Oracleデータベース内のデータと一致するようDataSet内の行を追加またはリフレッシュします(オーバーロード)。

FillSchema

DbDataAdapterから継承されます。

GetFillParameters

DbDataAdapterから継承されます。

GetHashCode

Objectから継承されます。

GetLifetimeService

MarshalByRefObjectから継承されます。

GetType

Objectから継承されます。

InitializeLifetimeService

MarshalByRefObjectから継承されます。

ToString

Objectから継承されます。

Update

DbDataAdapterから継承されます。

関連項目:

Fill

Fillは、指定されたDataTableまたはDataSetにデータを移入するか、リフレッシュします。

オーバーロード一覧:

Fill(DataTable, OracleRefCursor)

このメソッドは、指定されたOracleRefCursorオブジェクトのデータに一致するよう指定されたDataTableで行を追加またはリフレッシュします。

宣言
// C#
public int Fill(DataTable dataTable, OracleRefCursor refCursor);
パラメータ
戻り値

DataTableで追加またはリフレッシュされた行数

例外

ArgumentNullException: dataTableまたはrefCursorパラメータがnullです。

InvalidOperationException: OracleRefCursorがデータをフェッチするためにすでに使用されています。

NotSupportedException: SafeMapping型がサポートされていません。

備考

MissingSchemaActionMissingSchemaAction.AddWithKeyに設定してFillメソッドがコールされている場合でも、スキーマまたはキー情報は提供されません。

関連項目:

Fill(DataSet, OracleRefCursor)

このメソッドは、指定されたOracleRefCursorオブジェクトのデータに一致するようDataSetで行を追加またはリフレッシュします。

宣言
// C#
public int Fill(DataSet dataSet, OracleRefCursor refCursor);
パラメータ
戻り値

DataSetで追加またはリフレッシュされた行数を返します。

例外

ArgumentNullException: dataSetまたはrefCursorパラメータがnullです。

InvalidOperationException: OracleRefCursorがデータをフェッチするためにすでに使用されています。

InvalidOperationException: OracleRefCursorがデータをフェッチできる状態です。

NotSupportedException: SafeMapping型がサポートされていません。

備考

リフレッシュするDataTableがない場合は、Tableという名前の新しいDataTableが作成され、指定されたOracleRefCursorオブジェクトを使用してデータが移入されます。

MissingSchemaActionMissingSchemaAction.AddWithKeyに設定してFillメソッドがコールされている場合でも、スキーマまたはキー情報は提供されません。

関連項目:

Fill(DataSet, string, OracleRefCursor)

このメソッドは、指定されたOracleRefCursorオブジェクトのデータに一致するようDataSetの指定されたソース表で行を追加またはリフレッシュします。

宣言
// C#
public int Fill(DataSet dataSet, string srcTable, OracleRefCursor refCursor);
パラメータ
戻り値

DataSetで追加またはリフレッシュされた行数を返します。

例外

ArgumentNullException: dataSetまたはrefCursorパラメータがnullです。

InvalidOperationException: OracleRefCursorがデータをフェッチするためにすでに使用されているか、またはソース表名が無効です。

NotSupportedException: SafeMapping型がサポートされていません。

備考

MissingSchemaActionMissingSchemaAction.AddWithKeyに設定してFillメソッドがコールされている場合でも、スキーマまたはキー情報は提供されません。

関連項目:

Fill(DataSet, int, int, string, OracleRefCursor)

このメソッドは、指定されたOracleRefCursorオブジェクトの行に一致するようDataSetの指定された範囲で行を追加またはリフレッシュします。

宣言
// C#
public int Fill(DataSet dataSet, int startRecord, int maxRecords,
  string srcTable, OracleRefCursor refCursor);
パラメータ
戻り値

このメソッドは、DataSetで追加またはリフレッシュされた行数を返します。これには、行を返さない文の影響を受ける行は含まれません。

例外

ArgumentNullException: dataSetまたはrefCursorパラメータがnullです。

InvalidOperationException: OracleRefCursorがデータをフェッチするためにすでに使用されているか、またはソース表名が無効です。

NotSupportedException: SafeMapping型がサポートされていません。

備考

MissingSchemaActionMissingSchemaAction.AddWithKeyに設定してFillメソッドがコールされている場合でも、スキーマまたはキー情報は提供されません。

関連項目:

OracleDataAdapterのイベント

OracleDataAdapterのイベントを表4-40に示します。

表4-40 OracleDataAdapterのイベント 
イベント名 説明

Disposed

Componentから継承されます。

FillError

DbDataAdapterから継承されます。

RowUpdated

このイベントは、Update()メソッドによって行が更新されたときに起動されます。

RowUpdating

このイベントは、行データがデータベースに更新されようとしているときに起動されます。

関連項目:

RowUpdated

このイベントは、Update()メソッドによって行が更新されたときに起動されます。

宣言
// C#
public event OracleRowUpdatedEventHandler RowUpdated;
イベント・データ

イベント・ハンドラは、イベントについての情報を含む次のプロパティを公開するOracleRowUpdatedEventArgsオブジェクトを受け取ります。

次の例は、RowUpdatingおよびRowUpdatedイベントの使用方法を示します。

// C#
// create the event handler for RowUpdating event

protected static void OnRowUpdating(object sender, OracleRowUpdatingEventArgs e)
{
  Console.WriteLine("Row updating.....");
  Console.WriteLine("Event arguments:");
  Console.WriteLine("Command Text: " + e.Command.CommandText);
  Console.WriteLine("Command Type: " + e.StatementType);
  Console.WriteLine("Status: " + e.Status);
}

// create the event handler for RowUpdated event
protected static void OnRowUpdated(object sender, OracleRowUpdatedEventArgs e)
{
  Console.WriteLine("Row updated.....");
  Console.WriteLine("Event arguments:");
  Console.WriteLine("Command Text: " + e.Command.CommandText);
  Console.WriteLine("Command Type: " + e.StatementType);
  Console.WriteLine("Status: " + e.Status);
}

public static void AdapterEvents(string connStr)
{
  string cmdStr = "SELECT EMPNO, EMPNAME, SALARY FROM EMPINFO";

  //create the adapter with the selectCommand txt and the
  //connection string
  OracleDataAdapter adapter = new OracleDataAdapter(cmdStr, connStr);

  //get the connection from the adapter
  OracleConnection connection = adapter.SelectCommand.Connection;

  //create the UpdateCommand object for updating the EMPINFO table
  //from the dataset
  adapter.UpdateCommand = new OracleCommand("UPDATE EMPINFO SET SALARY = "+
      " :iSALARY where EMPNO = :iEMPNO", connection);
  adapter.UpdateCommand.Parameters.Add(":iSALARY", OracleDbType.Double,
      0, "SALARY");
  adapter.UpdateCommand.Parameters.Add(":iEMPNO", OracleDbType.Int16,
      0, "EMPNO");

  //Create and fill the DataSet using the EMPINFO
  DataSet dataset = new DataSet();
  adapter.Fill(dataset, "EMPINFO");

  //Get the EMPINFO table from the dataset
  DataTable table = dataset.Tables["EMPINFO"];

  //Get the first row from the EMPINFO table
  DataRow row0 = table.Rows[0];

  //update the salary in the first row
  row0["SALARY"] = 99999.99;

  //set the event handlers for the RowUpdated and the RowUpdating event
  //the OnRowUpdating() method will be triggered before the update, and
  //the OnRowUpdated() method will be triggered after the update
  adapter.RowUpdating += new OracleRowUpdatingEventHandler(OnRowUpdating);
  adapter.RowUpdated += new OracleRowUpdatedEventHandler(OnRowUpdated);

  //Now update the EMPINFO using the adapter, the salary
  //of 'KING' is changed to 99999.99
  //The OnRowUpdating() and the OnRowUpdated() methods will be triggered
  adapter.Update(dataset, "EMPINFO");
}

関連項目:

RowUpdating

このイベントは、行データがデータベースに更新されようとしているときに起動されます。

宣言
// C#
public event OracleRowUpdatingEventHandler RowUpdating;
イベント・データ

イベント・ハンドラは、イベントについての情報を含む次のプロパティを公開するOracleRowUpdatingEventArgsオブジェクトを受け取ります。

RowUpdatedイベントの例で、RowUpdatingイベントの使用方法も示しています。RowUpdatedイベントの「例」を参照してください。

関連項目:

OracleDataAdapterのイベント・デリゲート

OracleDataAdapterのイベント・デリゲートを表4-41に示します。

表4-41 OracleDataAdapterのイベント・デリゲート  
イベント・デリゲート名 説明

EventHandler

Componentから継承されます。

FillErrorEventHandler

DbDataAdapterから継承されます。

OracleRowUpdatedEventHandler

RowUpdatedイベント用のイベント・デリゲート。

OracleRowUpdatingEventHandler

RowUpdatingイベント用のイベント・デリゲート。

関連項目:

OracleRowUpdatedEventHandler

このイベント・デリゲートは、RowUpdatedイベントを処理します。

関連項目:

OracleRowUpdatingEventHandler

このイベント・デリゲートは、RowUpdatingイベントを処理します。

関連項目:


Go to previous page Go to beginning of chapter Go to next page
Oracle
Copyright © 2002, 2003 Oracle Corporation.

All Rights Reserved.
Go To Table Of Contents
目次
Go To Index
索引