当前位置: 移动技术网 > IT编程>开发语言>c# > C#获取变更过的DataTable记录的实现方法

C#获取变更过的DataTable记录的实现方法

2019年07月18日  | 移动技术网IT编程  | 我要评论

本文实例讲述了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]);
}
}

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网