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 数据提供程序 » 访问和操作数据 » 使用 SADataAdapter 对象访问和操作数据

 

使用 SADataAdapter 对象插入、更新和删除行

SADataAdapter 会将结果集检索到一个 DataSet 中。DataSet 是表以及这些表之间的关系和约束的集合。DataSet 内置在 .NET Framework 中,与用于连接数据库的数据提供程序无关。

使用 SADataAdapter 时,必须连接到数据库以填充 DataSet 并使用对 DataSet 的更改更新数据库。不过,填充 DataSet 后,可以在 DataSet 与数据库断开的情况下对其进行修改。

如果不希望立即将更改应用到数据库,可以使用 WriteXML 方法将 DataSet(包括数据和/或模式)写入 XML 文件。这样,以后就可以通过使用 ReadXML 方法装载 DataSet 来应用更改。

有关详细信息,请参见 .NET Framework 文档中 WriteXML 和 ReadXML 的部分。

调用 Update 方法将 DataSet 的更改应用于数据库时,SADataAdapter 会对已经做出的更改进行分析,然后根据需要调用相应的 INSERT、UPDATE 或 DELETE 语句。使用 DataSet 时,只能对一个表中的数据进行更改(插入、更新或删除)。不能更新基于连接的数据集。如果其他用户锁定了您试图更新的行,则将抛出异常。

小心

对 DataSet 所做的所有更改都是在断开连接的情况下完成的。这意味着应用程序未锁定数据库中的这些行。如果在您的更改应用到数据库之前其他用户更改了您正修改的数据,则在将 DataSet 的更改应用到数据库时,会出现一些冲突。您的应用程序必须设计为能够解决这样的冲突。

解决使用 SADataAdapter 时的冲突

使用 SADataAdapter 时,不会锁定数据库的行。这意味着将来自 DataSet 的更改应用到数据库时可能会引起冲突。应用程序中应包含解决或记录产生的冲突的逻辑。

应用程序逻辑应解决的一些冲突如下:

  • 唯一主键   如果两个用户向一个表中插入新行,则每个行都必须有一个唯一的主键。对于包含自动增量主键的表,DataSet 中的值可能与数据源中的值不同步。

    有关获取自动增量主键的主键值的信息,请参见获取主键值

  • 对同一值的更新   如果两个用户修改同一值,则应用程序应包含用于决定哪个值正确的逻辑。

  • 模式更改   如果某个用户修改已在 DataSet 中更新的表的模式,则在将更改应用于数据库时,更新会失败。

  • 数据并发   并发应用程序应看到一致的数据集。SADataAdapter 不会锁定其读取的行,因此在您检索了 DataSet 并且脱机工作时,其他用户可以更新数据库中的值。

许多这样的潜在问题都可通过使用 SACommand、SADataReader 和 SATransaction 对象将更改应用到数据库来避免。建议使用 SATransaction 对象,因为它允许您设置事务的隔离级别,并将行锁定,这样其他用户便无法修改这些行。

有关使用事务将更改应用于数据库的详细信息,请参见使用 SACommand 对象插入、更新和删除行

若要简化冲突解决过程,可以自行设计 INSERT、UPDATE 或 DELETE 语句作为存储过程调用。通过在存储过程中包含 INSERT、UPDATE 和 DELETE 语句,可以捕获操作失败时的错误。除了语句外,还可以在存储过程中添加错误处理逻辑,以便在操作失败时采取适当行动,例如将错误记录到日志文件,或再次尝试操作。

♦  使用 SADataAdapter 在表中插入行
  1. 声明并初始化一个 SAConnection 对象。

    SAConnection   conn = new SAConnection(
        c_connStr );
  2. 打开该连接。

    conn.Open();
  3. 创建一个新的 SADataAdapter 对象。

    SADataAdapter adapter = new SADataAdapter();
    adapter.MissingMappingAction =
        MissingMappingAction.Passthrough;
    adapter.MissingSchemaAction =
        MissingSchemaAction.Add;
  4. 创建必需的 SACommand 对象并定义所有必需的参数。

    以下代码创建一条 SELECT 和一条 INSERT 语句,并定义 INSERT 语句的参数。

    adapter.SelectCommand = new SACommand(
        "SELECT * FROM Departments", conn );
    adapter.InsertCommand = new SACommand(
        "INSERT INTO Departments( DepartmentID, DepartmentName )
        VALUES( ?, ? )", conn );
    adapter.InsertCommand.UpdatedRowSource =
        UpdateRowSource.None;
    SAParameter parm = new SAParameter();
    parm.SADbType = SADbType.Integer;
    parm.SourceColumn = "DepartmentID";
    parm.SourceVersion = DataRowVersion.Current;
    adapter.InsertCommand.Parameters.Add(
        parm );
    parm = new SAParameter();
    parm.SADbType = SADbType.Char;
    parm.SourceColumn = "DepartmentName";
    parm.SourceVersion = DataRowVersion.Current;
    adapter.InsertCommand.Parameters.Add( parm );
  5. 用 SELECT 语句的结果填充 DataTable。

    DataTable dataTable = new DataTable( "Departments" );
    int rowCount = adapter.Fill( dataTable );
  6. 将新行插入到 DataTable 并将更改应用于数据库。

    DataRow row1 = dataTable.NewRow();
    row1[0] = 600;
    row1[1] = "Eastern Sales";
    dataTable.Rows.Add( row1 );
    DataRow row2 = dataTable.NewRow();
    row2[0] = 700;
    row2[1] = "Western Sales";
    dataTable.Rows.Add( row2 );
    recordsAffected = adapter.Update( dataTable );
  7. 显示更新的结果。

    dataTable.Clear();
    rowCount = adapter.Fill( dataTable );
    dataGrid.DataSource = dataTable;
  8. 关闭该连接。

    conn.Close();
♦  使用 SADataAdapter 对象更新行
  1. 声明并初始化一个 SAConnection 对象。

    SAConnection conn = new SAConnection( c_connStr );
  2. 打开该连接。

    conn.Open();
  3. 创建一个新的 SADataAdapter 对象。

    SADataAdapter adapter = new SADataAdapter();
    adapter.MissingMappingAction =
        MissingMappingAction.Passthrough;
    adapter.MissingSchemaAction =
        MissingSchemaAction.Add;
  4. 创建 SACommand 对象并定义其参数。

    以下代码创建一条 SELECT 和一条 UPDATE 语句,并定义 UPDATE 语句的参数。

    adapter.SelectCommand = new SACommand(
        "SELECT * FROM Departments WHERE DepartmentID > 500",
        conn );
    adapter.UpdateCommand = new SACommand(
        "UPDATE Departments SET DepartmentName = ?
        WHERE DepartmentID = ?", conn );
    adapter.UpdateCommand.UpdatedRowSource =
        UpdateRowSource.None;
    SAParameter parm = new SAParameter();
    parm.SADbType = SADbType.Char;
    parm.SourceColumn = "DepartmentName";
    parm.SourceVersion = DataRowVersion.Current;
    adapter.UpdateCommand.Parameters.Add( parm );
    parm = new SAParameter();
    parm.SADbType = SADbType.Integer;
    parm.SourceColumn = "DepartmentID";
    parm.SourceVersion = DataRowVersion.Original;
    adapter.UpdateCommand.Parameters.Add( parm );
  5. 用 SELECT 语句的结果填充 DataTable。

    DataTable dataTable = new DataTable( "Departments" );
    int rowCount = adapter.Fill( dataTable );
  6. 使用行的更新值更新 DataTable,并将更改应用到数据库。

    foreach ( DataRow row in dataTable.Rows )
    {
    row[1] = ( string ) row[1] + "_Updated";
    }
    recordsAffected = adapter.Update( dataTable );
  7. 将结果绑定到屏幕上的网格。

    dataTable.Clear();
    adapter.SelectCommand.CommandText =
        "SELECT * FROM Departments";
    rowCount = adapter.Fill( dataTable );
    dataGrid.DataSource = dataTable;
  8. 关闭该连接。

    conn.Close();
♦  使用 SADataAdapter 对象删除表中的行
  1. 声明并初始化一个 SAConnection 对象。

    SAConnection conn = new SAConnection( c_connStr );
  2. 打开该连接。

    conn.Open();
  3. 创建 SADataAdapter 对象。

    SADataAdapter adapter = new SADataAdapter();
    adapter.MissingMappingAction =
        MissingMappingAction.Passthrough;
    adapter.MissingSchemaAction =
        MissingSchemaAction.AddWithKey;
  4. 创建必需的 SACommand 对象并定义所有必需的参数。

    以下代码创建一条 SELECT 和一条 DELETE 语句,并定义 DELETE 语句的参数。

    adapter.SelectCommand = new SACommand(
        "SELECT * FROM Departments WHERE DepartmentID > 500",
        conn );
    adapter.DeleteCommand = new SACommand(
        "DELETE FROM Departments WHERE DepartmentID = ?",
        conn );
    adapter.DeleteCommand.UpdatedRowSource =
        UpdateRowSource.None;
    SAParameter parm = new SAParameter();
    parm.SADbType = SADbType.Integer;
    parm.SourceColumn = "DepartmentID";
    parm.SourceVersion = DataRowVersion.Original;
    adapter.DeleteCommand.Parameters.Add( parm );
  5. 用 SELECT 语句的结果填充 DataTable。

    DataTable dataTable = new DataTable( "Departments" );
    int rowCount = adapter.Fill( dataTable );
  6. 修改 DataTable 并将更改应用到数据库。

    for each ( DataRow in dataTable.Rows )
    {
        row.Delete();
    }
    recordsAffected = adapter.Update( dataTable )
  7. 将结果绑定到屏幕上的网格。

    dataTable.Clear();
    rowCount = adapter.Fill( dataTable );
    dataGrid.DataSource = dataTable;
  8. 关闭该连接。

    conn.Close();