首先,明确一点,这里这里所说的将变化保存到数据源,是指数据适配器如何用数据集中的数据更新和同步数据源。
方案一:使用UpdateCommand属性
数据适配器的UpdateCommand属性所包含的命令在调用数据适配器的Update方法时,用于更新数据源。
string upd = @"
update employees
set
city = @city
where
employeeid = @employeeid
";
SqlCommand cmb = new SqlCommand(upd,conn);
cmb.Parameters.Add("@city",SqlDbType.NVarChar,15,"city");
da.UpdateCommand = cmb;
da.Update(ds,"employees");
(da 是数据适配器,dt 是数据表,ds是数据集,conn是连接)
方案二 使用InsertCommand属性
使用InserCommand属性在表中插入行,调用Update时,将搜索以前添加的所有新行,并保存到数据库中。
string ins = @"
insert into employees
(
firstname,
lastname
)
values
(
@firstname,
@lastname
)
";
SqlCommand cmb = new SqlCommand(ins,conn);
cmb.Parameters.Add("@firstname",SqlDbType.NVarChar,10,"firstname");
cmb.Parameters.Add("@lastname",SqlDbType.NVarChar,20,"lastname");
da.InsertCommand = cmb;
da.Update(ds,"employees");
该方法时将所有的插入操作都提交给了数据库。
方案三 使用DeleteCommand属性
该属性可用于执行SQL DELETE语句
string del = @"
delete from employees
where
employeeid = @employeeid
";
SqlCommand cmb = new SqlCommand(del,conn);
cmb.Parameters.Add("@employeeid ",SqlDbType.Int,4,"employeeid ");
da.DeleteCommand = cmb;
da.Update(ds,"employees");
无论是删除一行还是多行,SQL都是参数化的,所有的适配器会在employees数据表中查找所有已删除的行,并把对它们的所有删除操作都提交给employees数据库表。
解决四 命令构建器
上述三个属性编写SQL语句实现功能虽然简单,但会存在一些问题,所有每个数据提供程序都有自己的命令构建器(CommandBuilder)。命令构建器为数据适配器自动生成相应的UpdateCommand属性,InsertCommand属性,DeleteCommand属性。
SqlDataAdapter da = new SqlDataAdapter();
SqlCommandBuilder cb = new SqlCommandBuilder(da);
为了使命令构建器能够工作,数据适配器的SelectCommand属性必须包含一个查询,它返回数据库表的主键或唯一键。如果该键不存在,就会生成InvalidOperation异常。
虽然命令构建器比手工编写SQL要好,但是它只能处理一个表,底层的数据库表必须有主键或唯一键,另外数据适配器的SelectCommand属性必须有一个包含主键列的查询。