如果正在更新的表包含自动增量主键,请使用 UUID;或者,如果主键来自主键池,则可以使用存储过程获取该数据源生成的值。
使用 SADataAdapter 时,可通过此技术使用由数据源生成的主键值填充 DataSet 中的列。如果希望对 SACommand 对象使用此技术,则可以从参数获得主键列,也可以重新打开 DataReader。
下面的示例使用名为 adodotnet_primarykey 的表,该表包含两列:ID 和 Name。该表的主键是 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(); |
创建一个新的 SACommand 对象以将新行插入 DataTable。在下面的代码中,行 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 方法仅调用一次,但只要添加新行,Update 方法就会调用 InsertCommand。
关闭与数据库的连接。
conn.Close(); |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |