C#获取变更过的DataTable记录的实现方法
本文实例讲述了C#获取变更过的DataTable记录的实现方法,是一个非常实用的功能!具体实现方法如下:
首先DataTable可以看做是一个物理表的内存式存储,每一个DataRow都有一个属性叫做RowState。因此任意一行中某一个字段发生改变,那么整个DataRow的RowState也就发生了改变。RowState是一个枚举,其中包含5个内容:
1)Detached:未被附加(一般刚创建的DataRow,或者已经被Remove或者RemoveAt,或者Delete之后调用过AcceptChanges方法的行,或者是WinForm控件DataGridView默认设置下最后那个永远也留出的空行……都被自动设置该状态)。
2)Added:刚添加的新行。
3)Deleted:刚被删除的行(注意:这里只是从内存表中删除,物理数据表中尚未删除,此时你无法直接去访问该行的某个字段的内容!)。
4)Modified:刚被修改的行。
5)Unchanged:原来的行。
DataTable批量通过内部遍历这些行的RowState,然后借助DataAdapter的CRUD方法根据这些State调用不同的语句批量更新到真实数据表中。
如果要取消可以调用DataTable的RejectChanges方法,确认从内存表中删除才调用AcceptChanges方法。
通过DataRow的RowState最多只能判断哪行被修改,那么调用不同的语句如何进行更新呢?比如说我要更新一行,肯定使用update……where语句,where后面的条件是一个旧值,set是一个新值,如何获取旧值呢?
.NET中的DataColumn有一个属性叫做DataRowVersion,这个属性有4个:
1)Current:当前数值(DataRowState=Deleted时候无效)。
2)Original:原来数值(DataRowState=Added或者Unchanged时候无效)。
3)Proposed:建议数值(仅在DataRowState=Detached的时候有效)。
3)Default:默认数值(DataRowState=Added,Modified或者Unchanged时,等于Current;如果DataRowState=Deleted,等于Original;如果DataRowState=Detached,那么等于Proposed)。该属性可以自动调整,你吃不准哪一行的属性,一律可以使用这个属性获取特定字段的内容。
根据这个法则,我们再结合微软DataTable的GetChanges方法轻易可以获取做了任意变更的源数据和现实数据,具体C#实现代码如下:
DataTable dt = new DataTable();
dt.Columns.Add("Id");
for (int i = 1; i < 11; i++)
{
dt.Rows.Add(i);
}
dt.AcceptChanges();
//添加第十一行
dt.Rows.Add(11);
//修改第二行
dt.Rows[1][0] = 21;
//删除第一行
dt.Rows[0].Delete();
//检索情况
DataTable cdt = dt.GetChanges();
for (int i = 0; i < cdt.Rows.Count; i++)
{
if (cdt.Rows[i].RowState == DataRowState.Deleted)
{
Console.WriteLine("删除的行索引{0},原来数值是{1}", i, cdt.Rows[i][0, DataRowVersion.Original]);
}
else if (cdt.Rows[i].RowState == DataRowState.Modified)
{
Console.WriteLine("修改的行索引{0},原来数值是{1},现在的新数值{2}", i, cdt.Rows[i][0, DataRowVersion.Original], cdt.Rows[i][0, DataRowVersion.Current]);
}
else if (cdt.Rows[i].RowState == DataRowState.Added)
{
Console.WriteLine("新添加行索引{0},数值是{1}", i, cdt.Rows[i][0, DataRowVersion.Current]);
}
}
C#获取变更过的DataTable记录的实现方法的更多相关文章
- mysql获取group by的总记录行数方法
mysql获取group by内部可以获取到某字段的记录分组统计总数,而无法统计出分组的记录数. mysql的SQL_CALC_FOUND_ROWS 使用 获取查询的行数 在很多分页的程序中都这样写: ...
- 实训任务05 MapReduce获取成绩表的最高分记录
实训任务05 MapReduce获取成绩表的最高分记录 实训1:统计用户纺问次数 任务描述: 统计用户在2016年度每个自然日的总访问次数.原始数据文件中提供了用户名称与访问日期.这个任务就是要获取 ...
- 获取呈现在格表(table)记录的主键
用mouse点击表格(table)的行或是批定列,获取记录的主键值.在ASP.NET的MVC应用程序中,已经没有办法象ASP.NET的Data控件一样,如GridView,DataList和Repea ...
- 关于ExtJS Row editing 行编辑 后 获取 编辑后记录值 的方法
listUsersGrid.on('edit', function(editor, e) { var pass = editor.record.data.password; editor.record ...
- C#中DataTable中的Compute方法使用收集
原文: C#中DataTable中的Compute方法使用收集 Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式,关于Expression的详 ...
- JavaScript获取客户端计算机硬件及系统等信息的方法
JavaScript获取客户端计算机硬件及系统等信息的方法 JavaScript 获取客户端计算机硬件及系统信息 通过WMI来实现获取客户端计算机硬件及系统信息: function getSysInf ...
- 用JQuery中的Ajax方法获取web service等后台程序中的方法
用JQuery中的Ajax方法获取web service等后台程序中的方法 1.准备需要被前台html页面调用的web Service,这里我们就用ws来代替了,代码如下: using System; ...
- mysql随机查询记录的高效率方法
mysql使用rand随机查询记录的高效率方法 一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了. 但是真 ...
- Sql Server删除数据表中重复记录 三种方法
本文介绍了Sql Server数据库中删除数据表中重复记录的方法. [项目]数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除![分析]1 ...
随机推荐
- [物理学与PDEs]第1章第9节 Darwin 模型 9.3 Darwin 模型
1. $\Omega$ 中 ${\bf A}={\bf A}_T+{\bf A}_L$, 其中 $\Div{\bf A}_T=0$, $\rot{\bf A}_L={\bf 0}$. 若 $$\bex ...
- Groovy 设计模式 -- 责任链模式
Chain of Responsibility Pattern http://groovy-lang.org/design-patterns.html#_chain_of_responsibility ...
- vue-cli 构建
文章链接:https://blog.csdn.net/wulala_hei/article/details/85000530
- SQLserver 数据库高版本无法还原到低版本的数据解决方法
sql server 数据库的版本只支持从上往下兼容.即高版本可以兼容低版本 .低版本不能兼容低版本.通常我们在开发时会用比较高的版本.但是部署到客户那边可能他们的数据库版本会比较低. 我们可以通过导 ...
- L1-Day4
L1-Day4 1.这消息使她非常悲伤. [我的翻译]The message makes she very sad. [标准答案]The news made her very sad. [对比分析]( ...
- 330 div+css Experience
今天学习的div,感觉对编辑html更为方便快捷,但还是需要多练,多熟悉一下思路和逻辑方式 越来越感觉,代码不是重要的,重要的是方向和思路,am的float clearfloat 及属性,还有over ...
- mysql 备份报错mysqldump: [Warning] Using a password on the command line interface can be insecure.
-------------------------------------------------------------------------------- mysql 备份报错mysqldump ...
- Monkey自动化脚本(一)
1.Monkey简介 Monkey-猴子,通过Monkey程序模拟用户触摸屏幕.滑动Trackball. 按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常,主要用于Android ...
- echarts将图表Y坐标刻度设置成只显示整数
echarts的配置项中没有直接将坐标刻度强制设为整数的选项,但可以通过minInterval属性将刻度以整数形式显示,在配置项的yAxis对象中添加属性: minInterval: 1 表示将刻度的 ...
- python数据类型一:字符串
Python 字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hello W ...