/*把更改写回数据库DataAdapter.Update*/

本文介绍如何使用SqlDataAdapter和SqlCommandBuilder组件来填充DataTable,并演示如何将数据更改同步回数据库。包括插入新记录、更新数据库以及利用GetChanges方法按特定顺序执行删除和插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

ContractedBlock.gifExpandedBlockStart.gif把更改写回数据库DataAdapter.Update
ExpandedBlockStart.gifContractedBlock.gif /**//*把更改写回数据库DataAdapter.Update*/
ExpandedBlockStart.gifContractedBlock.gif            
/**//*Important: 这种在DataTable中进行的插入、更新和删除并不会自动写回数据库 
ExpandedBlockEnd.gif             
*/

None.gif            SqlDataAdapter adapter 
= new SqlDataAdapter(strSql, strConn);
None.gif            SqlCommandBuilder builder 
= new SqlCommandBuilder(adapter);
None.gif            DataSet ds 
= new DataSet();
None.gif            adapter.Fill(ds, 
"Titles");
None.gif            
None.gif            
//插入记录
None.gif
            DataTable table = ds.Tables["Titles"];
None.gif            DataRow row 
= table.NewRow();
None.gif            row[
"Title_id"= "JP1001";
None.gif            row[
"title"= "programming Microsoft .NET";
None.gif            row[
"price"= 59.99m;
None.gif            row[
"ytd_sales"= 100000;
None.gif            row[
"type"= "business";
None.gif            row[
"pubdate"= new DateTime(200251);
None.gif            table.Rows.Add(row);
None.gif            
//更新数据库
None.gif
            adapter.Update(table);
None.gif            
ExpandedBlockStart.gifContractedBlock.gif            
/**//*DataAdapter的Update方法检查传递给表的每一条记录,把自从上次更新
InBlock.gif             * (或自从上次调用table的AcceptChanges方法后)被插入、更新或删除的行
InBlock.gif             * 写回数据库。如果DataSet中包含了多个被修改的DataTable,就把整个DataSet
InBlock.gif             * 传给Update方法: adapter.Update(ds),所有改变会被一次性写回。
ExpandedBlockEnd.gif             
*/

ExpandedBlockStart.gifContractedBlock.gif            
/**//*
InBlock.gif             * 哦,还有许多演示DataAdapter.Update的用法的示例,演示了通过调用名为GetChanges
InBlock.gif             * 的方法创建一个只含有被插入、更新或删除行的新的临时DataSet或者DataTable
InBlock.gif             * ,然后把delta传递给DataAdapter.Update,如下:
InBlock.gif             * //更新数据库
InBlock.gif             * DataTable delta = table.GetChanges();
InBlock.gif             * adapter.Update(delta);
InBlock.gif             * 这种方法的确好用,但不是必需的。Update会忽略包含已修改和未修改的行的DataTable中
InBlock.gif             * 未被修改的行。
InBlock.gif             * 当要控制写回数据库中的更改的内容的顺序时,GetChanges方法发挥作用,
InBlock.gif             * 如果想在Insert前面执行Delete,以避免主键重复错误,应该这样做: 
ExpandedBlockEnd.gif             
*/

None.gif            
//DataRowState ---->enum System.Data.DataRowState
None.gif            
//DataRowState.Deleted---->the row was deleted 
None.gif            
//                        using the row.Delete()
None.gif
            DataTable deletes = table.GetChanges(DataRowState.Deleted);
None.gif            adapter.Update(deletes);
None.gif            DataTable inserts 
= table.GetChanges(DataRowState.Added);
None.gif            adapter.Update(inserts);
ExpandedBlockStart.gifContractedBlock.gif            
/**//*GetChanges的另一个用处是,
InBlock.gif             * 当更新不是在本地执行时,把机器间的数据传输量减到最小,
InBlock.gif             * 只传递被改变的DataSet或DataTable比传递整个DataSet或DataTable更高效              
ExpandedBlockEnd.gif             
*/

转载于:https://www.cnblogs.com/simhare/archive/2007/07/21/826466.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值