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。

示例

下面的示例使用名为 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
♦  使用 SACommand 对象插入一个包含自动增量主键的新行
  1. 连接到数据库。

    SAConnection   conn = OpenConnection();
  2. 创建一个新的 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;
  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 方法仅调用一次,但只要添加新行,Update 方法就会调用 InsertCommand。

  7. 关闭与数据库的连接。

    conn.Close();