DataTable的AcceptChanges()方法和DataRow的RowState属性

article/2025/9/23 3:18:23

这个属性是一个只读属性的枚举类型,一共有五个值,Detached,Unchanged,Added,Deleteed,Modified,

属性名备注
Detached1已创建该行,但是该行不属于该表,要么刚刚创建该行,还未添加到表中,
要么这行被调用了Remove()或者RemoveAt()方法
Unchanged2自上次调用AcceptChanges()方法后,该行未改变
Added4已经添加到表中,但是AcceptChanges()方法还未调用
Deleted8该行已通过Delete()被删除,但是AcceptChanges()方法还未调用
Modified16该行已被修改,但AcceptChanges 尚未调用

这个状态标志位有很大的作用,它用于被SqlCommandBuilder翻译T-Sql语句(但仅仅是单表而已),当然还要有主键,如果数据表中没有主键,将会报错“对于不返回任何键列信息的 SelectCommand,不支持 UpdateCommand 的动态 SQL 生成。”

当DataTable调用AcceptChange()这个方法后,所有 AddedModified 行都变为 Unchanged, ,和 Deleted 行也被删除。

AcceptChanges

所以这个AcceptChange()一定要在DataAdapter调用Update()方法后才调用,不然SqlCommandBuilder就会找不到被修改的行,这样一来,DataSet中的表被修改了,但是Update到数据库时,却不能同步修改。

举个例子来说明问题:

--建库建表语句
create database student;
use student;
create table student(sname varchar(10) not null,sno int not null,sage int not null,ssex varchar(2) not null
);
alter table studentadd constraint PK_sno primary key (sno),constraint CK_ssex check(ssex = '' or ssex = ''),constraint CK_sage check(sage > 8 and sage < 40)insert into student values('张三', 103, 23, '');
insert into student values('李四', 104, 24, '');
insert into student values('王五', 105, 25, '');
insert into student values('赵六', 106, 26, '');
insert into student values('朱七', 107, 27, '');
select * from student;

C#中的代码:

public static void AdapterAndSqlCommand(){//第一步:获取数据库配置信息String connStr = ConfigurationManager.ConnectionStrings["connStr"].ToString();//这里是索引器的使用========//第二步:构建SqlCommand查询语句SqlCommand command = new SqlCommand("select * from student;");command.Connection = new SqlConnection(connStr);//第三步:创建SqlDataAdapterSqlDataAdapter adapter = new SqlDataAdapter(command);//第四步:创建DataTableDataTable dataTable = new DataTable();//第五步:填充数据
            adapter.Fill(dataTable);//修改第一行数据中的姓名dataTable.Rows[0]["sname"] = "小红";//这里是索引器的使用===========================Console.WriteLine("调用AcceptChanges方法之前第一行的RowState属性 :" + dataTable.Rows[0].RowState);//这里是调用AcceptChanges方法之前该行的RowState属性//注意:我是在Update之前调用的AcceptChanges方法
            dataTable.AcceptChanges();Console.WriteLine("调用AcceptChanges方法之后第一行的RowState属性 :" + dataTable.Rows[0].RowState);//这里是调用AcceptChanges方法之后该行的RowState属性SqlCommandBuilder scb = new SqlCommandBuilder(adapter);adapter.Update(dataTable);//这个地方我特意没有写dataTable.GetChanges(),因为写了的话就不能展现这个错误了,会在该行报出空参数异常,如果不知道不能提前调用AcceptChanges方法的话,很难发现是AcceptChanges的错误,因为报的错误不是AcceptChanges那行,而是Update这行。//注意:我是在Update之后调用的//dataTable.AcceptChanges();//下面是一个遍历输出datatable中的数据foreach(DataRow row in table.Rows){//这里在遍历的时候也会判断一下RowState行标志位,已经调用了Delete()方法的行,不会被打印Console.WriteLine(row[0] + ", " + row[1] + ", " + row[2] + ", " + row[3]);//索引器的使用======================}}

(对于上面代码中的红色字,dataTable.GetChanges()是对程序的一种优化)

运行之后控制台输出:

AcceptChanges2

很明显,调用之前和之后,RowState由Modified变为了Unchanged了,让我们来看一下数据库中的张三有没有变为小红?

AcceptChange1

      有人会开始骂人了恶魔恶魔,怎么张三还在?我修改了呀,而且我还保存了(也就是调用了AcceptChanges方法),根据控制台的打印输出,内存里面的数据的确改了,怎么数据库中没有改变呢?

      那是因为我上面讲的SqlCommandBuilder是根据行的状态RowState和主键来生成sql语句的,但是调用AcceptChanges方法又会改变RowState【所有 AddedModified 行都变为 Unchanged, ,和 Deleted 行也被删除。】,那SqlCommandBuilder就无法对该行生成sql语句了,数据库当然不会修改数据诺。

正确的做法是在DataAdapter的Update方法调用之后再调用DataTable的AcceptChanges方法,这样才能保证内存中的数据和数据库的数据一致。

我们把第一个dataTable.AcceptChanges(); 给注释掉,打开第二个。

public static void AdapterAndSqlCommand(){//第一步:获取数据库配置信息String connStr = ConfigurationManager.ConnectionStrings["connStr"].ToString();//这里是索引器的使用==============//第二步:构建SqlCommand查询语句SqlCommand command = new SqlCommand("select * from student;");command.Connection = new SqlConnection(connStr);//第三步:创建SqlDataAdapterSqlDataAdapter adapter = new SqlDataAdapter(command);//第四步:创建DataSet和DataTableDataSet dataSet = new DataSet();DataTable dataTable = new DataTable();//第五步:填充数据
            adapter.Fill(dataTable);//修改第一行数据中的姓名dataTable.Rows[0]["sname"] = "小红";//这里是索引器的使用===================Console.WriteLine("调用AcceptChanges方法之前第一行的RowState属性 :" + dataTable.Rows[0].RowState);//这里是调用AcceptChanges方法之前该行的RowState属性//注意:我是在Update之前调用的AcceptChanges方法//dataTable.AcceptChanges();         SqlCommandBuilder scb = new SqlCommandBuilder(adapter);adapter.Update(dataTable);//注意:我是在Update之后调用的
            dataTable.AcceptChanges();Console.WriteLine("调用AcceptChanges方法之后第一行的RowState属性 :" + dataTable.Rows[0].RowState);//这里是调用AcceptChanges方法之后该行的RowState属性//下面是一个遍历输出datatable中的数据foreach(DataRow row in table.Rows){Console.WriteLine(row[0] + ", " + row[1] + ", " + row[2] + ", " + row[3]);//这里也是索引器的使用========}}

这下数据中的数据就同步了:

AcceptChanges4

所以AcceptChanges()要在Update()方法之后调用,而且当Update()之后,最好调用下AcceptChanges(),是为了将DataState重置,

以免下次Update()会出现

再加一句,DataView也有相似的属性。

【点击此处回到主页】

转载于:https://www.cnblogs.com/daimajun/p/6537958.html


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

相关文章

AcceptChanges()和RejectChanges()原理

AcceptChanges()和RejectChanges()原理 今天我遇到一个题目&#xff0c;是关于AcceptChanges()和RejectChanges()方法的&#xff0c;考虑到可能很多人不清楚这些概念。 所以拿出来讲讲。由这个问题我们也深入了解一下这两个方法。 为了不在显示略文时显示出代码来&#xff0c;我…

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

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

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

计算机病毒也是要生成的,那么计算机病毒代码有些什么呢?下面由学习啦小编给你做出详细的计算机病毒代码介绍!希望对你有帮助! 计算机病毒代码介绍一: 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服务器会直…