[ADO.Net] 将变化保存到数据源

首先,明确一点,这里这里所说的将变化保存到数据源,是指数据适配器如何用数据集中的数据更新和同步数据源。

方案一:使用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属性必须有一个包含主键列的查询。

 

你可能感兴趣的:(.net)