适用于: .NET Framework
.NET
.NET Standard
DbDataAdapter 具有四个用于从数据源检索数据和更新数据源中数据的属性:SelectCommand 属性返回数据源中的数据;InsertCommand、UpdateCommand 和 DeleteCommand 属性用于管理数据源中的更改。
注意
调用 SelectCommand 的 Fill 方法之前必须设置 DataAdapter 属性。 在调用 InsertCommand 的 UpdateCommand 方法之前必须设置 DeleteCommand、Update 或 DataAdapter 属性,具体取决于对 DataTable 中的数据做了哪些更改。 例如,如果已添加行,在调用 InsertCommand 之前必须设置 Update。 当 Update 正在处理已插入、已更新或已删除的行时,DataAdapter 将使用相应的 Command 属性来处理该操作。 有关已修改行的当前信息将通过 Command 集合传递到 Parameters 对象。
更新数据源中的行时,调用 UPDATE 语句,该语句使用唯一标识符来标识表中要更新的行。 该唯一标识符通常是主键字段的值。 UPDATE 语句使用的参数既包含唯一标识符又包含要更新的列和值,如下面的 Transact-SQL 语句所示。
UPDATE Customers SET CompanyName = @CompanyName
WHERE CustomerID = @CustomerID
备注
参数占位符的语法取决于数据源。 此示例显示 SQL Server 数据源的占位符。
在此示例中,CompanyName 字段使用 CustomerID 等于 @CustomerID 参数值的行中的 @CompanyName 参数值来进行更新。 这些参数使用 SqlParameter 对象的 SourceColumn 属性从已修改的行中检索相关信息。 下面是上一示例 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 行值将包含更新的值。 没有设置 SourceVersion 参数的 @CompanyName,而将使用默认的 Current 行值。
备注
对于 DataAdapter 的 Fill 操作和 DataReader 的 Get 方法,将从 Microsoft SqlClient Data Provider for SQL Server 中返回的类型来推断 .NET 类型。 推断的 .NET 类型和 Microsoft SQL Server 数据类型的访问器方法在 ADO.NET 中的数据类型映射中说明。
Parameter.SourceColumn,Parameter.SourceVersion
SourceColumn 和 SourceVersion 可以作为自变量传递给 Parameter 构造函数,也可以设置为现有 Parameter 的属性。 SourceColumn 是将要从中检索 DataColumn 值的 DataRow 中的 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 中的当前值。 因此,使用 SourceVersion 为 Current 的 CustomerID SourceColumn。 @OldCustomerID 参数用于标识数据源中的当前行。 由于在该行的 Original 版本中找到了匹配列值,所以将使用 SourceColumn 为 CustomerID 的相同 SourceVersion (Original)。
使用 SqlClient 参数
下面的示例演示如何创建 SqlDataAdapter 并将 MissingSchemaAction 设置为 AddWithKey,以便从数据库中检索其他架构信息。 SelectCommand、InsertCommand、UpdateCommand 和 DeleteCommand 属性集及其相应的 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;
}