DataAdapter 参数

适用于 .NET Framework .NET .NET Standard

下载 ADO.NET

DbDataAdapter 具有四个用于从数据源检索数据和更新数据源中数据的属性:SelectCommand 属性返回数据源中的数据;InsertCommandUpdateCommandDeleteCommand 属性用于管理数据源中的更改。

注意

在调用 DataAdapterFill 方法之前,必须设置 SelectCommand 属性。 在调用 InsertCommandUpdateCommand 方法之前必须设置 DeleteCommandUpdateDataAdapter 属性,具体取决于对 DataTable 中的数据做了哪些更改。 例如,如果已添加行,在调用 InsertCommand 之前必须设置 Update。 当 Update 正在处理已插入、已更新或已删除的行时,DataAdapter 将使用相应的 Command 属性来处理该操作。 有关已修改行的当前信息将通过 Command 集合传递到 Parameters 对象。

更新数据源中的行时,调用 UPDATE 该语句,该语句使用唯一标识符标识要更新的表中的行。 该唯一标识符通常是主键字段的值。 该 UPDATE 语句使用包含唯一标识符和要更新的列和值的参数,如以下 Transact-SQL 语句所示。

UPDATE Customers SET CompanyName = @CompanyName
  WHERE CustomerID = @CustomerID  

注意

参数占位符的语法取决于数据源。 此示例显示 SQL Server 数据源的占位符。

在此示例中,CompanyName 字段使用 @CompanyName 等于 CustomerID 参数值的行中的 @CustomerID 参数值来进行更新。 这些参数使用 SourceColumn 对象的 SqlParameter 属性从已修改的行中检索相关信息。 下面是上一个示例 UPDATE 语句的参数。 代码假定变量 adapter 表示有效的 SqlDataAdapter 对象。

// Assumes that connection is a valid SqlAdapter object
adapter.UpdateCommand.Parameters.Add("@CompanyName", 
            SqlDbType.VarChar, 15, "CompanyName");
SqlParameter parameter = adapter.UpdateCommand.Parameters.Add("@CustomerID",
            SqlDbType.Char, 5, "CustomerID");
parameter.SourceVersion = DataRowVersion.Original;

Add 集合的 Parameters 方法接受参数的名称、数据类型、大小(如果适用于该类型)以及 SourceColumn 中的 DataTable 的名称。 请注意,SourceVersion 参数的 @CustomerID 设置为 Original。 这样可以确保:如果修改后的 DataRow 中标识列或多列标识列的值已更改,数据源中的现有行会被更新。 在这种情况下,Original 行值将匹配数据源中的当前值,而 Current 行值将包含更新的值。 参数 @CompanyNameSourceVersion 未设置,将使用默认的 Current 行值。

注意

对于 DataAdapterFill 操作以及 DataReaderGet 方法,.NET 类型是根据 Microsoft SqlClient Data Provider for SQL Server 返回的类型推断出来的。 推断的 .NET 类型和 Microsoft SQL Server 数据类型的访问器方法在 ADO.NET 中的数据类型映射中说明。

Parameter.SourceColumn, Parameter.SourceVersion

SourceColumnSourceVersion 可以作为自变量传递给 Parameter 构造函数,也可以设置为现有 Parameter 的属性。 SourceColumn 是来自 DataRowDataColumn 的名称,将从中检索 Parameter 的值。 SourceVersion 指定 DataRow 用于检索该值的 DataAdapter 版本。

下表显示可以与 DataRowVersion 一起使用的 SourceVersion 枚举值。

DataRowVersion 枚举 描述
Current 该参数使用列的当前值。 这是默认值。
Default 该参数使用该列的 DefaultValue
Original 该参数使用列的原始值。
Proposed 该参数使用建议值。

下一节中的 SqlClient 代码示例为 UpdateCommand 定义了一个参数,在该示例中 CustomerID 列用作以下两个参数的 SourceColumn@CustomerID (SET CustomerID = @CustomerID) 和 @OldCustomerID (WHERE CustomerID = @OldCustomerID)。 @CustomerID 参数用于将 CustomerID 列更新为 DataRow 中的当前值。 因此,使用了具有 CurrentSourceVersionCustomerIDSourceColumn@OldCustomerID 参数用于标识数据源中的当前行。 由于在该行的 Original 版本中找到了匹配的列值,因此会使用具有 SourceVersionOriginal 的相同 SourceColumnCustomerID)。

使用 SqlClient 参数

下面的示例演示如何创建 SqlDataAdapter 并将 MissingSchemaAction 设置为 AddWithKey,以便从数据库中检索其他架构信息。 SelectCommandInsertCommandUpdateCommandDeleteCommand 属性集及其相应的 SqlParameter 对象已添加到 Parameters 集合。 该方法返回一个 SqlDataAdapter 对象。

public static SqlDataAdapter CreateSqlDataAdapter(SqlConnection connection)
{
    // Assumes that connection is a valid SqlConnection object
    SqlDataAdapter adapter = new SqlDataAdapter();
    adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;

    // Create the commands.
    adapter.SelectCommand = new SqlCommand(
        "SELECT CustomerID, CompanyName FROM CUSTOMERS", connection);
    adapter.InsertCommand = new SqlCommand(
        "INSERT INTO Customers (CustomerID, CompanyName) " +
        "VALUES (@CustomerID, @CompanyName)", connection);
    adapter.UpdateCommand = new SqlCommand(
        "UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " +
        "WHERE CustomerID = @oldCustomerID", connection);
    adapter.DeleteCommand = new SqlCommand(
        "DELETE FROM Customers WHERE CustomerID = @CustomerID", connection);

    // Create the parameters.
    adapter.InsertCommand.Parameters.Add("@CustomerID",
        SqlDbType.Char, 5, "CustomerID");
    adapter.InsertCommand.Parameters.Add("@CompanyName",
        SqlDbType.VarChar, 40, "CompanyName");

    adapter.UpdateCommand.Parameters.Add("@CustomerID",
        SqlDbType.Char, 5, "CustomerID");
    adapter.UpdateCommand.Parameters.Add("@CompanyName",
        SqlDbType.VarChar, 40, "CompanyName");
    adapter.UpdateCommand.Parameters.Add("@oldCustomerID",
        SqlDbType.Char, 5, "CustomerID").SourceVersion =
        DataRowVersion.Original;

    adapter.DeleteCommand.Parameters.Add("@CustomerID",
        SqlDbType.Char, 5, "CustomerID").SourceVersion =
        DataRowVersion.Original;

    return adapter;
}

另请参阅