该主题说明了如何使用 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. CURL使用

    最近开发的游戏之中需要用到大量的客户端与服务端交互的 东西,开始参考大量的技术文章,感觉是五花八门,眼花缭乱.到后面,真正感受到,学习一门技术,还是需要从它最开始的东西开始学起,要不就是一头雾水,这种 ...

  2. ti processor sdk linux am335x evm Makefile hacking

    # # ti processor sdk linux am335x evm Makefile hacking # 说明: # 本文主要对TI的sdk中的Makefile脚本进行解读,是为了了解其工作机 ...

  3. PS流格式

    概念: 将具有共同时间基准的一个或多个PES组合(复合)而成的单一的数据流称为节目流(Program Stream). ES是直接从编码器出来的数据流,可以是编码过的视频数据流,音频数据流,或其他编码 ...

  4. 【Java集合框架】规则集--Set

    集合: Java主要支持三种: 1.规则集(Set) 用于存储一组不重复的元素 2.线性表(List) 用于存储一个由元素构成的有序集合 3.队列(Queue) 同与数据结构中的队列,存储用先进先出的 ...

  5. HDU 5878 I Count Two Three

    I Count Two Three Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  6. [Papers]NSE, $\pi$, Lorentz space [Suzuki, NA, 2012]

    $$\bex \sen{\pi}_{L^{s,\infty}(0,T;L^{q,\infty}(\bbR^3))} \leq \ve_*, \eex$$ with $$\bex \frac{2}{s} ...

  7. Listview异步加载之优化篇

    异步加载图片基本思想: 1.      先从内存缓存中获取图片显示(内存缓冲) 2.      获取不到的话从SD卡里获取(SD卡缓冲) 3.      都获取不到的话从网络下载图片并保存到SD卡同时 ...

  8. hdu 1544 水题

    水题 /* * Author : ben */ #include <cstdio> #include <cstdlib> #include <cstring> #i ...

  9. The Automated Testing Handbook 自动化测试手册简介

    Learn what works, what doesn't and why. The Automated Testing Handbook is a practical blueprint for ...

  10. 深入学习Android有关网络连接的内容

    基于实际项目中碰到的些许问题,开始重新深入学习Android网络连接有关知识. Android的4.1.2版本的AndroidHttpClient模块setSoTimeout之后实际超时时间和设置的时 ...