Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - プログラミング » SQL Anywhere データ・アクセス API » SQL Anywhere .NET データ・プロバイダ » データのアクセスと操作

 

プライマリ・キー値の取得

更新するテーブルにオートインクリメント・プライマリ・キーがある場合は、UUID を使用します。また、プライマリ・キーがプライマリ・キー・プールのものである場合は、ストアド・プロシージャを使用して、データ・ソースによって生成された値を取得できます。

SADataAdapter を使用する場合、この方法を使用して、データ・ソースによって生成されたプライマリ・キー値を DataSet のカラムに設定できます。SACommand オブジェクトに対してこの方法を使用する場合は、パラメータからキー・カラムを取得するか、DataReader を再度開くことができます。

次の例は、ID と Name という 2 つのカラムが含まれる adodotnet_primarykey と呼ばれるテーブルを使用します。テーブルのプライマリ・キーは ID です。これは INTEGER であり、オートインクリメント値が含まれます。Name カラムは CHAR(40) です。

これらの例は、次のストアド・プロシージャを呼び出してデータベースからオートインクリメント・プライマリ・キー値を取り出します。

CREATE PROCEDURE sp_adodotnet_primarykey( out p_id int, in p_name char(40) )
BEGIN
    INSERT INTO adodotnet_primarykey( name ) VALUES(
      p_name );
    SELECT @@IDENTITY INTO p_id;
END
♦  SACommand オブジェクトを使用してオートインクリメント・プライマリ・キーがある新しいローを挿入するには、次の手順に従います。
  1. データベースに接続します。

    SAConnection   conn = OpenConnection();
  2. 新しいローを DataTable に挿入する SACommand オブジェクトを作成します。次のコードでは、行 int id1 = ( int ) parmId.Value; でローのプライマリ・キー値を確認します。

    SACommand      cmd = conn.CreateCommand();
    cmd.CommandText = "sp_adodotnet_primarykey";
    cmd.CommandType = CommandType.StoredProcedure;
    SAParameter parmId = new SAParameter();
    parmId.SADbType = SADbType.Integer;
    parmId.Direction = ParameterDirection.Output;
    cmd.Parameters.Add( parmId );
    SAParameter parmName = new SAParameter();
    parmName.SADbType = SADbType.Char;
    parmName.Direction = ParameterDirection.Input;
    cmd.Parameters.Add( parmName );
    parmName.Value = "R & D --- Command";
    cmd.ExecuteNonQuery();
    int id1 = ( int ) parmId.Value;
    parmName.Value = "Marketing --- Command";
    cmd.ExecuteNonQuery();
    int id2 = ( int ) parmId.Value;
    parmName.Value = "Sales --- Command";
    cmd.ExecuteNonQuery();
    int id3 = ( int ) parmId.Value;
    parmName.Value = "Shipping --- Command";
    cmd.ExecuteNonQuery();
    int id4 = ( int ) parmId.Value;
  3. 結果を画面上のグリッドにバインドし、変更内容をデータベースに適用します。

    cmd.CommandText = "SELECT * FROM " +
        adodotnet_primarykey";
    cmd.CommandType = CommandType.Text;
    SADataReader dr = cmd.ExecuteReader();
    dataGrid.DataSource = dr;
  4. 接続を閉じます。

    conn.Close();
♦  SADataAdapter オブジェクトを使用してオートインクリメント・プライマリ・キーがある新しいローを挿入するには、次の手順に従います。
  1. 新しい SADataAdapter を作成します。

    DataSet         dataSet = new DataSet();
    SAConnection   conn = OpenConnection();
    SADataAdapter  adapter = new SADataAdapter();
    adapter.MissingMappingAction =
        MissingMappingAction.Passthrough;
    adapter.MissingSchemaAction =
        MissingSchemaAction.AddWithKey;
  2. DataSet のデータとスキーマを設定します。これを行うために、SADataAdapter.Fill メソッドによって SelectCommand が呼び出されます。また、既存のレコードが必要ない場合は、Fill メソッドと SelectCommand を使用しないで DataSet を手動でも作成できます。

    adapter.SelectCommand = new SACommand( "select * from  + adodotnet_primarykey", conn );
  3. データベースからプライマリ・キー値を取得する新しい SACommand オブジェクトを作成します。

    adapter.InsertCommand = new SACommand(
        "sp_adodotnet_primarykey", conn );
    adapter.InsertCommand.CommandType =
        CommandType.StoredProcedure;
    adapter.InsertCommand.UpdatedRowSource =
        UpdateRowSource.OutputParameters;
    SAParameter parmId = new SAParameter();
    parmId.SADbType = SADbType.Integer;
    parmId.Direction = ParameterDirection.Output;
    parmId.SourceColumn = "ID";
    parmId.SourceVersion = DataRowVersion.Current;
    adapter.InsertCommand.Parameters.Add( parmId );
    SAParameter parmName = new SAParameter();
    parmName.SADbType = SADbType.Char;
    parmName.Direction = ParameterDirection.Input;
    parmName.SourceColumn = "name";
    parmName.SourceVersion = DataRowVersion.Current;
    adapter.InsertCommand.Parameters.Add( parmName );
  4. DataSet を設定します。

    adapter.Fill( dataSet );
  5. DataSet に新しいローを挿入します。

    DataRow row = dataSet.Tables[0].NewRow();
    row[0] = -1;
    row[1] = "R & D --- Adapter";
    dataSet.Tables[0].Rows.Add( row );
    row = dataSet.Tables[0].NewRow();
    row[0] = -2;
    row[1] = "Marketing --- Adapter";
    dataSet.Tables[0].Rows.Add( row );
    row = dataSet.Tables[0].NewRow();
    row[0] = -3;
    row[1] = "Sales --- Adapter";
    dataSet.Tables[0].Rows.Add( row );
    row = dataSet.Tables[0].NewRow();
    row[0] = -4;
    row[1] = "Shipping --- Adapter";
    dataSet.Tables[0].Rows.Add( row );
  6. DataSet の変更内容をデータベースに適用します。Update メソッドが呼び出されると、プライマリ・キー値はデータベースから取得された値に変更されます。

    adapter.Update( dataSet );
    dataGrid.DataSource = dataSet.Tables[0];

    新しいローを DataTable に追加して Update メソッドを呼び出すと、SADataAdapter は InsertCommand を呼び出し、出力パラメータを新しい各ローのキー・カラムに対してマッピングします。Update メソッドが呼び出されるのは 1 回だけですが、InsertCommand は Update によって、追加される新しいローごとに必要な回数だけ呼び出されます。

  7. データベースとの接続を閉じます。

    conn.Close();