SqlDataAdapter类型的更新方法,是通过DeleteCommand()、InsertCommand()和UpdateCommand()这3个成员来实现的。程序员需要手动构造这3个SqlCommand类型对象,才能顺利地执行更新。
SqlCommandBuilder类型可以根据SelectCommand,来自动生成更新命令。SqlCommandBuilder会将自身注册为RowUpdating事件的侦听器。为了生成Insert、Update和delete语句,SqlCommandBuilder会自动使用SelectCommand属性来检索所需的元数据集。如果在修改元数据后更改SelectCommand,则应调用RefreshSchema()方法来更新元数据。
比如,在一个商品选择界面,选择好商品,并且进行编辑,删除、更新后,最后一并交给数据库,而不是每一步都访问数据库,因为客户选择商品可能进行多次的编辑、删除。在需求中要求一定用缓存实现,确认提交订单之前的操作并不提交到数据库。
解决方法:用SqlCommandBuilder()实现批量更新,首先实现对DataSet在UI层做任何操作后,然后用SqlCommandBuilder()这个方法自动把DataSet修改的数据更新到数据库中,并不是每次修改DataSet都更新到数据库。代码如下:
public int UpdateData(DataSet ds, string strTblName, string strConn)
{
try
{
//创建一个数据库连接
SqlConnection conn = new SqlConnection(strConn);
//创建一个用于填充DataSet的对象
SqlCommand myCommand = new SqlCommand("SELECT * FROM " + strTblName, conn);
SqlDataAdapter myAdapter = new SqlDataAdapter();
//获取SQL语句,用于在数据库中选择记录
myAdapter.SelectCommand = myCommand;
//自动生成单表命令,用于将对DataSet所做的更改与数据库更改相对应
SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);
myAdapter.Update(ds, strTblName); //更新ds数据
return 0;
}
catch (Exception err)
{
throw err;
}
}
注意:只能更新一个表,不能更新两个或两个以上相关联的表。表中必须有主键。更新的表中字段不能有Image类型。查询列中不能包含Timestamp列。
使用SqlCommandBuilder可以节省代码量和编写时间,这个方法可以替代所有的SQL语句中的更新、删除、插入操作,更重要的是它在一个短周期内向服务器产生多个批量更新时程序和数据库的性能。