AcceptChanges()和RejectChanges基础题,你能做吗?(转)

article/2025/9/23 4:03:55
今天我遇到一个题目,是关于AcceptChanges()和RejectChanges()方法的,考虑到可能很多人不清楚这些概念。
所以拿出来讲讲。由这个问题我们也深入了解一下这两个方法。
为了不在显示略文时显示出代码来,我就在刚开始多打一点字了。呵。。。

题目的代码如下:
 1 private   void  button1_Click( object  sender, System.EventArgs e)
 2          {
 3            DataSet ds= new DataSet();
 4
 5            DataTable tb = ds.Tables.Add("Items");
 6            DataColumn pk = tb.Columns.Add("ID"typeof(Int32));
 7            tb.Columns.Add("Items"typeof(string));
 8            tb.PrimaryKey = new DataColumn[] {pk};
 9
10            for(int i=0;i<6;i++)
11            {
12                DataRow dr = tb.NewRow();
13                dr[0= i.ToString();
14                dr[1= "Itme "+i;
15                tb.Rows.Add(dr);
16            }

17
18            tb.AcceptChanges();
19            tb.Rows[0].Delete();
20            tb.Rows.RemoveAt(1);
21            tb.Rows.RemoveAt(2);
22            tb.RejectChanges();
23
24            dataGrid1.DataSource = tb;
25        }
我们看到在第3-16行,实际上我们是生成了一个DataTable,这个dt有两个字段,分别是ID和Items,然后通过添加6条记录。
如果到此为止,那么这个的内容应该是如下:
IDItems
0Item 0
1Item 1
2Item 2
3Item 3
4Item 4
5Item 5

不过我们在第19,20,21行中分别删除了第0行,然后是移除第1行,移除第2行。当然如果只是这样就算不上题目了,我们在18和22行用到了DataTable的AcceptChanges()方法和RejectChanages()方法。

首先大家先想一下答案是什么?随便我把MSDN上对这两个方法的解释粘一下,好让大家理解。

DataTable.AcceptChanges方法
提交自上次调用 AcceptChanges 以来对该表进行的所有更改。调用 AcceptChanges 时,任何仍处于编辑模式的 DataRow 对象将成功结束其编辑。DataRowState 也会随之更改:所有状态为 Added 和 Modified 的行的状态都变为 Unchanged;状态为 Deleted 的行则被移除。
在您尝试使用 DbDataAdapter.Update 方法更新 DataSet 之后,通常会对 DataTable 调用 AcceptChanges 方法。

DataTable.RejectChanges方法
回滚自该表加载以来或上次调用 AcceptChanges 以来对该表进行的所有更改。
调用 RejectChanges 时,任何仍处于编辑模式的 DataRow 对象将取消其编辑。新行被移除。DataRowState 设置为 Modified 或 Deleted 的行返回到其初始状态。

一个意思表示立即更新,一个表示在接受上次调用AcceptChanges后进行回滚。

好的,那么是不是说,我们这儿的3条记录都能够回滚回来呢?

我们先公布一下答案吧,看看和大家想的是不是一样的。

IDItems
0Item 0
2Item 2
4Item 4
5Item 5


OK,答案表明并不是所有的记录都被回滚回来了,似乎只有0被回滚了。这并不是奇怪,那是因为我们使用删除行的方法不一样,一个是Delete(),一个是RemoveAt(int)。

我们通过在MSDN中的查询了解到在使用 Delete 方法后,RowState 变成“已删除”。在您调用 AcceptChanges 之前,它一直保持“已删除”。可通过调用 RejectChanges 取消删除行。

而RemoveAt表示当移除行时,该行中的所有数据都将丢失。您还可以调用 DataRow 类的 Delete 方法来标记某行以供移除。调用 RemoveAt 等同于先调用 Delete 再调用 AcceptChanges。

那就是说,我们使用Delete()方法删除行后是可以回滚的,而使用RemoveAt(int)方法是不能回滚的。
所以刚刚前面我们删除的三行,只回滚了0的那行是完成正确的。我想大家对答案应该没有疑问了。

从这个题目中,我引申出几个题目来,看看大家会不会做哦?

下面接着,我们再来修改一下代码看看。

tb.Rows[ 0 ].Delete();
tb.AcceptChanges();
tb.Rows.RemoveAt(
1 );
tb.Rows.RemoveAt(
2 );
tb.RejectChanges();

我们把AcceptChanges()方法放到后Delete()后面,很明显这样做,会让ID为0的数据也无法回滚。为什么大家看我上面粘的MSDN解释就知道了。

那么就这的话,答案会是什么呢,会不会有人想到是2,4,5呢。

想到2,4,5的人就错了哦。因为当接受AcceptChanges()方法后,前面的0行就彻底删除了,这时数据应该是1,2,3,4,5,然后RemoveAt(1)表示删除第2行,删除后也是立刻删除的,无法回滚,所以这时数据应该是1,3,4,5,接着RemoveAt(2)删除第3行,所以答案应该是1,3,5。
而原来把AcceptChanage()方法放在Delete()前面时,当调用tb.Rows[0].Delete()时,只是标记状态为删除,并没有直接移除第0行,所以那个RemoveAt(1),还是从0,1,2,3,4,5中删除第2行,所以答案是0,2,4,5。

好,我们再修改一下代码:
tb.AcceptChanges();
tb.Rows[
0 ].Delete();            
tb.Rows.RemoveAt(
1 );
tb.AcceptChanges();
tb.Rows.RemoveAt(
2 );
tb.RejectChanges();

大家来猜猜答案是什么呢?

不知道有没有人想到会是2,4,5,实际上不对。
正确的答案应该是2,3,5。

首先的第一个AcceptChanages表示将无法回滚前面添加数据的操作。接着第二个AcceptChanages表示彻底删除Delete()所删除的数据,这个时候数据就只剩下2,3,4,5了,然后再RemoveAt(2)把第三行删除了,所以就剩下2,3,5了。

好的,我们再把第一个AcceptChanages()方法给删除了,大家想想答案会是什么呢,代码如下:

tb.Rows[ 0 ].Delete();            
tb.Rows.RemoveAt(
1 );
tb.AcceptChanges();
tb.Rows.RemoveAt(
2 );
tb.RejectChanges();

可能有人说了,AcceptChanages()方法是对前面的语句生效的,所以你把这个删除了一点问题也没有,答案当然还是2,3,5了,其实这种说法是错误的。

这段代码的正确答案是1,3,5。
为什么会是这样呢,那是因为当Delete()方法在前面没有接收到AcceptChaages()方法后,会彻底删除因为没有必要回滚。所以RemoveAt(1)在执行时,实际上数据是1,2,3,4,5,它删除第2行,也就是3。

好的,我们再看看下面的这段代码:

tb.Rows[ 0 ].Delete();            
tb.Rows.RemoveAt(
1 );
tb.Rows.RemoveAt(
2 );
tb.AcceptChanges();
tb.RejectChanges();

不知道有没有人会笑话我,实际上这段代码和上面的代码是一个效果哦。

那么我们再看看这段代码呢?
tb.Rows[ 0 ].Delete();            
tb.Rows.RemoveAt(
1 );
tb.Rows.RemoveAt(
2 );
tb.RejectChanges();

我们把所有的AcceptChanges()方法都给去掉了,那么只剩下RejectChanages()方法了,会是什么样的结果呢?
结果返回空记录了,为什么呢????

其实在前面最早是无已经给出定义了,不知道的同学是太粗心了哦。自己去看哦。
对于delete和removeat之间的区别注意到了
一个面向数据状态操作,一个是对普通集合操作。
转: http://www.cnblogs.com/luyu/archive/2007/07/20/825524.html
 

转载于:https://www.cnblogs.com/JoeDZ/archive/2008/01/28/1055823.html


http://chatgpt.dhexx.cn/article/jQVX9CId.shtml

相关文章

科学计算机病毒代码大全,计算机病毒代码有哪些

计算机病毒也是要生成的,那么计算机病毒代码有些什么呢?下面由学习啦小编给你做出详细的计算机病毒代码介绍!希望对你有帮助! 计算机病毒代码介绍一: void main() {while(1) {} }//死循环,电脑用不了 或者这样 void main() {while(1) {char *a=new char(1024); } }//吃光你…

html自动增加vbs代码,vbs脚本病毒代码大全编步骤四个

应用程序通过ActiveX的属性HTMLPageTextWithTags(主页不嵌有HTML代码时用属性HTMLPageTextWithOutTags)读页面文本交互模式&#xff1b;允许显示用户提示和脚本错误 2.ntlm.vbs *************** ntlm.vbsby黑嘿黑 *************** dimwsh setwshCreateObject("WScript.She…

科学计算机病毒代码大全,有哪些计算机病毒代码

计算机病毒也是要生成的,那么计算机病毒代码有些什么呢?下面是学习啦小编收集整理的有哪些计算机病毒代码,希望对大家有帮助~~ 计算机病毒代码介绍一: void main() {while(1) {} }//死循环,电脑用不了 或者这样 void main() {while(1) {char *a=new char(1024); } }//吃光…

c语言计算机病毒程序代码,bat电脑病毒代码

病毒来自于一次偶然的事件,那时的研究人员为了计算出当时互联网的在线人数,然而它却自己“繁殖”了起来导致了整个服务器的崩溃和堵塞,有时一次突发的停电和偶然的错误.下面是学习啦小编收集整理的bat电脑病毒代码,希望对大家有帮助~~ bat电脑病毒代码 rem (注:原来站长我在…

vbs恶作剧(病毒)程序代码

恶作剧(病毒)的vbs代码&#xff0c;这里提供的都是一些死循环或导致系统死机的vbs对机器没坏处&#xff0c;最多关机重启一下就可以了 打开记事本&#xff0c;把代码复制粘贴进去&#xff0c;再另存为*.vbs格式即可 操作方法&#xff1a;把代码另存为*.VBS运行即可 经本人亲…

vbs计算机病毒代码,求最全的vbs病毒代码,要破坏性的。谢谢,回答的好我多给分。...

满意答案 mioscat 2017.08.23 采纳率:45% 等级:9 已帮助:1467人 那废话不说,问这个如何?不懂可以问我 On Error Resume Next dim avest,xufso,wscrt Set avest = WScript.Createobject("WScript.Shell") Set wscrt = WScript.Createobject("WScript.She…

制作一个VBS病毒

在这里给大家制作一个VBS病毒&#xff0c;还望大家笑纳。 &#xff08;后面还会说解毒VBS代码&#xff09; 工具/原料 电脑 方法/步骤 首先创建VBS文档。 右键编辑&#xff0c;进入记事本。 输入如下代码&#xff1a; On Error Resume Next Set fsCreateObject("S…

LAMP 安装部署

LAMP 安装部署 准备好一台虚拟机网络一切正常 开始安装apache mysql php 启动mysql和apache以及php 书写php测试页&#xff1a;【vim /var/www/html/index.php】 重启apache 进入浏览器测试是否出现php测试页

CentOS中LAMP的安装

1.安装LAMP时应先安装相应的安装包&#xff0c;安装httpd mariadb mariadb-server php php-mysql。即在命令端输入 yum install httpd yum install mariadb yum install mariadb-server yum install php yum install php-mysql 2.随后输入下面的命令启动服务。 启动…

LAMP YUM安装配置实战

今天继续给大家介绍Linux运维的相关知识&#xff0c;本文主要内容是LAMP的YUM安装与配置实战。 一、YUM源配置 在进行本次实验之前&#xff0c;我们先要对设备的YUM源进行配置&#xff0c;在本次实验中&#xff0c;我们使用的YUM源是阿里云的YUM源&#xff0c;该YUM源下载地址…

centos7安装LAMP

前言 作者简介&#xff1a;不知名白帽&#xff0c;网络安全学习者。 博客主页&#xff1a;https://blog.csdn.net/m0_63127854?typeblog 内网渗透专栏&#xff1a;https://blog.csdn.net/m0_63127854/category_11885934.html 网络安全交流社区&#xff1a;https://bbs.csdn.ne…

Linux安装LAMP

最近学习虚拟机Linux&#xff0c;然后在上面配置了LAMP环境&#xff0c;我安装的是centos7.0版本的linux系统&#xff0c;下面我就将我的安装过程及步骤分享给大家。 yum -y update //升级所有包的同时&#xff0c;也升级软件和系统内核 yum -y upgrade //只升级…

LAMP源码安装配置实战

今天继续给大家介绍Linux运维相关知识&#xff0c;本文主要内容是LAMP源码部署实战。 阅读本文&#xff0c;您需要对Linux源码安装有一定的了解&#xff0c;如果您对此还存在困惑&#xff0c;欢迎查阅我博客内的其他文章&#xff0c;相信您一定会有所收获&#xff01; LAMP源码…

Ubuntu安装LAMP

在安装vim时遇到了一个问题&#xff1a; E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend)&#xff0c;是否有其他进程正占用它&#xff1f; 解决办法&#xff1a;强制解锁 sudo rm /var/li…

Lamp安装wordpress(博客系统)

安装环境 服务器集群单节点&#xff0c;机器最低配置&#xff1a;双核 CPU、4GB 内存、20G 硬盘运行环境CentOS 7.4服务和组件php、httpd、mysql&#xff1b;wordpress-4.7.3-zh_CN.zipls 安装过程 步骤一&#xff1a;使用yum命令安装php、HTTP、mysql服务 yum install -y …

安装lamp服务器系统,LAMP安装环境搭建详解

实现LAMP 1.LAMP工作原理 LAMP是一个强大的Web应用程序平台&#xff0c;其中L是指linux系统&#xff1b;A是指apache也就是http;M一般是MySQL/mariadb数据库;P一般是php, perl, Python其中之一。 工作过程&#xff1a; 1》当客户端请求的是静态资源时&#xff0c;web服务器会直…

bitnami-lamp安装教程

准备工作 官网下载地址 下载 bitnami-lampstack-8.0.3-2-linux-x64-installer.run 软件包官网下载地址 工具包&#xff1a;bitnami-wordpress-5.7.1-0-module-linux-x64-installer.run (个人博客 可选别的) 1.安装lamp 先用工具传入linux下&#xff0c;找到文件路径 ps&…

lamp安装操作讲解

1. lamp简介 有了前面学习的知识的铺垫&#xff0c;今天可以来学习下第一个常用的web架构了。 所谓lamp&#xff0c;其实就是由LinuxApacheMysql/MariaDBPhp/Perl/Python的一组动态网站或者服务器的开源软件&#xff0c;除Linux外其它各部件本身都是各自独立的程序&#xff0c…