该主题说明了如何使用 DataSet 在数据库中更新数据。你依然可以直接使用 SqlCommand 在数据库中插入、更新、和删除数据,记住这一点也很重要。理解“从数据库填充DataSet”涵盖的概念有助于你理解这个主题。
 
 
前一篇“从数据库填充 DataSet”涵盖的部分主题包括从数据库检索数据和填充到 DataSet,以及 DataSet 怎样有别于数据库。一旦 DataSet 被加载,你可以修改数据,并且DataSet 会跟踪变化。
 
 
DataSet 可以被认为是从数据库检索出的在内存中的缓存数据。DataSet 包含一组表、关系、和约束。示例1中演示如何使用 Add 方法在 DataTable 添加新数据到 DataSet。Add 方法要么接受预期数据列的数组,要么接受 DataRow 作为参数。
 
 
示例1:
 
            SqlConnection myConnection = new SqlConnection("server=(local);Integrated Security=SSPI;database=northwind");
SqlDataAdapter myDataAdapter = new SqlDataAdapter("SELECT * FROM Customers", myConnection); DataSet myDataSet = new DataSet();
DataRow myDataRow; // 创建命令构建器,会自动创建更新命令,不必手动提供或创建。
SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myDataAdapter); // 为 MissingSchemaAction 属性设置 AddWithKey,除非指定 AddWithKey,Fill 将不会检索到主键 & 唯一键信息。
myDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
myDataAdapter.Fill(myDataSet, "Customers"); myDataRow = myDataSet.Tables["Customers"].NewRow();
myDataRow["CustomerId"] = "NewID";
myDataRow["ContactName"] = "New Name";
myDataRow["CompanyName"] = "New Company Name";
myDataSet.Tables["Customers"].Rows.Add(myDataRow); myDataAdapter.Update(myDataSet, "Customers");
 
请记住,DataTable 必须通过 NewRow 方法返回 DataRow。NewRow 方法返回了与 DataTable 匹配架构的 DataRow 对象。直到新的 DataRow 被添加到 RowsCollection集合之前,它一直独立于这个表。
 
 
可以通过 DataRow 改动数据。可以通过 Rows 属性的 RowsCollection 集合使用行索引,如示例2:
 
 
示例2:
 
    myDataSet.Tables["Customers"].Rows[]["ContactName"]="Peach";
 
你也可以通过主键值访问一个特定行,如示例3:
 
 
示例3:
 
    DataRow myDataRow1 = myDataSet.Tables["Customers"].Rows.Find("ALFKI");
myDataRow1["ContactName"]="Peach";
 
示例3中的 “ALFKI” 是 “Customers” 表中的主键 “CustomerID” 的值。当使用 SqlDataAdapter 时,主键是从库中建立的。即使没有使用库,你也可以通过 PrimaryKey 属性设置主键值。
 
 
使用 Delete 方法移除行。请记住,发生在 DataSet 上的逻辑删除,只有在 DataSet 被更新到数据库时候才会被物理删除(示例4)。同样地,在行被保存的情况下,你可以使用 DataSet 的 RejectChanges 放弃更改。
 
 
示例4:
 
    myDataSet.Tables["Customers"].Rows[].Delete();
 
行里维护着原始值和新值。原始值和新值皆可以允许被 RowChanging 事件访问,以便决定是否继续编辑。因为我们维护着原始值和新值,所以我们可以建立如乐观锁定和键值改变的场景。
 
 
在提交更改回数据库之前,你需要设置 InsertCommand、UpdateCommand、和 DeleteCommand 命令使数据库的变动和 DataSet 一致。对于受限的场景,你可以使用 SqlCommandBuilder 构建器自动生成那些命令对象,如示例5:
 
 
示例5:
 
    SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(mySqlDataAdapter);
 
从 DataSet 提交数据到数据库,使用 SqlDataAdapter 的 Update 方法,如示例6:
 
 
示例6:
 
    mySqlDataAdapter.Update(myDataSet, "Customers");

ADO.NET 快速入门(五):从 DataSet 更新数据库的更多相关文章

  1. ADO.NET 快速入门(四):从数据库填充 DataSet

    从数据库获取数据很容易,处理数据更容易.如果想要从数据库获取只进.只读的数据流结果集,你可以使用 DataReader 执行命令并且检索它.关于如何使用 DataReader,请参考:使用 OLE D ...

  2. ADO.NET 快速入门(十五):ADO 应用转换为 ADO.NET

    这是一个已经移植到 .NET 的 ADO 应用的例子.也演示了单向.只读.快速 DataReader 的使用.它演示如何使用 DataView 类从 DataSet 获取一个 Table 和 操作一个 ...

  3. ADO.NET 快速入门(七):使用数据库事务

    数据库事务用于控制数据提交到数据库.例如,在标准的账户程序,账户的借贷必须同时完成.由于电脑偶尔发生故障(电力中断.网络中断,等等),可能有些记录被更新或者添加,但是另外一些没有.为了避免这些情况,可 ...

  4. ADO.NET 快速入门(一):ADO.NET 概述

    ADO.NET 概述 ADO.NET是改进的ADO数据访问模型用于开发可扩展应用程序.他是专门为可伸缩性.无状态和XML核心的web而设计的.   ADO.NET使用一些ADO对象,如Connecti ...

  5. ADO.NET 快速入门(十四):使用 SQL Server 检索数据

    SqlDataReader 类提供了一种从数据源读取数据记录只进流的方法.如果想使用 OLE DB 接口的数据库或者 SQL Server7.0 之前的版本,请参考文章:使用 OLE DB 检索数据. ...

  6. ADO.NET 快速入门(十三):使用 OLE DB 检索数据

    OleDbDataReader 类提供了一种从数据源读取数据记录只进流的方法.如果想使用 SQL Server 7.0 或者更高版本,请参考文章:使用 SQL Server 检索数据.   OleDb ...

  7. ADO.NET 快速入门(八):处理 Errors

    除了 Try/Catch 和 Exceptions 以外,新的 ADO.NET 数据框架也允许在 DataSet 的每行数据添加错误信息.如果 Updates 或者其他操作失败,SqlDataAdap ...

  8. ADO.NET 快速入门(六):读写 XML

    ADO.NET 和 DataSet 可以读写 XML Schema 和 XML.获取更多信息,请参考 How do I...Use XML and the DataSet?   DataSet 的 S ...

  9. ADO.NET 快速入门(二):执行命令

    Commands发出针对数据库的数据存储动作.例如,你可以执行一条命令插入或者删除数据.获取更多从数据库移动数据相关的信息,请参考“Update a Database from a DataSet”. ...

随机推荐

  1. $http POST 转字符串

  2. oracle 回收站管理

    oracle10g,在pl/sql中选中删除后会出现类似:BIN$nJ5JuP9cQmqPaArFei384g==$0的表. 1.查看回收站 select * from user_recyclebin ...

  3. 【JSP】JSP检查字符串是否为数字

    //判断是否是正整数 function IsNum(s) { if(s!=null){ var r,re; re = /\d*/i; //\d表示数字,*表示匹配多个数字 r = s.match(re ...

  4. [转] C#操作EXCEL,生成图表的全面应用

    gailzhao 原文 关于C#操作EXCEL,生成图表的全面应用 近来我在开发一个运用C#生成EXCEL文档的程序,其中要根据数据生成相应的图表,该图表对颜色和格式都有严格的要求,在百度和谷歌中搜索 ...

  5. android电池信息简介

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  6. HDU-1438 钥匙计数之一

    http://acm.hdu.edu.cn/showproblem.php?pid=1438                                钥匙计数之一 Time Limit: 200 ...

  7. HDU-4861 Couple doubi

    http://acm.hdu.edu.cn/showproblem.php?pid=4861 Couple doubi Time Limit: 2000/1000 MS (Java/Others)   ...

  8. [Tommas] 一种有效的测试策略(转)

    在最近的一个大型项目中,我们在早期就定下了一个目标:不会在软件中使用大量QA人员专注于手工测试.通过手工测试发现bug极其耗时且成本高昂,这促使团队尝试尽可能的将质量内嵌到产品内部.但这并不意味着手工 ...

  9. 【转】ASP.NET网站怎么发布web项目程序和怎么部署

    如何发布: http://jingyan.baidu.com/article/ca00d56c7303ffe99eebcfb0.html windows7 iis安装与配置 如何部署: http:// ...

  10. 《Python CookBook2》 第一章 文本 - 过滤字符串中不属于指定集合的字符 && 检查一个字符串是文本还是二进制

    过滤字符串中不属于指定集合的字符 任务: 给定一个需要保留的字符串的集合,构建一个过滤函数,并可将其应用于任何字符串s,函数返回一个s的拷贝,该拷贝只包含指定字符集合中的元素. 解决方案: impor ...