If the table you are updating has an autoincremented primary key, uses UUIDs, or if the primary key comes from a primary key pool, you can use a stored procedure to obtain the primary key values generated by the data source.
The following example shows how to obtain the primary key that is generated for a newly inserted row. The example uses an SADataAdapter object to call a SQL stored procedure and an SAParameter object to retrieve the primary key that it returns. For demonstration purposes, the example creates a sample table (adodotnet_primarykey) and the stored procedure (sp_adodotnet_primarykey) that will be used to insert rows and return primary key values.
SAConnection conn = new SAConnection( "Data Source=Sybase IQ Demo" ); conn.Open(); SACommand cmd = conn.CreateCommand(); cmd.CommandText = "DROP TABLE adodotnet_primarykey"; cmd.ExecuteNonQuery(); cmd.CommandText = "CREATE TABLE IF NOT EXISTS adodotnet_primarykey (" + "ID INTEGER DEFAULT AUTOINCREMENT, " + "Name CHAR(40) )"; cmd.ExecuteNonQuery(); cmd.CommandText = "CREATE or REPLACE 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"; cmd.ExecuteNonQuery(); SADataAdapter da = new SADataAdapter(); da.MissingMappingAction = MissingMappingAction.Passthrough; da.MissingSchemaAction = MissingSchemaAction.AddWithKey; da.SelectCommand = new SACommand( "SELECT * FROM adodotnet_primarykey", conn); da.InsertCommand = new SACommand( "sp_adodotnet_primarykey", conn); da.InsertCommand.CommandType = CommandType.StoredProcedure; da.InsertCommand.UpdatedRowSource = UpdateRowSource.OutputParameters; SAParameter parmId = new SAParameter(); parmId.SADbType = SADbType.Integer; parmId.Direction = ParameterDirection.Output; parmId.SourceColumn = "ID"; parmId.SourceVersion = DataRowVersion.Current; da.InsertCommand.Parameters.Add(parmId); SAParameter parmName = new SAParameter(); parmName.SADbType = SADbType.Char; parmName.Direction = ParameterDirection.Input; parmName.SourceColumn = "Name"; parmName.SourceVersion = DataRowVersion.Current; da.InsertCommand.Parameters.Add(parmName); DataTable dataTable = new DataTable("Departments"); da.FillSchema(dataTable, SchemaType.Source); DataRow row = dataTable.NewRow(); row[0] = -1; row[1] = "R & D --- Adapter"; dataTable.Rows.Add(row); row = dataTable.NewRow(); row[0] = -2; row[1] = "Marketing --- Adapter"; dataTable.Rows.Add(row); row = dataTable.NewRow(); row[0] = -3; row[1] = "Sales --- Adapter"; dataTable.Rows.Add(row); row = dataTable.NewRow(); row[0] = -4; row[1] = "Shipping --- Adapter"; dataTable.Rows.Add(row); DataSet ds = new DataSet(); ds.Merge(dataTable); da.Update(ds, "Departments"); conn.Close(); dataGridView1.DataSource = ds.Tables["Departments"];