DbDataAdapter.Update 方法 (DataTable) 为指定 DataTable 中每个已插入
、已更新或已删除的行调用相应的 INSERT、UPDATE 或 DELETE 语句。
当应用程序调用 Update 方法时,DbDataAdapter 根据 DataSet 中配置的索
引顺序为每一行检查 RowState 属性,并迭代执行所需的 INSERT、UPDATE 或
DELETE 语句。例如,由于 DataTable 中行的排序,Update 可能先执行一个
DELETE 语句,接着执行一个 INSERT 语句,然后再执行另一个 DELETE 语句
。 下面看一个例子:
void Query()
{
da = new SqlDataAdapter("select * from users", "data
source=.;Initial catalog=coment_db;Integrated Security=true");
dt=new DataTable();
da.Fill(dt);
SqlCommandBuilder scb=new SqlCommandBuilder(da);
dataGridView1.DataSource = dt;
}
然后我们通过以下代码区调用:
da.Update(dt);
Query();
应注意,这些语句不是作为批处理进程执行的;每一行都是单独更新的。在必
须控制语句类型顺序的情况下(例如,INSERT 在 UPDATE 之前),应用程序
可以调用 GetChanges 方法。有关更多信息,请参见使用 DataAdapter 更新
数据源 (ADO.NET)。
如果未指定 INSERT、UPDATE 或 DELETE 语句,Update 方法会生成异常。但
是,如果设置 .NET Framework 数据提供程序的 SelectCommand 属性,则可
以创建 SqlCommandBuilder 或 OleDbCommandBuilder 对象来为单个表更新自
动生成 SQL 语句。然后,CommandBuilder 将生成任何其他未设置的 SQL 语
句。
SqlDataAdapter 不会自动生成实现 DataSet 的更改与关联的 SQL Server 实
例之间的协调所需的 Transact-SQL 语句。但是,如果设置了
SqlDataAdapter 的 SelectCommand 属性,则可以创建一个
SqlCommandBuilder 对象来自动生成用于单表更新的 Transact-SQL 语句。然
后,SqlCommandBuilder 将生成其他任何未设置的 Transact-SQL 语句。
每当设置了 DataAdapter 属性,SqlCommandBuilder 就将其本身注册为
RowUpdating 事件的侦听器。一次只能将一个 SqlDataAdapter 与一个
SqlCommandBuilder 对象(或相反)互相关联。
为了生成 INSERT、UPDATE 或 DELETE 语句,SqlCommandBuilder 会自动使用
SelectCommand 属性来检索所需的元数据集。如果在检索到元数据后(例如在
第一次更新后)更改 SelectCommand,则应调用 RefreshSchema 方法来更新
元数据。
SelectCommand 还必须至少返回一个主键列或唯一的列。如果什么都没有返回
,就会产生 InvalidOperation 异常,不生成命令。