更新するテーブルにオートインクリメント・プライマリ・キーがある場合は、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 |
データベースに接続します。
SAConnection conn = OpenConnection(); |
新しいローを 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; |
結果を画面上のグリッドにバインドし、変更内容をデータベースに適用します。
cmd.CommandText = "SELECT * FROM " + adodotnet_primarykey"; cmd.CommandType = CommandType.Text; SADataReader dr = cmd.ExecuteReader(); dataGrid.DataSource = dr; |
接続を閉じます。
conn.Close(); |
新しい SADataAdapter を作成します。
DataSet dataSet = new DataSet(); SAConnection conn = OpenConnection(); SADataAdapter adapter = new SADataAdapter(); adapter.MissingMappingAction = MissingMappingAction.Passthrough; adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; |
DataSet のデータとスキーマを設定します。これを行うために、SADataAdapter.Fill メソッドによって SelectCommand が呼び出されます。また、既存のレコードが必要ない場合は、Fill メソッドと SelectCommand を使用しないで DataSet を手動でも作成できます。
adapter.SelectCommand = new SACommand( "select * from + adodotnet_primarykey", conn ); |
データベースからプライマリ・キー値を取得する新しい 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 ); |
DataSet を設定します。
adapter.Fill( dataSet ); |
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 ); |
DataSet の変更内容をデータベースに適用します。Update メソッドが呼び出されると、プライマリ・キー値はデータベースから取得された値に変更されます。
adapter.Update( dataSet ); dataGrid.DataSource = dataSet.Tables[0]; |
新しいローを DataTable に追加して Update メソッドを呼び出すと、SADataAdapter は InsertCommand を呼び出し、出力パラメータを新しい各ローのキー・カラムに対してマッピングします。Update メソッドが呼び出されるのは 1 回だけですが、InsertCommand は Update によって、追加される新しいローごとに必要な回数だけ呼び出されます。
データベースとの接続を閉じます。
conn.Close(); |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |